- Contract name:
- BatchAuction
- Optimization enabled
- true
- Compiler version
- v0.6.12+commit.27d51765
- Optimization runs
- 200
- Verified at
- 2023-12-15T01:28:21.105995Z
contracts/Auctions/BatchAuction.sol
pragma solidity 0.6.12;pragma experimental ABIEncoderV2;// Batch Auction//// An auction where contributions are swaped for a batch of tokens pro-rata//// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// The above copyright notice and this permission notice shall be included// in all copies or substantial portions of the Software.//// ---------------------------------------------------------------------// SPDX-License-Identifier: GPL-3.0// ---------------------------------------------------------------------import "../OpenZeppelin/utils/ReentrancyGuard.sol";import "../Access/IHubAccessControls.sol";import "../Utils/SafeTransfer.sol";import "../Utils/BoringBatchable.sol";import "../Utils/BoringMath.sol";import "../Utils/BoringERC20.sol";import "../Utils/Documents.sol";import "../interfaces/IPointList.sol";import "../interfaces/IIHubMarket.sol";/// @notice Attribution to delta.financial/// @notice Attribution to dutchswap.comcontract BatchAuction is IIHubMarket, IHubAccessControls, BoringBatchable, SafeTransfer, Documents, ReentrancyGuard {using BoringMath for uint256;using BoringMath128 for uint128;using BoringMath64 for uint64;using BoringERC20 for IERC20;
contracts/Access/IHubAccessControls.sol
// SPDX-License-Identifier: GPL-3.0-onlypragma solidity 0.6.12;import "./IHubAdminAccess.sol";/*** @notice Access Controls* @author Attr: BlockRocket.tech*/contract IHubAccessControls is IHubAdminAccess {/// @notice Role definitionsbytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");bytes32 public constant SMART_CONTRACT_ROLE = keccak256("SMART_CONTRACT_ROLE");bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE");/*** @notice The deployer is automatically given the admin role which will allow them to then grant roles to other addresses*/// solhint-disable-next-line no-empty-blocksconstructor() public {}/////////////// Lookups ////////////////*** @notice Used to check whether an address has the minter role* @param _address EOA or contract being checked* @return bool True if the account has the role or false if it does not*/function hasMinterRole(address _address) public view returns (bool) {return hasRole(MINTER_ROLE, _address);}/*** @notice Used to check whether an address has the smart contract role* @param _address EOA or contract being checked* @return bool True if the account has the role or false if it does not*/function hasSmartContractRole(address _address) public view returns (bool) {return hasRole(SMART_CONTRACT_ROLE, _address);
contracts/Access/IHubAdminAccess.sol
// SPDX-License-Identifier: GPL-3.0-onlypragma solidity 0.6.12;import "../OpenZeppelin/access/AccessControl.sol";contract IHubAdminAccess is AccessControl {/// @dev Whether access is initialised.bool private initAccess;/// @notice The deployer is automatically given the admin role which will allow them to then grant roles to other addresses.// solhint-disable-next-line no-empty-blocksconstructor() public {}/*** @notice Initializes access controls.* @param _admin Admins address.*/function initAccessControls(address _admin) public {require(!initAccess, "Already initialised");require(_admin != address(0), "Incorrect input");_setupRole(DEFAULT_ADMIN_ROLE, _admin);initAccess = true;}/////////////// Lookups ////////////////*** @notice Used to check whether an address has the admin role.* @param _address EOA or contract being checked.* @return bool True if the account has the role or false if it does not.*/function hasAdminRole(address _address) public view returns (bool) {return hasRole(DEFAULT_ADMIN_ROLE, _address);}///////////////// Modifiers /////////////////
contracts/OpenZeppelin/access/AccessControl.sol
pragma solidity 0.6.12;import "../utils/EnumerableSet.sol";import "../utils/Context.sol";/*** @dev Contract module that allows children to implement role-based access* control mechanisms.** Roles are referred to by their `bytes32` identifier. These should be exposed* in the external API and be unique. The best way to achieve this is by* using `public constant` hash digests:** ```* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");* ```** Roles can be used to represent a set of permissions. To restrict access to a* function call, use {hasRole}:** ```* function foo() public {* require(hasRole(MY_ROLE, msg.sender));* ...* }* ```** Roles can be granted and revoked dynamically via the {grantRole} and* {revokeRole} functions. Each role has an associated admin role, and only* accounts that have a role's admin role can call {grantRole} and {revokeRole}.** By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means* that only accounts with this role will be able to grant or revoke other* roles. More complex role relationships can be created by using* {_setRoleAdmin}.** WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to* grant and revoke this role. Extra precautions should be taken to secure* accounts that have been granted it.*/abstract contract AccessControl is Context {
contracts/OpenZeppelin/utils/Context.sol
pragma solidity 0.6.12;/** @dev Provides information about the current execution context, including the* sender of the transaction and its data. While these are generally available* via msg.sender and msg.data, they should not be accessed in such a direct* manner, since when dealing with GSN meta-transactions the account sending and* paying for execution may not be the actual sender (as far as an application* is concerned).** This contract is only required for intermediate, library-like contracts.*/abstract contract Context {function _msgSender() internal view virtual returns (address payable) {return msg.sender;}function _msgData() internal view virtual returns (bytes memory) {this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691return msg.data;}}
contracts/OpenZeppelin/utils/EnumerableSet.sol
pragma solidity 0.6.12;/*** @dev Library for managing* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive* types.** Sets have the following properties:** - Elements are added, removed, and checked for existence in constant time* (O(1)).* - Elements are enumerated in O(n). No guarantees are made on the ordering.** ```* contract Example {* // Add the library methods* using EnumerableSet for EnumerableSet.AddressSet;** // Declare a set state variable* EnumerableSet.AddressSet private mySet;* }* ```** As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)* and `uint256` (`UintSet`) are supported.*/library EnumerableSet {// To implement this library for multiple types with as little code// repetition as possible, we write it in terms of a generic Set type with// bytes32 values.// The Set implementation uses private functions, and user-facing// implementations (such as AddressSet) are just wrappers around the// underlying Set.// This means that we can only create new EnumerableSets for types that fit// in bytes32.struct Set {// Storage of set valuesbytes32[] _values;// Position of the value in the `values` array, plus 1 because index 0
contracts/OpenZeppelin/utils/ReentrancyGuard.sol
pragma solidity 0.6.12;/*** @dev Contract module that helps prevent reentrant calls to a function.** Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier* available, which can be applied to functions to make sure there are no nested* (reentrant) calls to them.** Note that because there is a single `nonReentrant` guard, functions marked as* `nonReentrant` may not call one another. This can be worked around by making* those functions `private`, and then adding `external` `nonReentrant` entry* points to them.** TIP: If you would like to learn more about reentrancy and alternative ways* to protect against it, check out our blog post* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].*/abstract contract ReentrancyGuard {// Booleans are more expensive than uint256 or any type that takes up a full// word because each write operation emits an extra SLOAD to first read the// slot's contents, replace the bits taken up by the boolean, and then write// back. This is the compiler's defense against contract upgrades and// pointer aliasing, and it cannot be disabled.// The values being non-zero value makes deployment a bit more expensive,// but in exchange the refund on every call to nonReentrant will be lower in// amount. Since refunds are capped to a percentage of the total// transaction's gas, it is best to keep them low in cases like this one, to// increase the likelihood of the full refund coming into effect.uint256 private constant _NOT_ENTERED = 1;uint256 private constant _ENTERED = 2;uint256 private _status;constructor () internal {_status = _NOT_ENTERED;}/**
contracts/Utils/BoringBatchable.sol
pragma solidity 0.6.12;pragma experimental ABIEncoderV2;// solhint-disable avoid-low-level-calls// solhint-disable no-inline-assembly// Audit on 5-Jan-2021 by Keno and BoringCryptoimport "./BoringERC20.sol";contract BaseBoringBatchable {/// @dev Helper function to extract a useful revert message from a failed call./// If the returned data is malformed or not correctly abi encoded then this call can fail itself.function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {// If the _res length is less than 68, then the transaction failed silently (without a revert message)if (_returnData.length < 68) return "Transaction reverted silently";assembly {// Slice the sighash._returnData := add(_returnData, 0x04)}return abi.decode(_returnData, (string)); // All that remains is the revert string}/// @notice Allows batched call to self (this contract)./// @param calls An array of inputs for each call./// @param revertOnFail If True then reverts after a failed call and stops doing further calls./// @return successes An array indicating the success of a call, mapped one-to-one to `calls`./// @return results An array with the returned data of each function call, mapped one-to-one to `calls`.// F1: External is ok here because this is the batch function, adding it to a batch makes no sense// F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value// C3: The length of the loop is fully under user control, so can't be exploited// C7: Delegatecall is only used on the same contract, so it's safefunction batch(bytes[] calldata calls,bool revertOnFail) external payable returns (bool[] memory successes, bytes[] memory results) {successes = new bool[](calls.length);results = new bytes[](calls.length);for (uint256 i = 0; i < calls.length; i++) {(bool success, bytes memory result) = address(this).delegatecall(calls[i]);
contracts/Utils/BoringERC20.sol
pragma solidity 0.6.12;import "../interfaces/IERC20.sol";// solhint-disable avoid-low-level-callslibrary BoringERC20 {bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()bytes4 private constant SIG_NAME = 0x06fdde03; // name()bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)/// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string./// @param token The address of the ERC-20 token contract./// @return (string) Token symbol.function safeSymbol(IERC20 token) internal view returns (string memory) {(bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));return success && data.length > 0 ? abi.decode(data, (string)) : "???";}/// @notice Provides a safe ERC20.name version which returns '???' as fallback string./// @param token The address of the ERC-20 token contract./// @return (string) Token name.function safeName(IERC20 token) internal view returns (string memory) {(bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));return success && data.length > 0 ? abi.decode(data, (string)) : "???";}/// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value./// @param token The address of the ERC-20 token contract./// @return (uint8) Token decimals.function safeDecimals(IERC20 token) internal view returns (uint8) {(bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;}/// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations./// Reverts on a failed transfer./// @param token The address of the ERC-20 token./// @param to Transfer tokens to./// @param amount The token amount.
contracts/Utils/BoringMath.sol
pragma solidity 0.6.12;/// @notice A library for performing overflow-/underflow-safe math,/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).library BoringMath {function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");}function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, "BoringMath: Underflow");}function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b) / b == a, "BoringMath: Mul Overflow");}function div(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b > 0, "BoringMath: Div zero");c = a / b;}function to128(uint256 a) internal pure returns (uint128 c) {require(a <= uint128(-1), "BoringMath: uint128 Overflow");c = uint128(a);}function to64(uint256 a) internal pure returns (uint64 c) {require(a <= uint64(-1), "BoringMath: uint64 Overflow");c = uint64(a);}function to32(uint256 a) internal pure returns (uint32 c) {require(a <= uint32(-1), "BoringMath: uint32 Overflow");c = uint32(a);}function to16(uint256 a) internal pure returns (uint16 c) {require(a <= uint16(-1), "BoringMath: uint16 Overflow");c = uint16(a);}
contracts/Utils/Documents.sol
pragma solidity 0.6.12;pragma experimental ABIEncoderV2;/*** @title Standard implementation of ERC1643 Document management*/contract Documents {struct Document {uint32 docIndex; // Store the document name indexesuint64 lastModified; // Timestamp at which document details was last modifiedstring data; // data of the document that exist off-chain}// mapping to store the documents details in the documentmapping(string => Document) internal _documents;// mapping to store the document name indexesmapping(string => uint32) internal _docIndexes;// Array use to store all the document name present in the contractsstring[] public _docNames;// Document Eventsevent DocumentRemoved(string indexed _name, string _data);event DocumentUpdated(string indexed _name, string _data);/*** @notice Used to attach a new document to the contract, or update the data or hash of an existing attached document* @dev Can only be executed by the owner of the contract.* @param _name Name of the document. It should be unique always* @param _data Off-chain data of the document from where it is accessible to investors/advisors to read.*/function _setDocument(string calldata _name, string calldata _data) internal {require(bytes(_name).length > 0, "Zero name is not allowed");require(bytes(_data).length > 0, "Should not be a empty data");// Document storage document = _documents[_name];if (_documents[_name].lastModified == uint64(0)) {_docNames.push(_name);_documents[_name].docIndex = uint32(_docNames.length);}// solhint-disable-next-line not-rely-on-time_documents[_name] = Document(_documents[_name].docIndex, uint64(now), _data);emit DocumentUpdated(_name, _data);
contracts/Utils/SafeTransfer.sol
pragma solidity 0.6.12;contract SafeTransfer {address private constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;/// @notice Event for token withdrawals.event TokensWithdrawn(address token, address to, uint256 amount);/// @dev Helper function to handle both ETH and ERC20 paymentsfunction _safeTokenPayment(address _token, address payable _to, uint256 _amount) internal {if (address(_token) == ETH_ADDRESS) {_safeTransferETH(_to, _amount);} else {_safeTransfer(_token, _to, _amount);}emit TokensWithdrawn(_token, _to, _amount);}/// @dev Helper function to handle both ETH and ERC20 paymentsfunction _tokenPayment(address _token, address payable _to, uint256 _amount) internal {if (address(_token) == ETH_ADDRESS) {_to.transfer(_amount);} else {_safeTransfer(_token, _to, _amount);}emit TokensWithdrawn(_token, _to, _amount);}/// @dev Transfer helper from UniswapV2 Routerfunction _safeApprove(address token, address to, uint value) internal {// bytes4(keccak256(bytes('approve(address,uint256)')));// solhint-disable-next-line avoid-low-level-calls(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: APPROVE_FAILED");}/*** There are many non-compliant ERC20 tokens... this can handle most, adapted from UniSwap V2* Im trying to make it a habit to put external calls last (reentrancy)
contracts/interfaces/IERC20.sol
pragma solidity 0.6.12;interface IERC20 {function totalSupply() external view returns (uint256);function balanceOf(address account) external view returns (uint256);function allowance(address owner, address spender) external view returns (uint256);function approve(address spender, uint256 amount) external returns (bool);function name() external view returns (string memory);function symbol() external view returns (string memory);function decimals() external view returns (uint8);event Transfer(address indexed from, address indexed to, uint256 value);event Approval(address indexed owner, address indexed spender, uint256 value);function transferFrom(address from, address to, uint256 amount) external returns (bool);function permit(address owner,address spender,uint256 value,uint256 deadline,uint8 v,bytes32 r,bytes32 s) external;}
contracts/interfaces/IIHubMarket.sol
pragma solidity 0.6.12;interface IIHubMarket {function init(bytes calldata data) external payable;function initMarket(bytes calldata data) external;function marketTemplate() external view returns (uint256);}
contracts/interfaces/IPointList.sol
pragma solidity 0.6.12;// ----------------------------------------------------------------------------// Purple List interface// ----------------------------------------------------------------------------interface IPointList {function isInList(address account) external view returns (bool);function hasPoints(address account, uint256 amount) external view returns (bool);function setPoints(address[] memory accounts, uint256[] memory amounts) external;function initPointList(address accessControl) external;}
Contract ABI
[{"type":"event","name":"AddedCommitment","inputs":[{"type":"address","name":"addr","internalType":"address","indexed":false},{"type":"uint256","name":"commitment","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AuctionCancelled","inputs":[],"anonymous":false},{"type":"event","name":"AuctionDeployed","inputs":[{"type":"address","name":"funder","internalType":"address","indexed":false},{"type":"address","name":"token","internalType":"address","indexed":false},{"type":"uint256","name":"totalTokens","internalType":"uint256","indexed":false},{"type":"address","name":"paymentCurrency","internalType":"address","indexed":false},{"type":"address","name":"admin","internalType":"address","indexed":false},{"type":"address","name":"wallet","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"AuctionFinalized","inputs":[],"anonymous":false},{"type":"event","name":"AuctionPointListUpdated","inputs":[{"type":"address","name":"pointList","internalType":"address","indexed":false},{"type":"bool","name":"enabled","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"AuctionPriceUpdated","inputs":[{"type":"uint256","name":"minimumCommitmentAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AuctionTimeUpdated","inputs":[{"type":"uint256","name":"startTime","internalType":"uint256","indexed":false},{"type":"uint256","name":"endTime","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AuctionWalletUpdated","inputs":[{"type":"address","name":"wallet","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"DocumentRemoved","inputs":[{"type":"string","name":"_name","internalType":"string","indexed":true},{"type":"string","name":"_data","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"DocumentUpdated","inputs":[{"type":"string","name":"_name","internalType":"string","indexed":true},{"type":"string","name":"_data","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"PostAuctionLauncherSet","inputs":[{"type":"address","name":"postAuctionLauncher","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"previousAdminRole","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"newAdminRole","internalType":"bytes32","indexed":true}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32","indexed":true},{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"sender","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"TokensWithdrawn","inputs":[{"type":"address","name":"token","internalType":"address","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DEFAULT_ADMIN_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"MINTER_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"OPERATOR_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"SMART_CONTRACT_ROLE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"_docNames","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAdminRole","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addMinterRole","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addOperatorRole","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addSmartContractRole","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"auctionEnded","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"auctionSuccessful","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"auctionToken","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[{"type":"bool[]","name":"successes","internalType":"bool[]"},{"type":"bytes[]","name":"results","internalType":"bytes[]"}],"name":"batch","inputs":[{"type":"bytes[]","name":"calls","internalType":"bytes[]"},{"type":"bool","name":"revertOnFail","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancelAuction","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"claimed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"commitEth","inputs":[{"type":"address","name":"_beneficiary","internalType":"address payable"},{"type":"bool","name":"readAndAgreedToMarketParticipationAgreement","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"commitTokens","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"bool","name":"readAndAgreedToMarketParticipationAgreement","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"commitTokensFrom","inputs":[{"type":"address","name":"_from","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"bool","name":"readAndAgreedToMarketParticipationAgreement","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"commitments","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableList","inputs":[{"type":"bool","name":"_status","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint24","name":"","internalType":"uint24"}],"name":"fee","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"finalize","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"finalizeTimeExpired","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"finalized","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string[]","name":"","internalType":"string[]"}],"name":"getAllDocuments","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint64","name":"startTime","internalType":"uint64"},{"type":"uint64","name":"endTime","internalType":"uint64"},{"type":"bool","name":"marketFinalized","internalType":"bool"}],"name":"getBaseInformation","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"bytes","name":"_data","internalType":"bytes"}],"name":"getBatchAuctionInitData","inputs":[{"type":"address","name":"_funder","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_totalTokens","internalType":"uint256"},{"type":"uint256","name":"_startTime","internalType":"uint256"},{"type":"uint256","name":"_endTime","internalType":"uint256"},{"type":"address","name":"_paymentCurrency","internalType":"address"},{"type":"uint24","name":"_fee","internalType":"uint24"},{"type":"uint256","name":"_minimumCommitmentAmount","internalType":"uint256"},{"type":"address","name":"_admin","internalType":"address"},{"type":"address","name":"_pointList","internalType":"address"},{"type":"address","name":"_wallet","internalType":"address payable"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getDocument","inputs":[{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getDocumentCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getDocumentName","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getRoleAdmin","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getRoleMember","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getRoleMemberCount","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalTokens","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasAdminRole","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasMinterRole","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasOperatorRole","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasSmartContractRole","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"init","inputs":[{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initAccessControls","inputs":[{"type":"address","name":"_admin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initAuction","inputs":[{"type":"address","name":"_funder","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_totalTokens","internalType":"uint256"},{"type":"uint256","name":"_startTime","internalType":"uint256"},{"type":"uint256","name":"_endTime","internalType":"uint256"},{"type":"address","name":"_paymentCurrency","internalType":"address"},{"type":"uint24","name":"_fee","internalType":"uint24"},{"type":"uint256","name":"_minimumCommitmentAmount","internalType":"uint256"},{"type":"address","name":"_admin","internalType":"address"},{"type":"address","name":"_pointList","internalType":"address"},{"type":"address","name":"_wallet","internalType":"address payable"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initMarket","inputs":[{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"startTime","internalType":"uint64"},{"type":"uint64","name":"endTime","internalType":"uint64"},{"type":"uint128","name":"totalTokens","internalType":"uint128"}],"name":"marketInfo","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"marketParticipationAgreement","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint128","name":"commitmentsTotal","internalType":"uint128"},{"type":"uint128","name":"minimumCommitmentAmount","internalType":"uint128"},{"type":"bool","name":"finalized","internalType":"bool"},{"type":"bool","name":"usePointList","internalType":"bool"}],"name":"marketStatus","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"marketTemplate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"paymentCurrency","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"permitToken","inputs":[{"type":"address","name":"token","internalType":"contract IERC20"},{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pointList","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"postAuctionLauncher","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeAdminRole","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeDocument","inputs":[{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeMinterRole","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeOperatorRole","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeSmartContractRole","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeRole","inputs":[{"type":"bytes32","name":"role","internalType":"bytes32"},{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAuctionPrice","inputs":[{"type":"uint256","name":"_minimumCommitmentAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAuctionTime","inputs":[{"type":"uint256","name":"_startTime","internalType":"uint256"},{"type":"uint256","name":"_endTime","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAuctionWallet","inputs":[{"type":"address","name":"_wallet","internalType":"address payable"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDocument","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_data","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDocuments","inputs":[{"type":"string[]","name":"_name","internalType":"string[]"},{"type":"string[]","name":"_data","internalType":"string[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setList","inputs":[{"type":"address","name":"_list","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPostAuctionLauncher","inputs":[{"type":"address","name":"_postAuctionLauncher","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenPrice","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"claimerCommitment","internalType":"uint256"}],"name":"tokensClaimable","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"wallet","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawTokens","inputs":[{"type":"address","name":"beneficiary","internalType":"address payable"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawTokens","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Deployed ByteCode
0x6080604052600436106104135760003560e01c8063864333741161021e578063c884ef8311610123578063ddca3f43116100ab578063e8fcf7231161007a578063e8fcf72314610be5578063f04899d314610c05578063f08b82e614610c1a578063f5b541a614610c2f578063fc4e3e0a14610c4457610422565b8063ddca3f4314610b5e578063dde51f6d14610b80578063e0e081d714610ba0578063e6594abd14610bc557610422565b8063d5391393116100f2578063d539139314610ac9578063d547741f14610ade578063d69d3e6214610afe578063dc97e08214610b1e578063dccfe31014610b3e57610422565b8063c884ef8314610a48578063c92bce8714610a68578063ca15c87314610a88578063d2423b5114610aa857610422565b80639c64d0ae116101a6578063b3f05b9711610175578063b3f05b97146109be578063b7928b1d146109d3578063c0fa14e4146109f3578063c395fcb314610a08578063c6b547e614610a2857610422565b80639c64d0ae146109475780639fa5f50b14610967578063a217fddf14610989578063adbf37761461099e57610422565b80639010d07c116101ed5780639010d07c146108b257806391d14854146108d25780639478941c146108f257806399fdb320146109125780639a87222c1461092757610422565b806386433374146108535780638a845fc0146108685780638d8f2adb146108885780638fa8b7901461089d57610422565b80633d1c22731161032457806354f1e126116102ac5780637c516e941161027b5780637c516e94146107bb5780637ccb6a64146107db5780637ff9b5961461080957806381353c8e1461081e578063857d26081461083e57610422565b806354f1e126146107465780636595171c146107665780636ae260c11461078657806374cf9fc5146107a657610422565b80634bb278f3116102f35780634bb278f3146106c95780634d70bc9d146106de5780634dc80e15146106fe5780634ddf47d41461071e578063521eb2731461073157610422565b80633d1c2273146106545780633f16431a1461066957806349df728c146106895780634b3e6abb146106a957610422565b8063248a9ca3116103a7578063314148e211610376578063314148e2146105b857806336568abe146105dd57806336d0054b146105fd5780633b33fe73146106125780633d15cc6d1461063257610422565b8063248a9ca31461053857806329762960146105585780632b89de3c1461056b5780632f2ff15d1461059857610422565b8063163a6ed9116103e3578063163a6ed9146104c157806317026455146104e15780631b3e460e146104f6578063212f8a811461051857610422565b806214687214610427578063031bee0014610447578063099db01714610474578063113b0ab2146104a157610422565b3661042257610420610c64565b005b600080fd5b34801561043357600080fd5b506104206104423660046136cb565b610c85565b34801561045357600080fd5b5061045c610d29565b60405161046b93929190614a55565b60405180910390f35b34801561048057600080fd5b5061049461048f3660046136cb565b610d56565b60405161046b9190613eda565b3480156104ad57600080fd5b506104946104bc3660046136cb565b610d78565b3480156104cd57600080fd5b506104206104dc3660046137e4565b610d92565b3480156104ed57600080fd5b50610494611196565b34801561050257600080fd5b5061050b6111b4565b60405161046b9190613ee5565b34801561052457600080fd5b50610420610533366004613805565b6111b9565b34801561054457600080fd5b5061050b61055336600461392f565b611278565b6104206105663660046137ac565b61128d565b34801561057757600080fd5b5061058b6105863660046137e4565b611333565b60405161046b9190613eee565b3480156105a457600080fd5b506104206105b3366004613947565b61137a565b3480156105c457600080fd5b506105cd6113be565b60405161046b9493929190613dae565b3480156105e957600080fd5b506104206105f8366004613947565b6113ef565b34801561060957600080fd5b50610494611431565b34801561061e57600080fd5b5061042061062d36600461392f565b611467565b34801561063e57600080fd5b5061064761150b565b60405161046b9190613c63565b34801561066057600080fd5b5061050b61151a565b34801561067557600080fd5b506104206106843660046136cb565b611520565b34801561069557600080fd5b506104206106a43660046136cb565b61153b565b3480156106b557600080fd5b506104206106c43660046138f7565b6116ae565b3480156106d557600080fd5b5061042061172f565b3480156106ea57600080fd5b5061058b6106f936600461392f565b6118d9565b34801561070a57600080fd5b5061050b6107193660046136cb565b61197f565b61042061072c36600461398c565b61132f565b34801561073d57600080fd5b50610647611a85565b34801561075257600080fd5b506104206107613660046136cb565b611a94565b34801561077257600080fd5b506104206107813660046136cb565b611aac565b34801561079257600080fd5b506104206107a136600461396b565b611ab7565b3480156107b257600080fd5b5061058b611c29565b3480156107c757600080fd5b506104206107d63660046139cb565b611c4c565b3480156107e757600080fd5b506107fb6107f636600461398c565b611cc0565b60405161046b929190613f30565b34801561081557600080fd5b5061050b611dad565b34801561082a57600080fd5b5061042061083936600461398c565b611de6565b34801561084a57600080fd5b5061050b611e36565b34801561085f57600080fd5b50610494611e48565b34801561087457600080fd5b506104206108833660046136cb565b611e60565b34801561089457600080fd5b50610420611e78565b3480156108a957600080fd5b50610420611e83565b3480156108be57600080fd5b506106476108cd36600461396b565b611f8f565b3480156108de57600080fd5b506104946108ed366004613947565b611fb0565b3480156108fe57600080fd5b5061042061090d3660046136cb565b611fc8565b34801561091e57600080fd5b50610647611fe0565b34801561093357600080fd5b506104206109423660046136cb565b611fef565b34801561095357600080fd5b50610420610962366004613a4d565b612085565b34801561097357600080fd5b5061097c6120bc565b60405161046b9190613e7a565b34801561099557600080fd5b5061050b612194565b3480156109aa57600080fd5b506104206109b93660046136cb565b612199565b3480156109ca57600080fd5b506104946121b1565b3480156109df57600080fd5b506104206109ee3660046136cb565b6121ba565b3480156109ff57600080fd5b506106476121d2565b348015610a1457600080fd5b50610494610a233660046136cb565b6121e1565b348015610a3457600080fd5b5061058b610a4336600461392f565b6121ed565b348015610a5457600080fd5b5061050b610a633660046136cb565b6122b8565b348015610a7457600080fd5b50610420610a8336600461388f565b6122ca565b348015610a9457600080fd5b5061050b610aa336600461392f565b61234f565b610abb610ab6366004613846565b612366565b60405161046b929190613de0565b348015610ad557600080fd5b5061050b6124f6565b348015610aea57600080fd5b50610420610af9366004613947565b612508565b348015610b0a57600080fd5b50610420610b193660046136cb565b612542565b348015610b2a57600080fd5b50610420610b39366004613b5b565b612570565b348015610b4a57600080fd5b50610420610b593660046136cb565b61257b565b348015610b6a57600080fd5b50610b73612586565b60405161046b9190614a37565b348015610b8c57600080fd5b50610420610b9b36600461398c565b612598565b348015610bac57600080fd5b50610bb56125c7565b60405161046b9493929190614a0c565b348015610bd157600080fd5b50610420610be03660046136cb565b6125f1565b348015610bf157600080fd5b5061050b610c003660046136cb565b612654565b348015610c1157600080fd5b50610647612666565b348015610c2657600080fd5b5061050b612675565b348015610c3b57600080fd5b5061050b61268b565b348015610c5057600080fd5b50610494610c5f3660046136cb565b61269d565b60405162461bcd60e51b8152600401610c7c906142be565b60405180910390fd5b610c8e336121e1565b610caa5760405162461bcd60e51b8152600401610c7c906144bf565b600d546001600160a01b031615610cd35760405162461bcd60e51b8152600401610c7c906145fb565b600d80546001600160a01b0319166001600160a01b0383161790556040517fcd19868c27cd462b06a6e040b9812ffbc2d81dd431eb4f835d6347f010f8b25990610d1e908390613c63565b60405180910390a150565b6006546001600160401b0380821691600160401b810490911690600160801b90046001600160801b031683565b6000610d70600080516020614b7083398151915283611fb0565b90505b919050565b6000610d70600080516020614b3083398151915283611fb0565b6402540be4008710610db65760405162461bcd60e51b8152600401610c7c90614364565b42881015610dd65760405162461bcd60e51b8152600401610c7c90614921565b878711610df55760405162461bcd60e51b8152600401610c7c90614958565b60008911610e155760405162461bcd60e51b8152600401610c7c90614287565b6001600160a01b038316610e3b5760405162461bcd60e51b8152600401610c7c9061458d565b6001600160a01b038116610e615760405162461bcd60e51b8152600401610c7c906147a5565b896001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610e9a57600080fd5b505afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613b7f565b60ff16601214610ef45760405162461bcd60e51b8152600401610c7c9061439b565b6001600160a01b03861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610fab576000866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610f5357600080fd5b505afa158015610f67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8b9190613b7f565b60ff1611610fab5760405162461bcd60e51b8152600401610c7c906145c4565b610fb4846126b7565b600780546001600160801b03928316600160801b029216919091179055610fda886126e4565b6006805467ffffffffffffffff19166001600160401b0392909216919091179055611004876126e4565b600680546001600160401b0392909216600160401b0267ffffffffffffffff60401b19909216919091179055611039896126b7565b600680546001600160801b03928316600160801b029216919091179055600980546001600160a01b03808d166001600160a01b031992831617909255600a805462ffffff8916600160a01b0262ffffff60a01b198b86169285169290921791909116179055600c8054928416929091169190911790556110b8836125f1565b6110c18261270d565b6009546110d8906001600160a01b03168c8b612785565b7f7824ca06acdd8331a93fac9d8f97849b46c2d30748d7320b0d3a8173320b1f3a8b8b8b89878660405161111196959493929190613c9b565b60405180910390a17f5725d1e4352d6944889e54837ffaefde55cdc0b55796b831365d61cd4c87fdb8888860405161114a929190614a47565b60405180910390a17f1fd3f6b4312b53d1521fb9dab5af66131ff5b6141870420ded20e5ffb42f6cf2846040516111819190613ee5565b60405180910390a15050505050505050505050565b60065442600160401b9091046001600160401b031662093a80011090565b600381565b600260055414156111dc5760405162461bcd60e51b8152600401610c7c906148b3565b6002600555600a546001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156112205760405162461bcd60e51b8152600401610c7c90614401565b8061122d5761122d610c64565b6000821161124d5760405162461bcd60e51b8152600401610c7c90614556565b600a54611264906001600160a01b03163384612785565b61126e8383612875565b5050600160055550565b60009081526020819052604090206002015490565b600a546001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146112cb5760405162461bcd60e51b8152600401610c7c906141e2565b600034116112eb5760405162461bcd60e51b8152600401610c7c90614556565b806112f8576112f8610c64565b6113028234612875565b600754476001600160801b03909116111561132f5760405162461bcd60e51b8152600401610c7c90614250565b5050565b60608b8b8b8b8b8b8b8b8b8b8b60405160200161135a9b9a99989796959493929190613cd5565b60405160208183030381529060405290509b9a5050505050505050505050565b600082815260208190526040902060020154611398906108ed612a34565b6113b45760405162461bcd60e51b8152600401610c7c9061413b565b61132f8282612a38565b6009546006546008546001600160a01b03909216926001600160401b0380831693600160401b909304169160ff1690565b6113f7612a34565b6001600160a01b0316816001600160a01b0316146114275760405162461bcd60e51b8152600401610c7c9061498f565b61132f8282612aa1565b6007546000906001600160801b03600160801b8204811691161080159061146257506007546001600160801b031615155b905090565b611470336121e1565b61148c5760405162461bcd60e51b8152600401610c7c906144bf565b6007546001600160801b0316156114b55760405162461bcd60e51b8152600401610c7c90614219565b6114be816126b7565b600780546001600160801b03928316600160801b0292169190911790556040517f1fd3f6b4312b53d1521fb9dab5af66131ff5b6141870420ded20e5ffb42f6cf290610d1e908390613ee5565b600a546001600160a01b031681565b60045490565b611538600080516020614b308339815191528261137a565b50565b6002600554141561155e5760405162461bcd60e51b8152600401610c7c906148b3565b600260055561156b611431565b156116145760085460ff166115925760405162461bcd60e51b8152600401610c7c90614114565b600061159d8261197f565b9050600081116115bf5760405162461bcd60e51b8152600401610c7c906141b6565b6001600160a01b0382166000908152600f60205260409020546115e29082612b0a565b6001600160a01b038084166000908152600f602052604090209190915560095461160e91168383612b2d565b506116a6565b600654600160401b90046001600160401b031642116116455760405162461bcd60e51b8152600401610c7c906146c9565b6001600160a01b0381166000908152600e60205260409020548061167b5760405162461bcd60e51b8152600401610c7c9061418a565b6001600160a01b038083166000908152600e6020526040812055600a546116a491168383612b2d565b505b506001600555565b6116b7336121e1565b6116d35760405162461bcd60e51b8152600401610c7c906144bf565b6008805461ff00191661010083151581029190911791829055600b546040517f2df0f5b650a168c74b406dcccc513b8e68da86ce7bcb0654ee83b2ac47be5b3f93610d1e936001600160a01b039093169260ff91041690613d7a565b600260055414156117525760405162461bcd60e51b8152600401610c7c906148b3565b6002600555611760336121e1565b806117755750600c546001600160a01b031633145b80611784575061178433610d78565b806117925750611792611196565b6117ae5760405162461bcd60e51b8152600401610c7c90614336565b60085460ff16156117d15760405162461bcd60e51b8152600401610c7c906144f6565b600654600160801b90046001600160801b03166118005760405162461bcd60e51b8152600401610c7c9061452d565b600654600160401b90046001600160401b031642116118315760405162461bcd60e51b8152600401610c7c906146c9565b611839611431565b1561186c57600a54600c54600754611867926001600160a01b039081169216906001600160801b0316612b2d565b61189c565b600954600c5460065461189c926001600160a01b03908116921690600160801b90046001600160801b0316612b2d565b6008805460ff191660011790556040517f32bebcfd2d04dbae321298091d96d2cb1d07279f59718cd83bd98245b8b82b5a90600090a16001600555565b600481815481106118e657fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152935090918301828280156119775780601f1061194c57610100808354040283529160200191611977565b820191906000526020600020905b81548152906001019060200180831161195a57829003601f168201915b505050505081565b6001600160a01b0381166000908152600e60205260408120546119a457506000610d73565b6009546040516370a0823160e01b81526000916001600160a01b0316906370a08231906119d5903090600401613c63565b60206040518083038186803b1580156119ed57600080fd5b505afa158015611a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a259190613b43565b6001600160a01b0384166000908152600e6020526040902054909150611a4a90612b9f565b6001600160a01b0384166000908152600f6020526040902054909250611a71908390612bd7565b915080821115611a7f578091505b50919050565b600c546001600160a01b031681565b611538600080516020614b7083398151915282612508565b61153860008261137a565b611ac0336121e1565b611adc5760405162461bcd60e51b8152600401610c7c906144bf565b6402540be4008210611b005760405162461bcd60e51b8152600401610c7c90614364565b6402540be4008110611b245760405162461bcd60e51b8152600401610c7c90614364565b42821015611b445760405162461bcd60e51b8152600401610c7c90614921565b818111611b635760405162461bcd60e51b8152600401610c7c90614958565b6007546001600160801b031615611b8c5760405162461bcd60e51b8152600401610c7c90614219565b611b95826126e4565b6006805467ffffffffffffffff19166001600160401b0392909216919091179055611bbf816126e4565b600680546001600160401b0392909216600160401b0267ffffffffffffffff60401b199092169190911790556040517f5725d1e4352d6944889e54837ffaefde55cdc0b55796b831365d61cd4c87fdb890611c1d9084908490614a47565b60405180910390a15050565b606060405180610180016040528061015b8152602001614b9061015b9139905090565b60405163d505accf60e01b81526001600160a01b0389169063d505accf90611c84908a908a908a908a908a908a908a90600401613d39565b600060405180830381600087803b158015611c9e57600080fd5b505af1158015611cb2573d6000803e3d6000fd5b505050505050505050505050565b6060600060028484604051611cd6929190613bc7565b908152602001604051809103902060010160028585604051611cf9929190613bc7565b908152604080516020928190038301812054845460026101006001831615026000190190911604601f810185900485028301850190935282825264010000000090046001600160401b03169290918491830182828015611d9a5780601f10611d6f57610100808354040283529160200191611d9a565b820191906000526020600020905b815481529060010190602001808311611d7d57829003601f168201915b50505050509150915091505b9250929050565b600654600754600091611462916001600160801b03600160801b909204821691611de09116670de0b6b3a7640000612bfa565b90612c31565b600080808080808080808080611dfe8c8e018e6136ee565b9a509a509a509a509a509a509a509a509a509a509a50611e278b8b8b8b8b8b8b8b8b8b8b610d92565b50505050505050505050505050565b600080516020614b3083398151915281565b600654600160401b90046001600160401b0316421190565b611538600080516020614b3083398151915282612508565b611e813361153b565b565b60026005541415611ea65760405162461bcd60e51b8152600401610c7c906148b3565b6002600555611eb4336121e1565b611ed05760405162461bcd60e51b8152600401610c7c906144bf565b60085460079060ff1615611ef65760405162461bcd60e51b8152600401610c7c90614737565b80546001600160801b031615611f1e5760405162461bcd60e51b8152600401610c7c9061400b565b600954600c54600654611f4e926001600160a01b03908116921690600160801b90046001600160801b0316612b2d565b6001818101805460ff191690911790556040517fa5fb31e47bd1eca58bf14a3312d5e6aeafdc4ee787c8ed348c15c2b092324d9390600090a1506001600555565b6000828152602081905260408120611fa79083612c63565b90505b92915050565b6000828152602081905260408120611fa79083612c6f565b611538600080516020614b5083398151915282612508565b6009546001600160a01b031681565b611ff8336121e1565b6120145760405162461bcd60e51b8152600401610c7c906144bf565b6001600160a01b03811661203a5760405162461bcd60e51b8152600401610c7c906147a5565b600c80546001600160a01b0319166001600160a01b0383161790556040517f34ae2bad9265f0212d4cf341708b8250949164bb54f9d0e4f442024f83bb2f9090610d1e908390613c63565b61208e336121e1565b6120aa5760405162461bcd60e51b8152600401610c7c906144bf565b6120b684848484612c84565b50505050565b60606004805480602002602001604051908101604052809291908181526020016000905b8282101561218b5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156121775780601f1061214c57610100808354040283529160200191612177565b820191906000526020600020905b81548152906001019060200180831161215a57829003601f168201915b5050505050815260200190600101906120e0565b50505050905090565b600081565b611538600080516020614b708339815191528261137a565b60085460ff1690565b611538600080516020614b508339815191528261137a565b600d546001600160a01b031681565b6000610d708183611fb0565b60045460609082106122115760405162461bcd60e51b8152600401610c7c906147dc565b6004828154811061221e57fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156122ac5780601f10612281576101008083540402835291602001916122ac565b820191906000526020600020905b81548152906001019060200180831161228f57829003601f168201915b50505050509050919050565b600f6020526000908152604090205481565b6122d3336121e1565b6122ef5760405162461bcd60e51b8152600401610c7c906144bf565b8260005b818110156123475761233f86868381811061230a57fe5b905060200281019061231c9190614a81565b86868581811061232857fe5b905060200281019061233a9190614a81565b612c84565b6001016122f3565b505050505050565b6000818152602081905260408120610d7090612ed6565b606080836001600160401b038111801561237f57600080fd5b506040519080825280602002602001820160405280156123a9578160200160208202803683370190505b509150836001600160401b03811180156123c257600080fd5b506040519080825280602002602001820160405280156123f657816020015b60608152602001906001900390816123e15790505b50905060005b848110156124ed57600060603088888581811061241557fe5b90506020028101906124279190614a81565b604051612435929190613bc7565b600060405180830381855af49150503d8060008114612470576040519150601f19603f3d011682016040523d82523d6000602084013e612475565b606091505b50915091508180612484575085155b61248d82612ee1565b906124ab5760405162461bcd60e51b8152600401610c7c9190613eee565b50818584815181106124b957fe5b602002602001019015159081151581525050808484815181106124d857fe5b602090810291909101015250506001016123fc565b50935093915050565b600080516020614b7083398151915281565b600082815260208190526040902060020154612526906108ed612a34565b6114275760405162461bcd60e51b8152600401610c7c9061446f565b61254b336121e1565b6125675760405162461bcd60e51b8152600401610c7c906144bf565b6115388161270d565b61132f3383836111b9565b611538600082612508565b600a54600160a01b900462ffffff1681565b6125a1336121e1565b6125bd5760405162461bcd60e51b8152600401610c7c906144bf565b61132f8282612f41565b6007546008546001600160801b0380831692600160801b9004169060ff8082169161010090041684565b60015460ff16156126145760405162461bcd60e51b8152600401610c7c90614039565b6001600160a01b03811661263a5760405162461bcd60e51b8152600401610c7c906146a0565b6126456000826113b4565b506001805460ff191681179055565b600e6020526000908152604090205481565b600b546001600160a01b031681565b600654600160801b90046001600160801b031690565b600080516020614b5083398151915281565b6000610d70600080516020614b5083398151915283611fb0565b60006001600160801b038211156126e05760405162461bcd60e51b8152600401610c7c90614438565b5090565b60006001600160401b038211156126e05760405162461bcd60e51b8152600401610c7c90614700565b6001600160a01b0381161561274957600b80546001600160a01b0383166001600160a01b03199091161790556008805461ff0019166101001790555b6008546040517f2df0f5b650a168c74b406dcccc513b8e68da86ce7bcb0654ee83b2ac47be5b3f91610d1e918491610100900460ff1690613d7a565b60006060846001600160a01b03166323b872dd8530866040516024016127ad93929190613c77565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516127e69190613bd7565b6000604051808303816000865af19150503d8060008114612823576040519150601f19603f3d011682016040523d82523d6000602084013e612828565b606091505b50915091508180156128525750805115806128525750808060200190518101906128529190613913565b61286e5760405162461bcd60e51b8152600401610c7c9061486f565b5050505050565b6006546001600160401b031642108015906128a25750600654600160401b90046001600160401b03164211155b6128be5760405162461bcd60e51b8152600401610c7c90614809565b6001600160a01b0382166000908152600e60205260408120546128e19083612b0a565b600854909150610100900460ff161561299257600b54604051631cd53d5560e01b81526001600160a01b0390911690631cd53d55906129269086908590600401613d95565b60206040518083038186803b15801561293e57600080fd5b505afa158015612952573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129769190613913565b6129925760405162461bcd60e51b8152600401610c7c906140df565b6001600160a01b0383166000908152600e602052604090208190556007546129cc906129c7906001600160801b031684612b0a565b6126b7565b600780546fffffffffffffffffffffffffffffffff19166001600160801b03929092169190911790556040517f077511a636ba1f10551cc7b89c13ff66a6ac9344e8a917527817a9690b15af7a90612a279085908590613d95565b60405180910390a1505050565b3390565b6000828152602081905260409020612a509082613172565b1561132f57612a5d612a34565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081905260409020612ab99082613187565b1561132f57612ac6612a34565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b81810181811015611faa5760405162461bcd60e51b8152600401610c7c90614632565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612b6157612b5c828261319c565b612b6c565b612b6c83838361322e565b7f6337ed398c0e8467698c581374fdce4db14922df487b5a39483079f5f59b60a4838383604051612a2793929190613c77565b6007546000906001600160801b0316612bba57506000610d73565b610d70612bc5611dad565b611de084670de0b6b3a7640000612bfa565b80820382811115611faa5760405162461bcd60e51b8152600401610c7c90613fdc565b6000811580612c1557505080820282828281612c1257fe5b04145b611faa5760405162461bcd60e51b8152600401610c7c906148ea565b6000808211612c525760405162461bcd60e51b8152600401610c7c906149de565b818381612c5b57fe5b049392505050565b6000611fa78383613315565b6000611fa7836001600160a01b03841661335a565b82612ca15760405162461bcd60e51b8152600401610c7c90614669565b80612cbe5760405162461bcd60e51b8152600401610c7c90614838565b60006001600160401b031660028585604051612cdb929190613bc7565b908152604051908190036020019020546001600160401b03640100000000909104161415612d815760048054600181018255600091909152612d40907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018585613486565b50600454604051600290612d579087908790613bc7565b908152604051908190036020019020805463ffffffff9290921663ffffffff199092169190911790555b604051806060016040528060028686604051612d9e929190613bc7565b90815260408051602092819003830190205463ffffffff168352426001600160401b0316838301528051601f860183900483028101830182528581529201919085908590819084018382808284376000920191909152505050915250604051600290612e0d9087908790613bc7565b9081526040805191829003602090810190922083518154858501516001600160401b0316640100000000026bffffffffffffffff000000001963ffffffff90931663ffffffff1990921691909117919091161781559083015180519192612e7c92600185019290910190613500565b5050604051612e8f915085908590613bc7565b60405180910390207fbaa206e5ea800eb88bce099f453fee53295b793b9d5d1cfc4ce4b6db06a34f538383604051612ec8929190613f01565b60405180910390a250505050565b6000610d7082613372565b6060604482511015612f27575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c790000006020820152610d73565b60048201915081806020019051810190610d709190613aa9565b60006001600160401b031660028383604051612f5e929190613bc7565b908152604051908190036020019020546001600160401b03640100000000909104161415612f9e5760405162461bcd60e51b8152600401610c7c906143d2565b6000600160028484604051612fb4929190613bc7565b9081526040519081900360200190205460045463ffffffff91821692909203925082166000199091011461309557600480546000198101908110612ff457fe5b9060005260206000200160048263ffffffff168154811061301157fe5b90600052602060002001908054600181600116156101000203166002900461303a92919061356e565b5080600101600260048363ffffffff168154811061305457fe5b9060005260206000200160405161306b9190613bf3565b908152604051908190036020019020805463ffffffff9290921663ffffffff199092169190911790555b60048054806130a057fe5b6001900381819060005260206000200160006130bc91906135e3565b905582826040516130ce929190613bc7565b60405180910390207f4b5338540b4d1c0f6dd0308a25f633b7ff60472f894d711cff9dd64e35c613b260028585604051613109929190613bc7565b90815260200160405180910390206001016040516131279190613f52565b60405180910390a260028383604051613141929190613bc7565b90815260405190819003602001902080546bffffffffffffffffffffffff19168155600061286e60018301826135e3565b6000611fa7836001600160a01b038416613376565b6000611fa7836001600160a01b0384166133c0565b604080516000808252602082019092526001600160a01b0384169083906040516131c69190613bd7565b60006040518083038185875af1925050503d8060008114613203576040519150601f19603f3d011682016040523d82523d6000602084013e613208565b606091505b50509050806132295760405162461bcd60e51b8152600401610c7c90614762565b505050565b60006060846001600160a01b031663a9059cbb8585604051602401613254929190613d95565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161328d9190613bd7565b6000604051808303816000865af19150503d80600081146132ca576040519150601f19603f3d011682016040523d82523d6000602084013e6132cf565b606091505b50915091508180156132f95750805115806132f95750808060200190518101906132f99190613913565b61286e5760405162461bcd60e51b8152600401610c7c906140a8565b815460009082106133385760405162461bcd60e51b8152600401610c7c90614066565b82600001828154811061334757fe5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b5490565b6000613382838361335a565b6133b857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611faa565b506000611faa565b6000818152600183016020526040812054801561347c57835460001980830191908101906000908790839081106133f357fe5b906000526020600020015490508087600001848154811061341057fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061344057fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611faa565b6000915050611faa565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106134c75782800160ff198235161785556134f4565b828001600101855582156134f4579182015b828111156134f45782358255916020019190600101906134d9565b506126e0929150613623565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061354157805160ff19168380011785556134f4565b828001600101855582156134f4579182015b828111156134f4578251825591602001919060010190613553565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106135a757805485556134f4565b828001600101855582156134f457600052602060002091601f016020900482015b828111156134f45782548255916001019190600101906135c8565b50805460018160011615610100020316600290046000825580601f106136095750611538565b601f01602090049060005260206000209081019061153891905b5b808211156126e05760008155600101613624565b60008083601f840112613649578182fd5b5081356001600160401b0381111561365f578182fd5b6020830191508360208083028501011115611da657600080fd5b60008083601f84011261368a578182fd5b5081356001600160401b038111156136a0578182fd5b602083019150836020828501011115611da657600080fd5b803562ffffff81168114611faa57600080fd5b6000602082840312156136dc578081fd5b81356136e781614afd565b9392505050565b60008060008060008060008060008060006101608c8e03121561370f578687fd5b8b3561371a81614afd565b9a5060208c013561372a81614afd565b995060408c0135985060608c0135975060808c0135965060a08c013561374f81614afd565b955061375e8d60c08e016136b8565b945060e08c013593506101008c013561377681614afd565b92506101208c013561378781614afd565b91506101408c013561379881614afd565b809150509295989b509295989b9093969950565b600080604083850312156137be578182fd5b82356137c981614afd565b915060208301356137d981614b12565b809150509250929050565b60008060008060008060008060008060006101608c8e03121561370f578081fd5b600080600060608486031215613819578081fd5b833561382481614afd565b925060208401359150604084013561383b81614b12565b809150509250925092565b60008060006040848603121561385a578081fd5b83356001600160401b0381111561386f578182fd5b61387b86828701613638565b909450925050602084013561383b81614b12565b600080600080604085870312156138a4578182fd5b84356001600160401b03808211156138ba578384fd5b6138c688838901613638565b909650945060208701359150808211156138de578384fd5b506138eb87828801613638565b95989497509550505050565b600060208284031215613908578081fd5b81356136e781614b12565b600060208284031215613924578081fd5b81516136e781614b12565b600060208284031215613940578081fd5b5035919050565b60008060408385031215613959578182fd5b8235915060208301356137d981614afd565b6000806040838503121561397d578182fd5b50508035926020909101359150565b6000806020838503121561399e578182fd5b82356001600160401b038111156139b3578283fd5b6139bf85828601613679565b90969095509350505050565b600080600080600080600080610100898b0312156139e7578182fd5b88356139f281614afd565b97506020890135613a0281614afd565b96506040890135613a1281614afd565b9550606089013594506080890135935060a0890135613a3081614b20565b979a969950949793969295929450505060c08201359160e0013590565b60008060008060408587031215613a62578182fd5b84356001600160401b0380821115613a78578384fd5b613a8488838901613679565b90965094506020870135915080821115613a9c578384fd5b506138eb87828801613679565b600060208284031215613aba578081fd5b81516001600160401b0380821115613ad0578283fd5b818401915084601f830112613ae3578283fd5b815181811115613af1578384fd5b604051601f8201601f191681016020018381118282101715613b11578586fd5b604052818152838201602001871015613b28578485fd5b613b39826020830160208701614ad1565b9695505050505050565b600060208284031215613b54578081fd5b5051919050565b60008060408385031215613b6d578182fd5b8235915060208301356137d981614b12565b600060208284031215613b90578081fd5b81516136e781614b20565b60008151808452613bb3816020860160208601614ad1565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b60008251613be9818460208701614ad1565b9190910192915050565b6000808354600180821660008114613c125760018114613c2957613c58565b60ff198316865260028304607f1686019350613c58565b600283048786526020808720875b83811015613c505781548a820152908501908201613c37565b505050860193505b509195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0396871681529486166020860152604085019390935290841660608401528316608083015290911660a082015260c00190565b6001600160a01b039b8c168152998b1660208b015260408a01989098526060890196909652608088019490945291871660a087015262ffffff1660c086015260e0850152841661010084015283166101208301529091166101408201526101600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039490941684526001600160401b039283166020850152911660408301521515606082015260800190565b604080825283519082018190526000906020906060840190828701845b82811015613e1b578151151584529284019290840190600101613dfd565b50505083810382850152808551613e328184613ee5565b91508192508381028201848801865b83811015613e6b578583038552613e59838351613b9b565b94870194925090860190600101613e41565b50909998505050505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015613ecd57603f19888603018452613ebb858351613b9b565b94509285019290850190600101613e9f565b5092979650505050505050565b901515815260200190565b90815260200190565b600060208252611fa76020830184613b9b565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b600060408252613f436040830185613b9b565b90508260208301529392505050565b60006020808301818452828554600180821660008114613f795760018114613f9757613fcf565b60028304607f16855260ff1983166040890152606088019350613fcf565b60028304808652613fa78a614ac5565b885b82811015613fc55781548b820160400152908401908801613fa9565b8a01604001955050505b5091979650505050505050565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b602080825260149082015273119d5b991cc8185b1c9958591e481c985a5cd95960621b604082015260600190565b602080825260139082015272105b1c9958591e481a5b9a5d1a585b1a5cd959606a1b604082015260600190565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b6020808252818101527f706f696e7473206973206c657373207468616e20676976656e206e756d626572604082015260600190565b6020808252600d908201526c1b9bdd08199a5b985b1a5e9959609a1b604082015260600190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526e0818591b5a5b881d1bc819dc985b9d608a1b606082015260800190565b602080825260129082015271139bc8199d5b991cc818dbdb5b5a5d1d195960721b604082015260600190565b6020808252601290820152714e6f20746f6b656e7320746f20636c61696d60701b604082015260600190565b6020808252601b908201527f7061796d656e742063757272656e6379206973206e6f74204554480000000000604082015260600190565b6020808252601b908201527f63616e6e6f74206861766520616c726561647920737461727465640000000000604082015260600190565b6020808252601d908201527f436f6d6d69747465642045544820657863656564732062616c616e6365000000604082015260600190565b6020808252601f908201527f746f74616c206d7573742062652067726561746572207468616e207a65726f00604082015260600190565b60208082526052908201527f4e6f2061677265656d656e742070726f76696465642c20706c6561736520726560408201527f766965772074686520736d61727420636f6e7472616374206265666f726520696060820152711b9d195c9858dd1a5b99c81dda5d1a081a5d60721b608082015260a00190565b60208082526014908201527329b2b73232b91036bab9ba1031329030b236b4b760611b604082015260600190565b6020808252601b908201527f696e207365636f6e64732c206e6f74206d696c697365636f6e64730000000000604082015260600190565b6020808252601f908201527f546f6b656e20646f6573206e6f74206861766520313820646563696d616c7300604082015260600190565b602080825260159082015274111bd8dd5b595b9d081cda1bdd5b1908195e1a5cdd605a1b604082015260600190565b6020808252601f908201527f5061796d656e742063757272656e6379206973206e6f74206120746f6b656e00604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526030908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526f2061646d696e20746f207265766f6b6560801b606082015260800190565b60208082526017908201527f73656e646572206d75737420626520616e2061646d696e000000000000000000604082015260600190565b6020808252601d908201527f41756374696f6e2068617320616c72656164792066696e616c697a6564000000604082015260600190565b6020808252600f908201526e139bdd081a5b9a5d1a585b1a5e9959608a1b604082015260600190565b6020808252601b908201527f56616c7565206d75737420626520686967686572207468616e20300000000000604082015260600190565b60208082526019908201527f61646d696e20697320746865207a65726f206164647265737300000000000000604082015260600190565b6020808252601d908201527f5061796d656e742063757272656e6379206973206e6f74204552433230000000604082015260600190565b60208082526018908201527f706f73742061756374696f6e20616c7265616479207365740000000000000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b60208082526018908201527f5a65726f206e616d65206973206e6f7420616c6c6f7765640000000000000000604082015260600190565b6020808252600f908201526e125b98dbdc9c9958dd081a5b9c1d5d608a1b604082015260600190565b6020808252601c908201527f41756374696f6e20686173206e6f742066696e69736865642079657400000000604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b602080825260119082015270185b1c9958591e48199a5b985b1a5e9959607a1b604082015260600190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201526213115160ea1b606082015260800190565b6020808252601a908201527f77616c6c657420697320746865207a65726f2061646472657373000000000000604082015260600190565b602080825260139082015272496e646578206f7574206f6620626f756e647360681b604082015260600190565b6020808252601590820152746f7574736964652061756374696f6e20686f75727360581b604082015260600190565b6020808252601a908201527f53686f756c64206e6f74206265206120656d7074792064617461000000000000604082015260600190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416040820152631253115160e21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b6020808252601c908201527f73746172742074696d65206973206265666f72652063757272656e7400000000604082015260600190565b6020808252601c908201527f656e64206d757374206265206f6c646572207468616e20737461727400000000604082015260600190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b602080825260149082015273426f72696e674d6174683a20446976207a65726f60601b604082015260600190565b6001600160801b03948516815292909316602083015215156040820152901515606082015260800190565b62ffffff91909116815260200190565b918252602082015260400190565b6001600160401b0393841681529190921660208201526001600160801b03909116604082015260600190565b6000808335601e19843603018112614a97578283fd5b8301803591506001600160401b03821115614ab0578283fd5b602001915036819003821315611da657600080fd5b60009081526020902090565b60005b83811015614aec578181015183820152602001614ad4565b838111156120b65750506000910152565b6001600160a01b038116811461153857600080fd5b801515811461153857600080fd5b60ff8116811461153857600080fdfe9d49f397ae9ef1a834b569acb967799a367061e305932181a44f5773da873bfd97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9299f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a64920756e6465727374616e642074686174204920616d20696e746572616374696e672077697468206120736d61727420636f6e74726163742e204920756e6465727374616e64207468617420746f6b656e7320636f6d6d6974656420617265207375626a65637420746f2074686520746f6b656e2069737375657220616e64206c6f63616c206c617773207768657265206170706c696361626c652e204920686176652072657669657765642074686520636f6465206f66207468697320736d61727420636f6e747261637420616e6420756e6465727374616e642069742066756c6c792e204920616772656520746f206e6f7420686f6c6420646576656c6f70657273206f72206f746865722070656f706c65206173736f6369617465642077697468207468652070726f6a656374206c6961626c6520666f7220616e79206c6f73736573206f72206d6973756e6465727374616e64696e6773a26469706673582212201ca5f72c1728e37f55731d144aa3aa84ca30e4a0fb01d03f6bd9881c7e5b77cb64736f6c634300060c0033