More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,261 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Many Alpha... | 16289037 | 737 days ago | IN | 0 ETH | 0.00160602 | ||||
Claim Many Alpha... | 16041452 | 771 days ago | IN | 0 ETH | 0.00298946 | ||||
Claim Many Alpha... | 16027915 | 773 days ago | IN | 0 ETH | 0.00472349 | ||||
Claim Many Alpha... | 16017364 | 775 days ago | IN | 0 ETH | 0.00170356 | ||||
Claim Many Alpha... | 16014908 | 775 days ago | IN | 0 ETH | 0.00396002 | ||||
Claim Many Genes... | 15994025 | 778 days ago | IN | 0.0018 ETH | 0.00284595 | ||||
Claim Many Genes... | 15993552 | 778 days ago | IN | 0.0018 ETH | 0.00274279 | ||||
Claim Many Alpha... | 15943088 | 785 days ago | IN | 0 ETH | 0.00245251 | ||||
Claim Many Alpha... | 15930040 | 787 days ago | IN | 0 ETH | 0.00153841 | ||||
Claim Many Genes... | 15921397 | 788 days ago | IN | 0.0036 ETH | 0.00348811 | ||||
Claim Many Genes... | 15913463 | 789 days ago | IN | 0.0018 ETH | 0.00220358 | ||||
Claim Many Genes... | 15913461 | 789 days ago | IN | 0.0036 ETH | 0.00274334 | ||||
Claim Many Genes... | 15913381 | 789 days ago | IN | 0.0036 ETH | 0.00333 | ||||
Claim Many Genes... | 15913366 | 789 days ago | IN | 0.0072 ETH | 0.00632983 | ||||
Claim Many Genes... | 15912506 | 789 days ago | IN | 0.0396 ETH | 0.02034552 | ||||
Claim Many Genes... | 15907384 | 790 days ago | IN | 0.0018 ETH | 0.00208991 | ||||
Claim Many Genes... | 15907376 | 790 days ago | IN | 0.0054 ETH | 0.00406141 | ||||
Set Payment Mult... | 15906358 | 790 days ago | IN | 0 ETH | 0.00041474 | ||||
Claim Many Genes... | 15905983 | 790 days ago | IN | 0 ETH | 0.00147319 | ||||
Claim Many Genes... | 15905958 | 790 days ago | IN | 0 ETH | 0.0011188 | ||||
Claim Many Alpha... | 15903083 | 791 days ago | IN | 0 ETH | 0.00104742 | ||||
Claim Many Alpha... | 15901158 | 791 days ago | IN | 0 ETH | 0.00155082 | ||||
Claim Many Alpha... | 15900700 | 791 days ago | IN | 0 ETH | 0.00704585 | ||||
Claim Many Alpha... | 15900576 | 791 days ago | IN | 0 ETH | 0.00145116 | ||||
Claim Many Alpha... | 15900556 | 791 days ago | IN | 0 ETH | 0.00116623 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
15994025 | 778 days ago | 0.0018 ETH | ||||
15993552 | 778 days ago | 0.0018 ETH | ||||
15921397 | 788 days ago | 0.0036 ETH | ||||
15913463 | 789 days ago | 0.0018 ETH | ||||
15913461 | 789 days ago | 0.0036 ETH | ||||
15913381 | 789 days ago | 0.0036 ETH | ||||
15913366 | 789 days ago | 0.0072 ETH | ||||
15912506 | 789 days ago | 0.0396 ETH | ||||
15907384 | 790 days ago | 0.0018 ETH | ||||
15907376 | 790 days ago | 0.0054 ETH | ||||
15878441 | 794 days ago | 0.0036 ETH | ||||
15848184 | 798 days ago | 0.009 ETH | ||||
15846399 | 799 days ago | 0.0072 ETH | ||||
15845370 | 799 days ago | 0.0018 ETH | ||||
15845368 | 799 days ago | 0.0036 ETH | ||||
15845363 | 799 days ago | 0.0306 ETH | ||||
15845358 | 799 days ago | 0.0504 ETH | ||||
15845304 | 799 days ago | 0.0054 ETH | ||||
15845141 | 799 days ago | 0.0054 ETH | ||||
15844886 | 799 days ago | 0.0018 ETH | ||||
15844490 | 799 days ago | 0.0036 ETH | ||||
15844457 | 799 days ago | 0.009 ETH | ||||
15844436 | 799 days ago | 0.0018 ETH | ||||
15843972 | 799 days ago | 0.0018 ETH | ||||
15843396 | 799 days ago | 0.0072 ETH |
Loading...
Loading
Contract Name:
BullRun
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT LICENSE pragma solidity 0.8.16; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "./interfaces/IMetatopiaCoinFlipRNG.sol"; import "./interfaces/ITopia.sol"; import "./interfaces/IBullpen.sol"; import "./interfaces/IArena.sol"; import "./interfaces/IRandomizer.sol"; import "./interfaces/IHub.sol"; contract BullRun is IERC721Receiver, Ownable, ReentrancyGuard { using EnumerableSet for EnumerableSet.UintSet; address payable public RandomizerContract = payable(0xF9439027c8A21E1375CCDFf31c46ca21f8603305); // VRF contract to decide nft stealing address public BullpenContract = 0x9c215c9Ab78b544345047b9aB604c9c9AC391100; // stores staked Bulls address public ArenaContract = 0xF84BD9d391c9d4874032809BE3Fd121103de5F60; // stores staked Matadors IERC721 public Genesis = IERC721(0x810FeDb4a6927D02A6427f7441F6110d7A1096d5); // Genesis NFT contract IERC721 public Alpha = IERC721(0x96Af517c414B3726c1B2Ecc744ebf9d292DCbF60); // Alpha NFT contract IMetatopiaCoinFlipRNG private MetatopiaCoinFlipRNGInterface = IMetatopiaCoinFlipRNG(0xfe68e3F51F9c79569eB3679B750e617b423852F9); ITopia private TopiaInterface = ITopia(0x41473032b82a4205DDDe155CC7ED210B000b014D); IBullpen private BullpenInterface = IBullpen(0x9c215c9Ab78b544345047b9aB604c9c9AC391100); IArena private ArenaInterface = IArena(0xF84BD9d391c9d4874032809BE3Fd121103de5F60); IRandomizer private RandomizerInterface = IRandomizer(0xF9439027c8A21E1375CCDFf31c46ca21f8603305); IHub public HubInterface = IHub(0x69fdE1A7d6837cD7E82B0BbedcbAd40F487Fdb05); mapping(uint16 => uint8) public NFTType; // tokenID (ID #) => nftID (1 = runner, 2 = bull.. etc) mapping(uint8 => uint8) public Risk; // NFT TYPE (not NFT ID) => % chance to get stolen mapping(uint16 => bool) public IsNFTStaked; // whether or not an NFT ID # is staked mapping(address => mapping(uint256 => uint16[])) public BetNFTsPerEncierro; // keeps track of each players token IDs bet for each encierro mapping(uint16 => mapping(uint256 => NFTBet)) public BetNFTInfo; // tokenID to bet info (each staked NFT is its own separate bet) per session mapping(address => mapping(uint256 => bool)) public HasBet; // keeps track of whether or not a user has bet in a certain encierro mapping(address => mapping(uint256 => bool)) public HasClaimed; // keeps track of users and whether or not they have claimed reward for an encierro bet (not for daily topia) mapping(uint256 => Encierro) public Encierros; // mapping for Encierro id to unlock corresponding encierro params mapping(address => uint256[]) public EnteredEncierros; // list of Encierro ID's that a particular address has bet in mapping(uint16 => Stake) public StakedNFTInfo; // tokenID to stake info mapping(address => uint16) public NumberOfStakedNFTs; // the number of NFTs a wallet has staked; mapping(address => EnumerableSet.UintSet) StakedTokensOfWallet; // list of token IDs a user has staked mapping(address => EnumerableSet.UintSet) MatadorsStakedPerWallet; // list of matador IDs a user has staked mapping(address => EnumerableSet.UintSet) StakedAlphasOfWallet; // list of Alpha token IDs a user has staked mapping(uint16 => Stake) public StakedAlphaInfo; // tokenID to stake info mapping(uint16 => bool) public IsAlphaStaked; // whether or not an NFT ID # is staked mapping(address => uint16) public NumberOfStakedAlphas; // the number of NFTs a wallet has staked; // ID used to identify type of NFT being staked uint8 public constant RunnerId = 1; uint8 public constant BullId = 2; uint8 public constant MatadorId = 3; // keeps track of total NFT's staked uint16 public stakedRunners; uint16 public stakedBulls; uint16 public stakedMatadors; uint16 public stakedAlphas; uint256 public currentEncierroId; uint80 public minimumStakeTime = 0; uint256 public maxDuration = 300; uint256 public minDuration = 86400; // any rewards distributed when no Matadors are staked uint256 private unaccountedMatadorRewards; // amount of $TOPIA due for each Matador staked uint256 private TOPIAPerMatador; uint256 public runnerRewardMult; uint256 public bullRewardMult; uint256 public alphaRewardMult; uint256 public matadorCut; // numerator with 10000 divisor. ie 5% = 500 uint256 public totalTOPIAEarned; // the last time $TOPIA can be earned uint80 public claimEndTime; uint256 public constant PERIOD = 1440 minutes; uint256 public SEED_COST = 0.0038 ether; // an individual NFT being bet struct NFTBet { address player; uint256 amount; uint8 choice; // (0) BULLS or (1) RUNNERS; uint16 tokenID; uint8 typeOfNFT; } // struct to store a stake's token, owner, and earning values struct Stake { uint16 tokenID; address owner; // the wallet that staked it uint80 stakeTimestamp; // when this particular NFT is staked. uint8 typeOfNFT; // (1 = runner, 2 = bull, 3 = matador, etc) uint256 value; // for matador reward calcs - irrelevant unless typeOfNFT = 3. } // status for bull run betting Encierros enum Status { Closed, Open, Standby, Claimable } // BULL RUN Encierro ( EL ENCIERRO ) ---------------------------------------------------- struct Encierro { Status status; uint256 encierroId; // increments monotonically uint256 startTime; // unix timestamp uint256 endTime; // unix timestamp uint256 minBet; uint256 maxBet; uint16 numRunners; // number of runners entered uint16 numBulls; // number of bulls entered uint16 numMatadors; // number of matadors entered uint16 numberOfBetsOnRunnersWinning; // # of people betting for runners uint16 numberOfBetsOnBullsWinning; // # of people betting for bulls uint256 topiaBetByRunners; // all TOPIA bet by runners uint256 topiaBetByBulls; // all TOPIA bet by bulls uint256 topiaBetByMatadors; // all TOPIA bet by matadors uint256 topiaBetOnRunners; // all TOPIA bet that runners will win uint256 topiaBetOnBulls; // all TOPIA bet that bulls will win uint256 totalTopiaCollected; // total TOPIA collected from bets for the entire round uint256 flipResult; // 0 for bulls, 1 for runners } event RunnerStolen (address indexed victim, address indexed theif); event BullStolen (address indexed victim, address indexed theif); event RunnerStaked (address indexed staker, uint16 stakedID); event BullStaked (address indexed staker, uint16 stakedID); event MatadorStaked (address indexed staker, uint16 stakedID); event AlphaStaked (address indexed staker, uint16 stakedID); event RunnerUnstaked (address indexed staker, uint16 unstakedID); event BullUnstaked (address indexed staker, uint16 unstakedID); event MatadorUnstaked (address indexed staker, uint16 unstakedID); event AlphaUnstaked (address indexed staker, uint16 unstakedID); event TopiaClaimed (address indexed claimer, uint256 amount); event AlphaClaimed(uint16 indexed tokenId, bool indexed unstaked, uint256 earned); event BetRewardClaimed (address indexed claimer, uint256 amount); event BullsWin (uint80 timestamp, uint256 encierroID); event RunnersWin (uint80 timestamp, uint256 encierroID); event EncierroOpened( uint256 indexed encierroId, uint256 startTime, uint256 endTime, uint256 minBet, uint256 maxBet ); event BetPlaced( address indexed player, uint256 indexed encierroId, uint256 amount, uint8 choice, uint16[] tokenIDs ); event EncierroClosed( uint256 indexed encierroId, uint256 endTime, uint16 numRunners, uint16 numBulls, uint16 numMatadors, uint16 numberOfBetsOnRunnersWinning, uint16 numberOfBetsOnBullsWinning, uint256 topiaBetByRunners, // all TOPIA bet by runners uint256 topiaBetByBulls, // all TOPIA bet by bulls uint256 topiaBetByMatadors, // all TOPIA bet by matadors uint256 topiaBetOnRunners, // all TOPIA bet that runners will win uint256 topiaBetOnBulls, // all TOPIA bet that bulls will win uint256 totalTopiaCollected ); event CoinFlipped( uint256 flipResult, uint256 indexed encierroId ); // @param: _minStakeTime should be # of SECONDS (ex: if minStakeTime is 1 day, pass 86400) // @param: _runner/bull/alphaMult = number of topia per period constructor() { Risk[1] = 10; // runners Risk[2] = 10; // bulls runnerRewardMult = 18 ether; bullRewardMult = 20 ether; alphaRewardMult = 35 ether; matadorCut = 500; } receive() external payable {} function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC721Received.selector; } // INTERNAL HELPERS ---------------------------------------------------- function _flipCoin() internal returns (uint256) { uint256 result = MetatopiaCoinFlipRNGInterface.oneOutOfTwo(); Encierros[currentEncierroId].status = Status.Standby; if (result == 0) { Encierros[currentEncierroId].flipResult = 0; emit BullsWin(uint80(block.timestamp), currentEncierroId); } else { Encierros[currentEncierroId].flipResult = 1; emit RunnersWin(uint80(block.timestamp), currentEncierroId); } emit CoinFlipped(result, currentEncierroId); return result; } function _isContract(address _addr) internal view returns (bool) { uint256 size; assembly { size := extcodesize(_addr) } return size > 0; } modifier notContract() { require(!_isContract(msg.sender), "Contract not allowed"); require(msg.sender == tx.origin, "Proxy contract not allowed"); _; } // SETTERS ---------------------------------------------------- function setTopiaToken(address _topiaToken) external onlyOwner { TopiaInterface = ITopia(_topiaToken); } function setRNGContract(address _coinFlipContract) external onlyOwner { MetatopiaCoinFlipRNGInterface = IMetatopiaCoinFlipRNG(_coinFlipContract); } function setBullpenContract(address _bullpenContract) external onlyOwner { BullpenContract = _bullpenContract; BullpenInterface = IBullpen(_bullpenContract); } function setArenaContract(address _arenaContract) external onlyOwner { ArenaContract = _arenaContract; ArenaInterface = IArena(_arenaContract); } function setHUB(address _hub) external onlyOwner { HubInterface = IHub(_hub); } function setRandomizer(address _randomizer) external onlyOwner { RandomizerContract = payable(_randomizer); RandomizerInterface = IRandomizer(_randomizer); } // IN SECONDS function setMinStakeTime(uint80 _minStakeTime) external onlyOwner { minimumStakeTime = _minStakeTime; } function setPaymentMultipliers(uint8 _runnerMult, uint8 _bullMult, uint8 _alphaMult, uint8 _matadorCut) external onlyOwner { runnerRewardMult = _runnerMult; bullRewardMult = _bullMult; alphaRewardMult = _alphaMult; matadorCut = _matadorCut; } function setRisks(uint8 _runnerRisk, uint8 _bullRisk) external onlyOwner { Risk[0] = _runnerRisk; Risk[1] = _bullRisk; } function setSeedCost(uint256 _cost) external onlyOwner { SEED_COST = _cost; } function setClaimEndTime(uint80 _time) external onlyOwner { claimEndTime = _time; } // mass update the nftType mapping function setBatchNFTType(uint16[] calldata _idNumbers, uint8[] calldata _types) external onlyOwner { require(_idNumbers.length == _types.length); for (uint16 i = 0; i < _idNumbers.length; i++) { require(_types[i] != 0 && _types[i] <= 3); NFTType[_idNumbers[i]] = _types[i]; } } function setMinMaxDuration(uint256 _min, uint256 _max) external onlyOwner { minDuration = _min; maxDuration = _max; } // GETTERS ---------------------------------------------------- function viewEncierroById(uint256 _encierroId) external view returns (Encierro memory) { return Encierros[_encierroId]; } function getEnteredEncierrosLength(address _better) external view returns (uint256) { return EnteredEncierros[_better].length; } // CLAIM FUNCTIONS ---------------------------------------------------- function claimManyGenesis(uint16[] calldata tokenIds, bool unstake) external payable nonReentrant returns (uint16[] memory stolenNFTs) { uint256 numWords = tokenIds.length; uint256[] memory seed; if(unstake) { require(msg.value == SEED_COST * numWords, "Invalid value for randomness"); RandomizerContract.transfer(msg.value); uint256 remainingWords = RandomizerInterface.getRemainingWords(); require(remainingWords >= numWords, "Not enough random numbers. Please try again soon."); seed = RandomizerInterface.getRandomWords(numWords); HubInterface.emitGenesisUnstaked(msg.sender, tokenIds); stolenNFTs = new uint16[](numWords); } else { stolenNFTs = new uint16[](1); stolenNFTs[0] = 0; } uint256 owed = 0; for (uint i = 0; i < tokenIds.length; i++) { if (NFTType[tokenIds[i]] == 1) { (uint256 _owed, uint16 _stolenId) = claimRunner(tokenIds[i], unstake, unstake ? seed[i] : 0); owed += _owed; if(unstake) { stolenNFTs[i] = _stolenId; } } else if (NFTType[tokenIds[i]] == 2) { (uint256 _owed, uint16 _stolenId) = claimBull(tokenIds[i], unstake, unstake ? seed[i] : 0); owed += _owed; if(unstake) { stolenNFTs[i] = _stolenId; } } else if (NFTType[tokenIds[i]] == 3) { owed += claimMatador(tokenIds[i], unstake); if(unstake) { stolenNFTs[i] = 0;} } else if (NFTType[tokenIds[i]] == 0) { revert("Invalid Token Id"); } } if (owed == 0) { return stolenNFTs; } totalTOPIAEarned += owed; emit TopiaClaimed(msg.sender, owed); TopiaInterface.mint(msg.sender, owed); HubInterface.emitTopiaClaimed(msg.sender, owed); } function claimManyAlphas(uint16[] calldata _tokenIds, bool unstake) external nonReentrant { uint256 owed = 0; for (uint i = 0; i < _tokenIds.length; i++) { require(StakedAlphaInfo[_tokenIds[i]].owner == msg.sender, "not owner"); owed += (block.timestamp - StakedAlphaInfo[_tokenIds[i]].value) * alphaRewardMult / PERIOD; if (unstake) { delete StakedAlphaInfo[_tokenIds[i]]; stakedAlphas -= 1; StakedAlphasOfWallet[msg.sender].remove(_tokenIds[i]); Alpha.safeTransferFrom(address(this), msg.sender, _tokenIds[i]); HubInterface.emitAlphaUnstaked(msg.sender, _tokenIds); emit AlphaUnstaked(msg.sender, _tokenIds[i]); } else { StakedAlphaInfo[_tokenIds[i]].value = uint80(block.timestamp); } emit AlphaClaimed(_tokenIds[i], unstake, owed); } if (owed == 0) { return; } TopiaInterface.mint(msg.sender, owed); HubInterface.emitTopiaClaimed(msg.sender, owed); emit TopiaClaimed(msg.sender, owed); } // this fxn allows caller to claim winnings from their BET (not daily TOPIA) // @param: the calldata array is each of the tokenIDs they are attempting to claim FOR function claimManyBetRewards() external nonReentrant notContract() { uint256 owed; // what caller collects for winning for(uint i = 1; i <= EnteredEncierros[msg.sender].length; i++) { if(Encierros[i].status == Status.Claimable && !HasClaimed[msg.sender][i] && HasBet[msg.sender][i]) { uint8 winningResult = uint8(Encierros[i].flipResult); require(winningResult <= 1 , "Invalid flip result"); for (uint16 z = 0; z < BetNFTsPerEncierro[msg.sender][i].length; z++) { // fetch their bet NFT ids for this encierro require(BetNFTInfo[BetNFTsPerEncierro[msg.sender][i][z]][i].player == msg.sender , "not owner"); // calculate winnings if (BetNFTInfo[BetNFTsPerEncierro[msg.sender][i][z]][i].choice == winningResult && BetNFTInfo[BetNFTsPerEncierro[msg.sender][i][z]][i].typeOfNFT == 1) { // get how much topia was bet on this NFT id in this session uint256 topiaBetOnThisNFT = BetNFTInfo[BetNFTsPerEncierro[msg.sender][i][z]][i].amount; owed += (topiaBetOnThisNFT * 5) / 4; } else if (BetNFTInfo[BetNFTsPerEncierro[msg.sender][i][z]][i].choice == winningResult && BetNFTInfo[BetNFTsPerEncierro[msg.sender][i][z]][i].typeOfNFT == 2) { // get how much topia was bet on this NFT id in this session uint256 topiaBetOnThisNFT = BetNFTInfo[BetNFTsPerEncierro[msg.sender][i][z]][i].amount; owed += (topiaBetOnThisNFT * 3) / 2; } else if (BetNFTInfo[BetNFTsPerEncierro[msg.sender][i][z]][i].choice == winningResult && BetNFTInfo[BetNFTsPerEncierro[msg.sender][i][z]][i].typeOfNFT == 3) { // get how much topia was bet on this NFT id in this session uint256 topiaBetOnThisNFT = BetNFTInfo[BetNFTsPerEncierro[msg.sender][i][z]][i].amount; owed += (topiaBetOnThisNFT * 2); } else { continue; } } HasClaimed[msg.sender][i] = true; } else { continue; } } TopiaInterface.mint(msg.sender, owed); HubInterface.emitTopiaClaimed(msg.sender, owed); emit BetRewardClaimed(msg.sender, owed); } function getUserNFTsPerEncierro(address account, uint256 _id) external view returns (uint16[] memory tokenIds) { uint256 length = BetNFTsPerEncierro[account][_id].length; tokenIds = new uint16[](length); for(uint i = 0; i < length; i++) { tokenIds[i] = BetNFTsPerEncierro[account][_id][i]; } } // STAKING FUNCTIONS ---------------------------------------------------- function stakeMany(uint16[] calldata _tokenIds) external nonReentrant { require(msg.sender == tx.origin, "account to send mismatch"); for (uint i = 0; i < _tokenIds.length; i++) { require(Genesis.ownerOf(_tokenIds[i]) == msg.sender, "not owner"); if (NFTType[_tokenIds[i]] == 1) { stakeRunner(_tokenIds[i]); } else if (NFTType[_tokenIds[i]] == 2) { stakeBull(_tokenIds[i]); } else if (NFTType[_tokenIds[i]] == 3) { stakeMatador(_tokenIds[i]); } else if (NFTType[_tokenIds[i]] == 0) { revert("invalid NFT"); } } HubInterface.emitGenesisStaked(msg.sender, _tokenIds, 4); } function stakeRunner(uint16 tokenID) internal { IsNFTStaked[tokenID] = true; StakedTokensOfWallet[msg.sender].add(tokenID); StakedNFTInfo[tokenID].tokenID = tokenID; StakedNFTInfo[tokenID].owner = msg.sender; StakedNFTInfo[tokenID].stakeTimestamp = uint80(block.timestamp); StakedNFTInfo[tokenID].value = uint80(block.timestamp); StakedNFTInfo[tokenID].typeOfNFT = 1; Genesis.safeTransferFrom(msg.sender, address(this), tokenID); stakedRunners++; NumberOfStakedNFTs[msg.sender]++; emit RunnerStaked(msg.sender, tokenID); } function stakeBull(uint16 tokenID) internal { IsNFTStaked[tokenID] = true; StakedTokensOfWallet[msg.sender].add(tokenID); StakedNFTInfo[tokenID].tokenID = tokenID; StakedNFTInfo[tokenID].owner = msg.sender; StakedNFTInfo[tokenID].stakeTimestamp = uint80(block.timestamp); StakedNFTInfo[tokenID].value = uint80(block.timestamp); StakedNFTInfo[tokenID].typeOfNFT = 2; Genesis.safeTransferFrom(msg.sender, BullpenContract, tokenID); // bulls go to the pen BullpenInterface.receiveBull(msg.sender, tokenID); // tell the bullpen they're getting a new bull stakedBulls++; NumberOfStakedNFTs[msg.sender]++; emit BullStaked(msg.sender, tokenID); } function stakeMatador(uint16 tokenID) internal { IsNFTStaked[tokenID] = true; StakedTokensOfWallet[msg.sender].add(tokenID); MatadorsStakedPerWallet[msg.sender].add(tokenID); StakedNFTInfo[tokenID].tokenID = tokenID; StakedNFTInfo[tokenID].owner = msg.sender; StakedNFTInfo[tokenID].stakeTimestamp = uint80(block.timestamp); StakedNFTInfo[tokenID].typeOfNFT = 3; StakedNFTInfo[tokenID].value = TOPIAPerMatador; // for matadors only Genesis.safeTransferFrom(msg.sender, ArenaContract, tokenID); // matadors go to the arena ArenaInterface.receiveMatador(msg.sender, tokenID); // tell the arena they are receiving a new matador stakedMatadors++; NumberOfStakedNFTs[msg.sender]++; emit MatadorStaked(msg.sender, tokenID); } function claimRunner(uint16 tokenId, bool unstake, uint256 seed) internal returns (uint256 owed, uint16 stolenId) { require(StakedNFTInfo[tokenId].owner == msg.sender, "not owner"); require(block.timestamp - StakedNFTInfo[tokenId].stakeTimestamp > minimumStakeTime, "Must wait minimum stake time"); stolenId = 0; if(block.timestamp <= claimEndTime) { owed = (block.timestamp - StakedNFTInfo[tokenId].value) * runnerRewardMult / PERIOD; } else if (StakedNFTInfo[tokenId].value < claimEndTime) { owed = (claimEndTime - StakedNFTInfo[tokenId].value) * runnerRewardMult / PERIOD; } else { owed = 0; } if(unstake) { IsNFTStaked[tokenId] = false; delete StakedNFTInfo[tokenId]; // reset the struct for this token ID StakedTokensOfWallet[msg.sender].remove(tokenId); if (BullpenInterface.bullCount() > 0 && (seed % 100) < Risk[1]) { // nft gets stolen address thief = BullpenInterface.selectRandomBullOwnerToReceiveStolenRunner(seed); Genesis.safeTransferFrom(address(this), thief, tokenId); stolenId = tokenId; emit RunnerStolen(msg.sender, thief); } else { Genesis.safeTransferFrom(address(this), msg.sender, tokenId); emit RunnerUnstaked(msg.sender, tokenId); } stakedRunners--; NumberOfStakedNFTs[msg.sender]--; } else { StakedNFTInfo[tokenId].value = uint80(block.timestamp); // reset the stakeTime for this NFT } } function claimBull(uint16 tokenId, bool unstake, uint256 seed) internal returns (uint256 owed, uint16 stolenId) { require(StakedNFTInfo[tokenId].owner == msg.sender, "not owner"); require(block.timestamp - StakedNFTInfo[tokenId].stakeTimestamp > minimumStakeTime, "Must wait minimum stake time"); stolenId = 0; if(block.timestamp <= claimEndTime) { owed = (block.timestamp - StakedNFTInfo[tokenId].value) * bullRewardMult / PERIOD; } else if (StakedNFTInfo[tokenId].value < claimEndTime) { owed = (claimEndTime - StakedNFTInfo[tokenId].value) * bullRewardMult / PERIOD; } else { owed = 0; } if(unstake) { IsNFTStaked[tokenId] = false; delete StakedNFTInfo[tokenId]; // reset the struct for this token ID StakedTokensOfWallet[msg.sender].remove(tokenId); if (ArenaInterface.matadorCount() > 0 && (seed % 100) < Risk[2]) { // nft gets stolen address thief = ArenaInterface.selectRandomMatadorOwnerToReceiveStolenBull(seed); BullpenInterface.stealBull(thief, tokenId); stolenId = tokenId; emit BullStolen(msg.sender, thief); } else { BullpenInterface.returnBullToOwner(msg.sender, tokenId); emit BullUnstaked(msg.sender, tokenId); } stakedBulls--; NumberOfStakedNFTs[msg.sender]--; } else { StakedNFTInfo[tokenId].value = uint80(block.timestamp); // reset the stakeTime for this NFT } } function claimMatador(uint16 tokenID, bool unstake) internal returns (uint256 owed) { require(StakedNFTInfo[tokenID].owner == msg.sender, "not owner"); require(block.timestamp - StakedNFTInfo[tokenID].stakeTimestamp > minimumStakeTime, "Must wait minimum stake time"); owed += (TOPIAPerMatador - StakedNFTInfo[tokenID].value); if(unstake) { IsNFTStaked[tokenID] = false; delete StakedNFTInfo[tokenID]; // reset the struct for this token ID StakedTokensOfWallet[msg.sender].remove(tokenID); MatadorsStakedPerWallet[msg.sender].remove(tokenID); ArenaInterface.returnMatadorToOwner(msg.sender, tokenID); stakedMatadors--; NumberOfStakedNFTs[msg.sender]--; emit MatadorUnstaked(msg.sender, tokenID); } else { StakedNFTInfo[tokenID].value = TOPIAPerMatador; } } function stakeManyAlphas(uint16[] calldata _tokenIds) external nonReentrant { require(tx.origin == msg.sender, "Only EOA"); for (uint i = 0; i < _tokenIds.length; i++) { require(Alpha.ownerOf(_tokenIds[i]) == msg.sender, "not owner"); IsAlphaStaked[_tokenIds[i]] = true; StakedAlphasOfWallet[msg.sender].add(_tokenIds[i]); StakedAlphaInfo[_tokenIds[i]].tokenID = _tokenIds[i]; StakedAlphaInfo[_tokenIds[i]].owner = msg.sender; StakedAlphaInfo[_tokenIds[i]].stakeTimestamp = uint80(block.timestamp); StakedAlphaInfo[_tokenIds[i]].value = uint80(block.timestamp); StakedAlphaInfo[_tokenIds[i]].typeOfNFT = 0; Alpha.safeTransferFrom(msg.sender, address(this), _tokenIds[i]); stakedAlphas++; NumberOfStakedAlphas[msg.sender]++; emit AlphaStaked(msg.sender, _tokenIds[i]); } HubInterface.emitAlphaStaked(msg.sender, _tokenIds, 4); } function getUnclaimedAlpha(uint16 tokenId) external view returns (uint256) { return (block.timestamp - StakedAlphaInfo[tokenId].value) * alphaRewardMult / PERIOD; } function getUnclaimedGenesis(uint16 tokenId) external view returns (uint256 owed) { if (!IsNFTStaked[tokenId]) { return 0; } if (NFTType[tokenId] == 1) { if(block.timestamp <= claimEndTime) { owed = (block.timestamp - StakedNFTInfo[tokenId].value) * runnerRewardMult / PERIOD; } else if (StakedNFTInfo[tokenId].value < claimEndTime) { owed = (claimEndTime - StakedNFTInfo[tokenId].value) * runnerRewardMult / PERIOD; } else { owed = 0; } } else if (NFTType[tokenId] == 2) { if(block.timestamp <= claimEndTime) { owed = (block.timestamp - StakedNFTInfo[tokenId].value) * bullRewardMult / PERIOD; } else if (StakedNFTInfo[tokenId].value < claimEndTime) { owed = (claimEndTime - StakedNFTInfo[tokenId].value) * bullRewardMult / PERIOD; } else { owed = 0; } } else if (NFTType[tokenId] == 3) { owed = (TOPIAPerMatador - StakedNFTInfo[tokenId].value); } return owed; } function getUnclaimedTopiaForUser(address _account) external view returns (uint256) { uint256 owed; uint256 genesisLength = StakedTokensOfWallet[_account].length(); uint256 alphaLength = StakedAlphasOfWallet[_account].length(); for (uint i = 0; i < genesisLength; i++) { uint16 tokenId = uint16(StakedTokensOfWallet[_account].at(i)); if (NFTType[tokenId] == 1) { if(block.timestamp <= claimEndTime) { owed += (block.timestamp - StakedNFTInfo[tokenId].value) * runnerRewardMult / PERIOD; } else if (StakedNFTInfo[tokenId].value < claimEndTime) { owed += (claimEndTime - StakedNFTInfo[tokenId].value) * runnerRewardMult / PERIOD; } else { owed += 0; } } else if (NFTType[tokenId] == 2) { if(block.timestamp <= claimEndTime) { owed += (block.timestamp - StakedNFTInfo[tokenId].value) * bullRewardMult / PERIOD; } else if (StakedNFTInfo[tokenId].value < claimEndTime) { owed += (claimEndTime - StakedNFTInfo[tokenId].value) * bullRewardMult / PERIOD; } else { owed += 0; } } else if (NFTType[tokenId] == 3) { owed += (TOPIAPerMatador - StakedNFTInfo[tokenId].value); } else if (NFTType[tokenId] == 0) { continue; } } for (uint i = 0; i < alphaLength; i++) { uint16 tokenId = uint16(StakedAlphasOfWallet[_account].at(i)); owed += (block.timestamp - StakedAlphaInfo[tokenId].value) * alphaRewardMult / PERIOD; } return owed; } function getStakedGenesisForUser(address _account) external view returns (uint16[] memory stakedGensis) { uint256 length = StakedTokensOfWallet[_account].length(); stakedGensis = new uint16[](length); for (uint i = 0; i < length; i++) { stakedGensis[i] = uint16(StakedTokensOfWallet[_account].at(i)); } } function getStakedAlphasForUser(address _account) external view returns (uint16[] memory _stakedAlphas) { uint256 length = StakedAlphasOfWallet[_account].length(); _stakedAlphas = new uint16[](length); for (uint i = 0; i < length; i++) { _stakedAlphas[i] = uint16(StakedAlphasOfWallet[_account].at(i)); } } // BET FUNCTIONS ---------------------------------------------------- // @param: choice is FOR ALL NFTS being passed. Each NFT ID gets assigned the same choice (0 = bulls, 1 = runners) // @param: betAmount is PER NFT. If 10 NFTs are bet, and amount passed in is 10 TOPIA, total is 100 TOPIA BET function betMany(uint16[] calldata _tokenIds, uint256 _encierroId, uint256 _betAmount, uint8 _choice) external nonReentrant { require(Encierros[_encierroId].endTime > block.timestamp , "Betting has ended"); require(_encierroId <= currentEncierroId, "Non-existent encierro id!"); require(TopiaInterface.balanceOf(address(msg.sender)) >= (_betAmount * _tokenIds.length), "not enough TOPIA"); require(_choice == 1 || _choice == 0, "Invalid choice"); require(Encierros[_encierroId].status == Status.Open, "not open"); require(_betAmount >= Encierros[_encierroId].minBet && _betAmount <= Encierros[_encierroId].maxBet, "Bet not within limits"); uint16 numberOfNFTs = uint16(_tokenIds.length); uint256 totalBet = _betAmount * numberOfNFTs; for (uint i = 0; i < numberOfNFTs; i++) { require(StakedNFTInfo[_tokenIds[i]].owner == msg.sender, "not owner"); if (NFTType[_tokenIds[i]] == 1) { betRunner(_tokenIds[i], _encierroId, _betAmount, _choice); } else if (NFTType[_tokenIds[i]] == 2) { betBull(_tokenIds[i], _encierroId, _betAmount, _choice); } else if (NFTType[_tokenIds[i]] == 3) { betMatador(_tokenIds[i], _encierroId, _betAmount, _choice); } else if (NFTType[_tokenIds[i]] == 0) { continue; } Encierros[_encierroId].totalTopiaCollected += totalBet; if (_choice == 0) { Encierros[_encierroId].numberOfBetsOnBullsWinning += numberOfNFTs; // increase the number of bets on bulls winning by # of NFTs being bet Encierros[_encierroId].topiaBetOnBulls += totalBet; // multiply the bet amount per NFT by the number of NFTs } else { Encierros[_encierroId].numberOfBetsOnRunnersWinning += numberOfNFTs; // increase number of bets on runners... Encierros[_encierroId].topiaBetOnRunners += totalBet; } if (!HasBet[msg.sender][_encierroId]) { HasBet[msg.sender][_encierroId] = true; EnteredEncierros[msg.sender].push(_encierroId); } TopiaInterface.burnFrom(msg.sender, totalBet); emit BetPlaced(msg.sender, _encierroId, totalBet, _choice, _tokenIds); } } function betRunner(uint16 _runnerID, uint256 _encierroId, uint256 _betAmount, uint8 _choice) internal { require(IsNFTStaked[_runnerID] , "not staked"); require(StakedNFTInfo[_runnerID].owner == msg.sender , "not owner"); BetNFTsPerEncierro[msg.sender][_encierroId].push(_runnerID); // add the token IDs being bet to their personal mapping for this session BetNFTInfo[_runnerID][_encierroId].player = msg.sender; // map bet token id to caller for this session BetNFTInfo[_runnerID][_encierroId].amount = _betAmount; // map bet token id to bet amount for this session BetNFTInfo[_runnerID][_encierroId].choice = _choice; // map bet token id to choice for this session BetNFTInfo[_runnerID][_encierroId].tokenID = _runnerID; // map bet token id to struct id for this session BetNFTInfo[_runnerID][_encierroId].typeOfNFT = 1; // 1 = runner Encierros[_encierroId].topiaBetByRunners += _betAmount; Encierros[_encierroId].numRunners++; } function betBull(uint16 _bullID, uint256 _encierroId, uint256 _betAmount, uint8 _choice) internal { require(IsNFTStaked[_bullID] , "not staked"); require(StakedNFTInfo[_bullID].owner == msg.sender , "not owner"); BetNFTsPerEncierro[msg.sender][_encierroId].push(_bullID); // add the token IDs being bet to their personal mapping for this session BetNFTInfo[_bullID][_encierroId].player = msg.sender; // map bet token id to caller for this session BetNFTInfo[_bullID][_encierroId].amount = _betAmount; // map bet token id to bet amount for this session BetNFTInfo[_bullID][_encierroId].choice = _choice; // map bet token id to choice for this session BetNFTInfo[_bullID][_encierroId].tokenID = _bullID; // map bet token id to struct id for this session BetNFTInfo[_bullID][_encierroId].typeOfNFT = 2; // 2 = bull Encierros[_encierroId].topiaBetByBulls += _betAmount; Encierros[_encierroId].numBulls++; } function betMatador(uint16 _matadorID, uint256 _encierroId, uint256 _betAmount, uint8 _choice) internal { require(IsNFTStaked[_matadorID] , "not staked"); require(StakedNFTInfo[_matadorID].owner == msg.sender , "not owner"); BetNFTsPerEncierro[msg.sender][_encierroId].push(_matadorID); // add the token IDs being bet to their personal mapping for this session BetNFTInfo[_matadorID][_encierroId].player = msg.sender; // map bet token id to caller for this session BetNFTInfo[_matadorID][_encierroId].amount = _betAmount; // map bet token id to bet amount for this session BetNFTInfo[_matadorID][_encierroId].choice = _choice; // map bet token id to choice for this session BetNFTInfo[_matadorID][_encierroId].tokenID = _matadorID; // map bet token id to struct id for this session BetNFTInfo[_matadorID][_encierroId].typeOfNFT = 3; // 3 = matador Encierros[_encierroId].topiaBetByMatadors += _betAmount; Encierros[_encierroId].numMatadors++; } // Encierro SESSION LOGIC ---------------------------------------------------- function startEncierro( uint256 _endTime, uint256 _minBet, uint256 _maxBet) external payable nonReentrant { require( (currentEncierroId == 0) || (Encierros[currentEncierroId].status == Status.Claimable), "session not claimable"); require(((_endTime - block.timestamp) >= minDuration) && ((_endTime - block.timestamp) <= maxDuration), "invalid time"); require(msg.value == SEED_COST, "seed cost not met"); currentEncierroId++; Encierros[currentEncierroId] = Encierro({ status: Status.Open, encierroId: currentEncierroId, startTime: block.timestamp, endTime: _endTime, minBet: _minBet, maxBet: _maxBet, numRunners: 0, numBulls: 0, numMatadors: 0, numberOfBetsOnRunnersWinning: 0, numberOfBetsOnBullsWinning: 0, topiaBetByRunners: 0, topiaBetByBulls: 0, topiaBetByMatadors: 0, topiaBetOnRunners: 0, topiaBetOnBulls: 0, totalTopiaCollected: 0, flipResult: 2 // init to 2 to avoid conflict with 0 (bulls) or 1 (runners). is set to 0 or 1 later depending on coin flip result. }); RandomizerContract.transfer(msg.value); emit EncierroOpened( currentEncierroId, block.timestamp, _endTime, _minBet, _maxBet ); } // bulls = 0, runners = 1 function closeEncierro(uint256 _encierroId) external nonReentrant { require(Encierros[_encierroId].status == Status.Open , "must be open first"); require(block.timestamp > Encierros[_encierroId].endTime, "not over yet"); MetatopiaCoinFlipRNGInterface.requestRandomWords(); Encierros[_encierroId].status = Status.Closed; emit EncierroClosed( _encierroId, block.timestamp, Encierros[_encierroId].numRunners, Encierros[_encierroId].numBulls, Encierros[_encierroId].numMatadors, Encierros[_encierroId].numberOfBetsOnRunnersWinning, Encierros[_encierroId].numberOfBetsOnBullsWinning, Encierros[_encierroId].topiaBetByRunners, Encierros[_encierroId].topiaBetByBulls, Encierros[_encierroId].topiaBetByMatadors, Encierros[_encierroId].topiaBetOnRunners, Encierros[_encierroId].topiaBetOnBulls, Encierros[_encierroId].totalTopiaCollected ); } /** * add $TOPIA to claimable pot for the Matador Yield * @param amount $TOPIA to add to the pot */ function _payMatadorTax(uint256 amount) internal { if (stakedMatadors == 0) {// if there's no staked matadors unaccountedMatadorRewards += amount; return; } TOPIAPerMatador += (amount + unaccountedMatadorRewards) / stakedMatadors; unaccountedMatadorRewards = 0; } function flipCoinAndMakeClaimable(uint256 _encierroId) external nonReentrant notContract() returns (uint256) { require(_encierroId <= currentEncierroId , "Nonexistent session!"); require(Encierros[_encierroId].status == Status.Closed , "must be closed first"); uint256 encierroFlipResult = _flipCoin(); Encierros[_encierroId].flipResult = encierroFlipResult; if (encierroFlipResult == 0) { // if bulls win uint256 amountToMatadors = (Encierros[_encierroId].topiaBetOnRunners * matadorCut) / 10000; _payMatadorTax(amountToMatadors); } else { // if runners win uint256 amountToMatadors = (Encierros[_encierroId].topiaBetOnBulls * matadorCut) / 10000; _payMatadorTax(amountToMatadors); } Encierros[_encierroId].status = Status.Claimable; return encierroFlipResult; } }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface IHub { function emitGenesisStaked(address owner, uint16[] calldata tokenIds, uint8 gameId) external; function emitAlphaStaked(address owner, uint16[] calldata tokenIds, uint8 gameId) external; function emitGenesisUnstaked(address owner, uint16[] calldata tokenIds) external; function emitAlphaUnstaked(address owner, uint16[] calldata tokenIds) external; function emitTopiaClaimed(address owner, uint256 amount) external; function balanceOf(address owner) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface IRandomizer { function requestRandomWords() external; function getRandomWords(uint256 number) external returns (uint256[] memory); function getRemainingWords() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface IArena { function matadorCount() external view returns (uint16); function receiveMatador(address _originalOwner, uint16 _id) external; function returnMatadorToOwner(address _returnee, uint16 _id) external; function getMatadorOwner(uint16 _id) external view returns (address); function selectRandomMatadorOwnerToReceiveStolenBull(uint256 seed) external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface IBullpen { function bullCount() external view returns (uint16); function receiveBull(address _originalOwner, uint16 _id) external; function returnBullToOwner(address _returnee, uint16 _id) external; function getBullOwner(uint16 _id) external view returns (address); function selectRandomBullOwnerToReceiveStolenRunner(uint256 seed) external returns (address); function stealBull(address _thief, uint16 _id) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface ITopia { function burn(uint256 _amount) external; function mint(address _to, uint256 _amount) external; function burnFrom(address _from, uint256 _amount) external; function decimals() external pure returns (uint8); function balanceOf(address owner) external view returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; interface IMetatopiaCoinFlipRNG { function oneOutOfTwo() external view returns (uint256); function requestRandomWords() external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @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() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @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. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ 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 values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev 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. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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 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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 150 }, "viaIR": true, "evmVersion": "byzantium", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"tokenId","type":"uint16"},{"indexed":true,"internalType":"bool","name":"unstaked","type":"bool"},{"indexed":false,"internalType":"uint256","name":"earned","type":"uint256"}],"name":"AlphaClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint16","name":"stakedID","type":"uint16"}],"name":"AlphaStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint16","name":"unstakedID","type":"uint16"}],"name":"AlphaUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"uint256","name":"encierroId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"choice","type":"uint8"},{"indexed":false,"internalType":"uint16[]","name":"tokenIDs","type":"uint16[]"}],"name":"BetPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BetRewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint16","name":"stakedID","type":"uint16"}],"name":"BullStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"victim","type":"address"},{"indexed":true,"internalType":"address","name":"theif","type":"address"}],"name":"BullStolen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint16","name":"unstakedID","type":"uint16"}],"name":"BullUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint80","name":"timestamp","type":"uint80"},{"indexed":false,"internalType":"uint256","name":"encierroID","type":"uint256"}],"name":"BullsWin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"flipResult","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"encierroId","type":"uint256"}],"name":"CoinFlipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"encierroId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"numRunners","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"numBulls","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"numMatadors","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"numberOfBetsOnRunnersWinning","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"numberOfBetsOnBullsWinning","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"topiaBetByRunners","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"topiaBetByBulls","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"topiaBetByMatadors","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"topiaBetOnRunners","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"topiaBetOnBulls","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalTopiaCollected","type":"uint256"}],"name":"EncierroClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"encierroId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minBet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxBet","type":"uint256"}],"name":"EncierroOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint16","name":"stakedID","type":"uint16"}],"name":"MatadorStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint16","name":"unstakedID","type":"uint16"}],"name":"MatadorUnstaked","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":"staker","type":"address"},{"indexed":false,"internalType":"uint16","name":"stakedID","type":"uint16"}],"name":"RunnerStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"victim","type":"address"},{"indexed":true,"internalType":"address","name":"theif","type":"address"}],"name":"RunnerStolen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint16","name":"unstakedID","type":"uint16"}],"name":"RunnerUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint80","name":"timestamp","type":"uint80"},{"indexed":false,"internalType":"uint256","name":"encierroID","type":"uint256"}],"name":"RunnersWin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TopiaClaimed","type":"event"},{"inputs":[],"name":"Alpha","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ArenaContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"BetNFTInfo","outputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"choice","type":"uint8"},{"internalType":"uint16","name":"tokenID","type":"uint16"},{"internalType":"uint8","name":"typeOfNFT","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"BetNFTsPerEncierro","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BullId","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BullpenContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Encierros","outputs":[{"internalType":"enum BullRun.Status","name":"status","type":"uint8"},{"internalType":"uint256","name":"encierroId","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"minBet","type":"uint256"},{"internalType":"uint256","name":"maxBet","type":"uint256"},{"internalType":"uint16","name":"numRunners","type":"uint16"},{"internalType":"uint16","name":"numBulls","type":"uint16"},{"internalType":"uint16","name":"numMatadors","type":"uint16"},{"internalType":"uint16","name":"numberOfBetsOnRunnersWinning","type":"uint16"},{"internalType":"uint16","name":"numberOfBetsOnBullsWinning","type":"uint16"},{"internalType":"uint256","name":"topiaBetByRunners","type":"uint256"},{"internalType":"uint256","name":"topiaBetByBulls","type":"uint256"},{"internalType":"uint256","name":"topiaBetByMatadors","type":"uint256"},{"internalType":"uint256","name":"topiaBetOnRunners","type":"uint256"},{"internalType":"uint256","name":"topiaBetOnBulls","type":"uint256"},{"internalType":"uint256","name":"totalTopiaCollected","type":"uint256"},{"internalType":"uint256","name":"flipResult","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"EnteredEncierros","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Genesis","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"HasBet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"HasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HubInterface","outputs":[{"internalType":"contract IHub","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"IsAlphaStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"IsNFTStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MatadorId","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"NFTType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"NumberOfStakedAlphas","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"NumberOfStakedNFTs","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RandomizerContract","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"Risk","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RunnerId","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEED_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"StakedAlphaInfo","outputs":[{"internalType":"uint16","name":"tokenID","type":"uint16"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint80","name":"stakeTimestamp","type":"uint80"},{"internalType":"uint8","name":"typeOfNFT","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"StakedNFTInfo","outputs":[{"internalType":"uint16","name":"tokenID","type":"uint16"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint80","name":"stakeTimestamp","type":"uint80"},{"internalType":"uint8","name":"typeOfNFT","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alphaRewardMult","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"},{"internalType":"uint256","name":"_encierroId","type":"uint256"},{"internalType":"uint256","name":"_betAmount","type":"uint256"},{"internalType":"uint8","name":"_choice","type":"uint8"}],"name":"betMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bullRewardMult","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimEndTime","outputs":[{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"},{"internalType":"bool","name":"unstake","type":"bool"}],"name":"claimManyAlphas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimManyBetRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"},{"internalType":"bool","name":"unstake","type":"bool"}],"name":"claimManyGenesis","outputs":[{"internalType":"uint16[]","name":"stolenNFTs","type":"uint16[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_encierroId","type":"uint256"}],"name":"closeEncierro","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentEncierroId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_encierroId","type":"uint256"}],"name":"flipCoinAndMakeClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_better","type":"address"}],"name":"getEnteredEncierrosLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getStakedAlphasForUser","outputs":[{"internalType":"uint16[]","name":"_stakedAlphas","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getStakedGenesisForUser","outputs":[{"internalType":"uint16[]","name":"stakedGensis","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"getUnclaimedAlpha","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"getUnclaimedGenesis","outputs":[{"internalType":"uint256","name":"owed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getUnclaimedTopiaForUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getUserNFTsPerEncierro","outputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"matadorCut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumStakeTime","outputs":[{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"view","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"runnerRewardMult","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_arenaContract","type":"address"}],"name":"setArenaContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_idNumbers","type":"uint16[]"},{"internalType":"uint8[]","name":"_types","type":"uint8[]"}],"name":"setBatchNFTType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bullpenContract","type":"address"}],"name":"setBullpenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint80","name":"_time","type":"uint80"}],"name":"setClaimEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hub","type":"address"}],"name":"setHUB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMinMaxDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint80","name":"_minStakeTime","type":"uint80"}],"name":"setMinStakeTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_runnerMult","type":"uint8"},{"internalType":"uint8","name":"_bullMult","type":"uint8"},{"internalType":"uint8","name":"_alphaMult","type":"uint8"},{"internalType":"uint8","name":"_matadorCut","type":"uint8"}],"name":"setPaymentMultipliers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_coinFlipContract","type":"address"}],"name":"setRNGContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_randomizer","type":"address"}],"name":"setRandomizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_runnerRisk","type":"uint8"},{"internalType":"uint8","name":"_bullRisk","type":"uint8"}],"name":"setRisks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setSeedCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_topiaToken","type":"address"}],"name":"setTopiaToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"}],"name":"stakeMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_tokenIds","type":"uint16[]"}],"name":"stakeManyAlphas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedAlphas","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedBulls","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedMatadors","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedRunners","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"uint256","name":"_minBet","type":"uint256"},{"internalType":"uint256","name":"_maxBet","type":"uint256"}],"name":"startEncierro","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"totalTOPIAEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_encierroId","type":"uint256"}],"name":"viewEncierroById","outputs":[{"components":[{"internalType":"enum BullRun.Status","name":"status","type":"uint8"},{"internalType":"uint256","name":"encierroId","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"minBet","type":"uint256"},{"internalType":"uint256","name":"maxBet","type":"uint256"},{"internalType":"uint16","name":"numRunners","type":"uint16"},{"internalType":"uint16","name":"numBulls","type":"uint16"},{"internalType":"uint16","name":"numMatadors","type":"uint16"},{"internalType":"uint16","name":"numberOfBetsOnRunnersWinning","type":"uint16"},{"internalType":"uint16","name":"numberOfBetsOnBullsWinning","type":"uint16"},{"internalType":"uint256","name":"topiaBetByRunners","type":"uint256"},{"internalType":"uint256","name":"topiaBetByBulls","type":"uint256"},{"internalType":"uint256","name":"topiaBetByMatadors","type":"uint256"},{"internalType":"uint256","name":"topiaBetOnRunners","type":"uint256"},{"internalType":"uint256","name":"topiaBetOnBulls","type":"uint256"},{"internalType":"uint256","name":"totalTopiaCollected","type":"uint256"},{"internalType":"uint256","name":"flipResult","type":"uint256"}],"internalType":"struct BullRun.Encierro","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608080604052346101ea5760008054600160a060020a03198082163390811784557369fde1a7d6837cd7e82b0bbedcbad40f487fdb0592600160a060020a03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08587a36001805573f9439027c8a21e1375ccdff31c46ca21f860330580826002541617600255739c215c9ab78b544345047b9ab604c9c9ac3911008083600354161760035573f84bd9d391c9d4874032809be3fd121103de5f60908184600454161760045573810fedb4a6927d02a6427f7441f6110d7a1096d58460055416176005557396af517c414b3726c1b2ecc744ebf9d292dcbf6084600654161760065573fe68e3f51f9c79569eb3679b750e617b423852f98460075416176007557341473032b82a4205ddde155cc7ed210b000b014d84600854161760085583600954161760095582600a541617600a5581600b541617600b55600c541617600c556001605060020a03196020541660205561012c60215562015180602255660d801472258000602b5560018152600e602052600a60408083209260ff1993838582541617905560028152209182541617905567f9ccd8a1c50800006025556801158e460913d000006026556801e5b8fa8fe2ac00006027556101f4602855615f929081620001f08239f35b600080fdfe6080604052600436101561001b575b361561001957600080fd5b005b7c010000000000000000000000000000000000000000000000000000000060003504806304cb2bbd146140485780630d234e6d14613c85578063150b7a0214613bcd57806318f5c77114613b545780631dd4987514613afa578063212ea12514613a63578063242df9e114613a3d5780632b7fd5c6146139f85780633514ed41146139da578063360e7df1146139b1578063368e0ed81461396557806337d4fc841461393e578063383eb36a14613904578063385c5482146135565780633ec6222d14612eb357806340d1d25514612e8c57806346f0d83414612e52578063476c0d0514612e145780634824785014612da7578063486a6e7014612d805780634b559a6d14612d425780634d051db814612c2e5780635671576114612c105780636451a7d814612b905780636b03e10514612b6f5780636bf6eaff14612b485780636ca9063714612b115780636ce5367914612acf5780636db5c8fd14612ab15780636f089d5a146128755780636fd7e4841461284e578063715018a6146127f05780637654f60d146127c5578063767bcab5146127795780637bf0bdc91461275d5780637c99f826146127185780637d5f9547146126fa57806381d3c14f146126d35780638629b20014612686578063887dd1db1461260d5780638b9ed3e6146125a05780638da5cb5b146125795780639073c1b3146125275780639695863a146124ef578063a4921d85146124d1578063a6d2de98146124a6578063aba7d7f414612438578063af649ccf146123fe578063b45cc46c146123bc578063b4d1d7951461239e578063bb89299214612365578063bc77666314612066578063bd48652e14612048578063c2286ab514611dac578063c3e9fff6146112c5578063c3fbcbbf146112a7578063c61a64b714611289578063cb1f626e146111d5578063cfd25070146111b7578063d4f3cc8c1461119b578063d89c6a4e14611174578063dbce286414611143578063e04dc2841461111c578063e38bf1c3146110da578063e44a25a1146108cc578063eaf5e94d1461087f578063ebf3b0561461085d578063ef2c03a0146105d3578063efa09d68146104de578063f191cf25146104c2578063f2fde38b146103e2578063f7fdc195146103bb5763fccd83dd0361000e57346103b65760803660031901126103b65761037861416d565b61038061417d565b9060443560ff81168091036103b65760ff80938161039c61418d565b946103a5614286565b166025551660265560275516602855005b600080fd5b346103b65760003660031901126103b657602061ffff62010000601e540416604051908152f35b346103b65760203660031901126103b6576103fb614094565b610403614286565b600160a060020a038091169081156104555760009182549181600160a060020a0319841617845560405192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08484a3f35b608460405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346103b65760003660031901126103b657602060405160038152f35b346103b65760403660031901126103b65767ffffffffffffffff6004358181116103b6576105109036906004016141ae565b916024359081116103b6576105299036906004016141ae565b610534929192614286565b8084036103b65760005b61ffff90818116868110156100195760ff8061056361055e84888b6142f4565b614304565b161515806105b9575b156103b6576105b49361059661059161058961055e868a8d6142f4565b948b8a6142f4565b614312565b16600052600d6020526040600020911660ff198254161790556142e1565b61053e565b506003816105cb61055e85898c6142f4565b16111561056c565b346103b65760203660031901126103b65760006102206040516105f5816140aa565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015282610120820152826101408201528261016082015282610180820152826101a0820152826101c0820152826101e08201528261020082015201526004356000526014602052604060002060405190610680826140aa565b60ff8154169060048210156108445782600d6102209284610240965260018101546020840152600281015460408401526003810154606084015260048101546080840152600581015460a084015261ffff68010000000000000000600683015482811660c0870152826201000082041660e08701528264010000000082041661010087015282660100000000000082041661012087015204166101408401526007810154610160840152600881015461018084015260098101546101a0840152600a8101546101c0840152600b8101546101e0840152600c810154610200840152015482820152610774604051809461421a565b6020810151602084015260408101516040840152606081015160608401526080810151608084015260a081015160a084015261ffff60c08201511660c084015261ffff60e08201511660e084015261ffff6101008201511661010084015261ffff6101208201511661012084015261ffff610140820151166101408401526101608101516101608401526101808101516101808401526101a08101516101a08401526101c08101516101c08401526101e08101516101e08401526102008101516102008401520151610220820152f35b60e060020a634e487b7102600052602160045260246000fd5b346103b65760003660031901126103b657602061ffff601e5416604051908152f35b346103b65760403660031901126103b657600160a060020a036108a0614094565b1660005260126020526040600020602435600052602052602060ff604060002054166040519015158152f35b346103b6576020806003193601126103b65760043567ffffffffffffffff81116103b6576108fe9036906004016141ae565b9060026001936109118286541415614321565b8185553233036110935760005b8481106109a657505050600160a060020a03600c541691823b156103b65761097a92600092836040518096819582947fb25ada4a0000000000000000000000000000000000000000000000000000000084523360048501615b68565b03925af1801561099a5761098d57508055005b610996906140c7565b8055005b6040513d6000823e3d90fd5b600160a060020a03906005918083541692846109c6610591858b8b6142f4565b94604051918280927f6352211e00000000000000000000000000000000000000000000000000000000825261ffff809916600483015260249384915afa91821561099a578b92610a2291600091611066575b5085163314615563565b85610a31610591878d8d6142f4565b16600052600d8088528a8a60ff85816040600020541614600014610bb55750610a62945061059193508792506142f4565b938085169283600052600f875260406000209260ff19938c858254161790553360005260188852610a97856040600020615c13565b50846000526016885260406000209361ffff19948686825416179055610ac1336040600020615b95565b6001605060020a034216610ad9816040600020615bde565b8a604060002001558c80604060002001918254161790555416803b156103b657610b2360009691879260405198898094819360e160020a63214217070283523033600485016155be565b03925af194851561099a57610ba195610ba6575b50601e80548383610b498184166142e1565b1691161790553360005260178652604060002091825491610b6b8184166142e1565b1691161790556040519081527fd802514fd936498a53cd337f77b6e9640c9d5498cc5b68b4b65c084e07f20e4d843392a261444b565b61091e565b610baf906140c7565b8a610b37565b89610bc96105918b86869e9a9b9c9e6142f4565b16600052838b528b816040600020541614600014610dc15750610bf4935061059192509087916142f4565b94808287169485600052600f8952604060002060ff199086828254161790553360005260188a52610c29876040600020615c13565b508660005260168a528a60406000209661ffff19978989825416179055610c54336040600020615b95565b6001605060020a034216610c6c816040600020615bde565b8260406000200155604060002001918254161790555416816003541690803b156103b65787600091610cb9938360405180968195829460e160020a632142170702845233600485016155be565b03925af1801561099a57610db2575b5060095416803b156103b657610d136000969187926040519889809481937f69011e590000000000000000000000000000000000000000000000000000000083523360048401615c89565b03925af194851561099a57610ba195610da3575b50601e805463ffff00006201000084610d4381838604166142e1565b1602169063ffff000019161790553360005260178652604060002091825491610d6d8184166142e1565b1691161790556040519081527fb65f51b46c524ff76c3c55bce9afabbc5498259647f2cd6aaec9797675ce4628843392a261444b565b610dac906140c7565b8a610d27565b610dbb906140c7565b8b610cc8565b85610dd66105918b86869e999e9c989c6142f4565b16600052878b5260039788826040600020541614600014610fec57505061059188859493610e03936142f4565b978489169687600052600f8b5260406000209060ff199188838254161790553360005260188c52610e38896040600020615c13565b503360005260198c52610e4f896040600020615c13565b508860005260168c5260406000209761ffff19988a8a825416179055610e79336040600020615b95565b610e906001605060020a0342166040600020615bde565b60406000200191825416179055548a604060002001555416816004541690803b156103b65787600091610ede938360405180968195829460e160020a632142170702845233600485016155be565b03925af1801561099a57610fdd575b50600a5416803b156103b657610f386000969187926040519889809481937fd848e38d0000000000000000000000000000000000000000000000000000000083523360048401615c89565b03925af194851561099a57610ba195610fce575b50601e805465ffff0000000064010000000084610f6c81838604166142e1565b1602169065ffff0000000019161790553360005260178652604060002091825491610f988184166142e1565b1691161790556040519081527fbfbdfc645118cc5e75423b90768a0df736730d0b2cb1528e4e07a5689a4b4325843392a261444b565b610fd7906140c7565b8a610f4c565b610fe6906140c7565b8b610eed565b965096506110049350610591925090879897916142f4565b16600052845260406000205416156110205750610ba19061444b565b82600b6064926040519260e560020a62461bcd02845260048401528201527f696e76616c6964204e46540000000000000000000000000000000000000000006044820152fd5b6110869150893d8b1161108c575b61107e81836140db565b810190615b49565b8d610a18565b503d611074565b6064906040519060e560020a62461bcd0282526004820152601860248201527f6163636f756e7420746f2073656e64206d69736d6174636800000000000000006044820152fd5b346103b65760203660031901126103b657600160a060020a036110fb614094565b611103614286565b16600160a060020a031960075416176007556000604051f35b346103b65760003660031901126103b6576020600160a060020a0360035416604051908152f35b346103b65761116e6111543661424a565b9161116460026001541415614321565b60026001556155e3565b60018055005b346103b65760003660031901126103b6576020600160a060020a0360025416604051908152f35b346103b65760003660031901126103b657602060405160018152f35b346103b65760003660031901126103b6576020602554604051908152f35b346103b65760403660031901126103b6576111ee614094565b600160a060020a036024359116908160005260109060209082825260406000208160005282526040600020549161122483614387565b9360005b848110611241576040518061123d88826140fd565b0390f35b6112849087600052828452604060002085600052845261ffff600861126a836040600020614227565b9054910260020a90041661127e82896143b9565b5261444b565b611228565b346103b65760003660031901126103b6576020602754604051908152f35b346103b65760003660031901126103b6576020602654604051908152f35b346103b65760803660031901126103b65760043567ffffffffffffffff81116103b6576112f69036906004016141ae565b906112ff61418d565b9161130f60026001541415614321565b60026001556024356000526014602052600360406000200154421015611d6557601f5460243511611d1e5760246020600160a060020a0360085416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523360048301525afa90811561099a57600091611cec575b50611398826044356143cc565b11611ca557600160ff8416148015611c9a575b15611c5357602435600052601460205260ff60406000205416600481101561084457600103611c0c576024356000526014602052600460406000200154604435101580611bf8575b15611bb15761140861ffff82166044356143cc565b9160005b61ffff8316811061141d5760018055005b61ffff61142e6105918386866142f4565b16600052601660205261145533600160a060020a0362010000604060002054041614615563565b61ffff6114666105918386866142f4565b16600052600d602052600160ff6040600020541614600014611878576114906105918285856142f4565b61ffff811680600052600f6020526114af60ff60406000205416615e82565b8060005260166020526114d633600160a060020a0362010000604060002054041614615563565b33600052601060205260406000206024356000526020526114fb826040600020615ed0565b600090815260116020908152604080832060243584528252808320805473ffffffffffffffffffffffffffffffffffffffff1916331781556044356001820181905560029091018054630100000061ffff979097166101000262ffff001660ff8d1663ffffffff1990921691909117179590951790945560149091529020600701805490916115899161445a565b905560243560005260146020526006604060002001805461ffff6115ae8183166142e1565b169061ffff19161790555b6024356000526014602052600c6040600020016115d785825461445a565b905560ff85166117f6576024356000526014602052611646600660406000200161161561ffff861661ffff6801000000000000000084540416615e6c565b69ffff00000000000000006801000000000000000061ffff8454931602169069ffff00000000000000001916179055565b6024356000526014602052600b60406000200161166485825461445a565b90555b33600052601280602052604060002060243560005260205260ff604060002054161561175a575b50600160a060020a036008541690813b156103b657600060405180937f79cc67900000000000000000000000000000000000000000000000000000000082528183816116de8b3360048401614467565b03925af191821561099a576117469261174b575b5060405185815260ff8716602082015260608060408301527f5a3db6510032b64412a2f3d5c89c6db2b4c5bc72ee45f901e12586282eaafaf2602435928061173e339482018a8a6143df565b0390a361444b565b61140c565b611754906140c7565b866116f2565b3360005260205260406000206024356000526020526040600020600160ff198254161790553360005260156020526040600020805490680100000000000000008210156117dd57816117b49160016117d59401815561413c565b6024929192359083549060080260020a918260000392839102169119161790565b90558561168e565b60e060020a634e487b7102600052604160045260246000fd5b6024356000526014602052611853600660406000200161182861ffff861661ffff660100000000000084540416615e6c565b67ffff000000000000660100000000000061ffff8454931602169067ffff0000000000001916179055565b6024356000526014602052600a60406000200161187185825461445a565b9055611667565b61ffff6118896105918386866142f4565b16600052600d602052600260ff60406000205416146000146119fb576118b36105918285856142f4565b61ffff811680600052600f6020526118d260ff60406000205416615e82565b8060005260166020526118f933600160a060020a0362010000604060002054041614615563565b336000526010602052604060002060243560005260205261191e826040600020615ed0565b600090815260116020908152604080832060243584528252808320805473ffffffffffffffffffffffffffffffffffffffff1916331781556044356001820181905560029091018054630200000061ffff979097166101000262ffff001660ff8d1663ffffffff1990921691909117179590951790945560149091529020600801805490916119ac9161445a565b905560243560005260146020526119f660066040600020016119d761ffff62010000835404166142e1565b63ffff00006201000061ffff8454931602169063ffff00001916179055565b6115b9565b61ffff611a0c6105918386866142f4565b16600052600d602052600360ff6040600020541614600014611b8157611a366105918285856142f4565b61ffff811680600052600f602052611a5560ff60406000205416615e82565b806000526016602052611a7c33600160a060020a0362010000604060002054041614615563565b3360005260106020526040600020602435600052602052611aa1826040600020615ed0565b600090815260116020908152604080832060243584528252808320805473ffffffffffffffffffffffffffffffffffffffff1916331781556044356001820181905560029091018054630300000061ffff979097166101000262ffff001660ff8d1663ffffffff199092169190911717959095179094556014909152902060090180549091611b2f9161445a565b905560243560005260146020526119f66006604060002001611b5c61ffff640100000000835404166142e1565b65ffff0000000064010000000061ffff8454931602169065ffff000000001916179055565b61ffff611b926105918386866142f4565b16600052600d60205260ff604060002054166119f6576117469061444b565b606460405160e560020a62461bcd02815260206004820152601560248201527f426574206e6f742077697468696e206c696d69747300000000000000000000006044820152fd5b5060056040600020015460443511156113f3565b606460405160e560020a62461bcd02815260206004820152600860248201527f6e6f74206f70656e0000000000000000000000000000000000000000000000006044820152fd5b606460405160e560020a62461bcd02815260206004820152600e60248201527f496e76616c69642063686f6963650000000000000000000000000000000000006044820152fd5b5060ff8316156113ab565b606460405160e560020a62461bcd02815260206004820152601060248201527f6e6f7420656e6f75676820544f504941000000000000000000000000000000006044820152fd5b90506020813d602011611d16575b81611d07602093836140db565b810103126103b657518461138b565b3d9150611cfa565b606460405160e560020a62461bcd02815260206004820152601960248201527f4e6f6e2d6578697374656e7420656e63696572726f20696421000000000000006044820152fd5b606460405160e560020a62461bcd02815260206004820152601160248201527f42657474696e672068617320656e6465640000000000000000000000000000006044820152fd5b346103b6576020806003193601126103b657611dc6614094565b600160a060020a03600091168060005260189081845260406000205490601a92838652604060002054926000915b87828410611e845750505050600092602754915b86848610611e1857604051878152f35b859662015180611e6e86611e6961ffff601b611e7597611e4a8a9b9c9d9e611e7b9b6000528d8352604060002061413c565b939054600860029502850a9004166000525260406000200154426155b1565b6143cc565b049061445a565b9561444b565b93929190611e08565b61ffff9192939785600098969852838252611ea389604060002061413c565b939054600860029502850a9004169283600052600d835260ff936001856040600020541614600014611f6457602a54611f1a95506001605060020a0316428110611f245750611f0b62015180926016611f1496611e6e946000525260406000200154426155b1565b602554906143cc565b9661444b565b9190949294611df4565b92935060005260168b5281816040600020015410600014611f5c57611e6e611f0b611f149493620151809360406000200154906155b1565b50509661444b565b60406000205485168203611ff457602a54611f1a95506001605060020a0316428110611fbc5750611fae62015180926016611f1496611e6e946000525260406000200154426155b1565b602654906143cc565b61444b565b92935060005260168b5281816040600020015410600014611f5c57611e6e611fae611f149493620151809360406000200154906155b1565b5091509160038160406000205416146000146120315750611f1a9161202b611f14926024549060168d5260406000200154906155b1565b9061445a565b611f1a9298915060406000205416611fb75761444b565b346103b65760003660031901126103b6576020602954604051908152f35b346103b6576020806003193601126103b6576004359061208b60026001541415614321565b600260015561209b333b15615aad565b6120a6323314615afb565b601f80549283811161231e578060005260149081845260ff604060002054166004811015610844576122d8578394600494600160a060020a0360075416604051968780927f8bf9e8f00000000000000000000000000000000000000000000000000000000082525afa94851561099a576000956122a9575b5060005281855260406000209260ff19936002858254161790558415908160001461223f57805460009081528488526040808220600d0191909155815481516001605060020a034216815260208101919091527f09bf8afaf5f2bd9a17bd7354d426827e4642bd8e64e211eac7e17ff441b9ae4c9190a15b547f9657f8dd92b97e9c1270aafaebd29b77fd358c4ae01bb2240927acd9f6e9cbc287604051888152a28160005282865284600d6040600020015560001461221f57806000528185526122006127106121fa600a60406000200154602854906143cc565b04615f13565b6000528352600360406000209182541617905560018055604051908152f35b61223a6127106121fa600b60406000200154602854906143cc565b612200565b80546000526001600d604060002001557f3f661213bbe0426ad65addd1512e2292027a0ffc14b71d920e5d9217a46859166122a182546040519182916001605060020a03421683602090939291936001605060020a0360408201951681520152565b0390a1612196565b9094508581813d83116122d1575b6122c181836140db565b810103126103b65751938661211e565b503d6122b7565b606484836040519160e560020a62461bcd028352600483015260248201527f6d75737420626520636c6f7365642066697273740000000000000000000000006044820152fd5b6064836040519060e560020a62461bcd0282526004820152601460248201527f4e6f6e6578697374656e742073657373696f6e210000000000000000000000006044820152fd5b61123d61238e6123743661424a565b9161238460026001541415614321565b6002600155614482565b60018055604051918291826140fd565b346103b65760003660031901126103b6576020604051620151808152f35b346103b65760203660031901126103b657600160a060020a036123dd614094565b6123e5614286565b16600160a060020a0319600c541617600c556000604051f35b346103b65760203660031901126103b65761ffff61241a61419d565b16600052600f602052602060ff604060002054166040519015158152f35b346103b65760603660031901126103b657612451614094565b600160a060020a0360443591166000526010602052604060002060243560005260205260406000209081548110156103b65761249261ffff91602093614227565b9190546008604051930260020a9004168152f35b346103b65760203660031901126103b65760206124c96124c461419d565b615d20565b604051908152f35b346103b65760003660031901126103b6576020602854604051908152f35b346103b65760203660031901126103b65761ffff61250b61419d565b16600052600d602052602060ff60406000205416604051908152f35b346103b65760203660031901126103b65761ffff61254361419d565b16600052601b602052602062015180612570612567600260406000200154426155b1565b602754906143cc565b04604051908152f35b346103b65760003660031901126103b6576020600160a060020a0360005416604051908152f35b346103b65760203660031901126103b65761ffff806125bd61419d565b16600052601b602052604060002061123d815491600260ff6001830154169101549060405194846001605060020a0360b060020a8897041691600160a060020a03620100008304169116866141de565b346103b6576020806003193601126103b657600160a060020a0361262f614094565b16908160005260188082526040600020549161264a83614387565b9360005b848110612663576040518061123d88826140fd565b612681908260005284845261ffff600861126a83604060002061413c565b61264e565b346103b65760403660031901126103b657600160a060020a036126a7614094565b1660005260136020526040600020602435600052602052602060ff604060002054166040519015158152f35b346103b65760403660031901126103b6576126ec614286565b600435602255602435602155005b346103b65760003660031901126103b6576020602b54604051908152f35b346103b65760203660031901126103b6576004356001605060020a0381168091036103b657612745614286565b6001605060020a031960205416176020556000604051f35b346103b65760003660031901126103b657602060405160028152f35b346103b65760203660031901126103b657600160a060020a0361279a614094565b6127a2614286565b16600160a060020a031981816002541617600255600b541617600b556000604051f35b346103b65760003660031901126103b657602061ffff6601000000000000601e540416604051908152f35b346103b65760003660031901126103b657612809614286565b60008054600160a060020a03198116825581600160a060020a0360405192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08284a3f35b346103b65760003660031901126103b6576020600160a060020a03600c5416604051908152f35b346103b6576020806003193601126103b6576004359061289a60026001541415614321565b6002600155816000526014815260ff60406000205416600481101561084457600103612a6a578160005260148152600360406000200154421115612a2357600160a060020a036007541690813b156103b657600080926004604051809581937fe0c862890000000000000000000000000000000000000000000000000000000083525af190811561099a577ff19bd3fe902a0974137a220994e6406b7fabc07afde18fa74526159d88ac14109261018092612a14575b50600084815260148252604090819020805460ff191681556006810154600782015460088301546009840154600a850154600b860154600c90960154875142815261ffff8781169a82019a909a526201000087048a169881019890985264010000000086048916606089015266010000000000008604891660808901526801000000000000000090950490971660a087015260c086019290925260e0850152610100840152610120830193909352610140820152610160810191909152a260018055005b612a1d906140c7565b84612950565b6064906040519060e560020a62461bcd0282526004820152600c60248201527f6e6f74206f7665722079657400000000000000000000000000000000000000006044820152fd5b6064906040519060e560020a62461bcd0282526004820152601260248201527f6d757374206265206f70656e20666972737400000000000000000000000000006044820152fd5b346103b65760003660031901126103b6576020602154604051908152f35b346103b65760203660031901126103b657600160a060020a03612af0614094565b612af8614286565b16600160a060020a031960085416176008556000604051f35b346103b65760203660031901126103b65760ff612b2c61416d565b16600052600e602052602060ff60406000205416604051908152f35b346103b65760003660031901126103b6576020600160a060020a0360055416604051908152f35b346103b65760203660031901126103b657612b88614286565b600435602b55005b346103b65760403660031901126103b65760a061ffff80612baf61419d565b166000526011602052604060002060243560005260205260ff63010000006040600020600160a060020a0381541693600260018301549201549160405195865260208601528382166040860152610100820416606085015204166080820152f35b346103b65760003660031901126103b6576020602254604051908152f35b346103b65760203660031901126103b65760043560005260146020526040600020805460ff169060018101549060028101546003820154600483015460058401546006850154600786015490600887015492600988015494600a89015496600b8a015498600c8b01549a600d01549b604051612cac819f829061421a565b6020015260408d015260608c015260808b015260a08a015261ffff9081811660c08b0152816201000082041660e08b0152816401000000008204166101008b01528166010000000000008204166101208b0152680100000000000000009004166101408901526101608801526101808701526101a08601526101c08501526101e084015261020083015261022082015261024090f35b346103b65760203660031901126103b657600160a060020a03612d63614094565b16600052601d602052602061ffff60406000205416604051908152f35b346103b65760003660031901126103b6576020600160a060020a0360045416604051908152f35b346103b65760203660031901126103b65761ffff80612dc461419d565b166000526016602052604060002061123d815491600260ff6001830154169101549060405194846001605060020a0360b060020a8897041691600160a060020a03620100008304169116866141de565b346103b65760203660031901126103b657600160a060020a03612e35614094565b166000526017602052602061ffff60406000205416604051908152f35b346103b65760203660031901126103b657600160a060020a03612e73614094565b1660005260156020526020604060002054604051908152f35b346103b65760003660031901126103b65760206001605060020a03602a5416604051908152f35b346103b65760003660031901126103b657612ed360026001541415614321565b6002600155612ee3333b15615aad565b612eee323314615afb565b600060015b336000526015602052604060002054811161347c578060005260148060205260ff6040600020541660048110156108445760031480613457575b80613433575b15613429578160005260205260ff600d604060002001541690600182116133e2576000925b33600052601060205260406000208260005260205260406000205461ffff851610156133ac5733600052601060205260406000208260005260205261ffff6008612fa6866040600020614227565b919054910260020a9004166000526011602052604060002082600052602052612fde33600160a060020a036040600020541614615563565b33600052601060205260406000208260005260205261ffff6008613006866040600020614227565b919054910260020a90041660005260116020526040600020826000526020528260ff60026040600020015416148061334a575b156130d85733600052601060205260406000208260005260205261ffff6008613066866040600020614227565b919054910260020a90041660005260116020526040600020826000526020526001604060002001549060059082600019048211831515166130bf5760046130b3926130b99402049061445a565b936142e1565b92612f58565b60e060020a634e487b7102600052601160045260246000fd5b33600052601060205260406000208260005260205261ffff6008613100866040600020614227565b919054910260020a90041660005260116020526040600020826000526020528260ff6002604060002001541614806132e9575b156131ac5733600052601060205260406000208260005260205261ffff6008613160866040600020614227565b919054910260020a90041660005260116020526040600020826000526020526001604060002001548060001904600311811515166130bf576130b991600260036130b39302049061445a565b33600052601060205260406000208260005260205261ffff60086131d4866040600020614227565b919054910260020a90041660005260116020526040600020826000526020528260ff600260406000200154161480613287575b1561327d5733600052601060205260406000208260005260205261ffff6008613234866040600020614227565b919054910260020a90041660005260116020526040600020826000526020526001604060002001548060001904600211811515166130bf576130b99160026130b392029061445a565b926130b9906142e1565b5033600052601060205260406000208260005260205261ffff60086132b0866040600020614227565b919054910260020a9004166000526011602052604060002082600052602052600360ff6301000000600260406000200154041614613207565b5033600052601060205260406000208260005260205261ffff6008613312866040600020614227565b919054910260020a9004166000526011602052604060002082600052602052600260ff63010000008260406000200154041614613133565b5033600052601060205260406000208260005260205261ffff6008613373866040600020614227565b919054910260020a9004166000526011602052604060002082600052602052600160ff6301000000600260406000200154041614613039565b92506133dd91503360005260136020526040600020816000526020526040600020600160ff1982541617905561444b565b612ef3565b606460405160e560020a62461bcd02815260206004820152601360248201527f496e76616c696420666c697020726573756c74000000000000000000000000006044820152fd5b506133dd9061444b565b5033600052601260205260406000208260005260205260ff60406000205416612f33565b5033600052601360205260406000208260005260205260ff6040600020541615612f2d565b50600160a060020a038060085416803b156103b6576000604051809260e060020a6340c10f190282528183816134b6893360048401614467565b03925af1801561099a57613547575b50600c5416803b156103b6576000604051809260e060020a631fb2e3e70282528183816134f6883360048401614467565b03925af1801561099a57613538575b506040519081527fb402c6d77caa27df743a19982227280843cca089045e00034230e9267f0da25e60203392a260018055005b613541906140c7565b81613505565b613550906140c7565b826134c5565b346103b6576020806003193601126103b65760043567ffffffffffffffff81116103b6576135889036906004016141ae565b9060019261359a600285541415614321565b600284553332036138bd57426001605060020a03169060005b84811061360f57505050600160a060020a03600c541691823b156103b65761097a92600092836040518096819582947fdca3b79e0000000000000000000000000000000000000000000000000000000084523360048501615b68565b600160a060020a0390816006541660248461362e610591858b8b6142f4565b92604051928380927f6352211e00000000000000000000000000000000000000000000000000000000825261ffff80971660048301525afa801561099a57613682916000916138a0575b5084163314615563565b80613691610591848a8a6142f4565b16600052601c845260406000209260ff1993898582541617905533600052601a85526136d16040600020836136ca610591878d8d6142f4565b1690615c13565b506136e0610591848a8a6142f4565b93826136f0610591868c8c6142f4565b16600052601b865260406000208361ffff199616868254161790558261371a610591868c8c6142f4565b16600052601b8652613730336040600020615b95565b8261373f610591868c8c6142f4565b16600052601b8652613755876040600020615bde565b82613764610591868c8c6142f4565b16600052601b86528660026040600020015582613785610591868c8c6142f4565b16600052601b86528960406000200190815416905560065416926137ad610591848a8a6142f4565b93803b156103b6576137df60009591869260405197888094819360e160020a63214217070283523033600485016155be565b03925af193841561099a5761388c94613891575b50601e805467ffff00000000000066010000000000008561381781838604166142e1565b1602169067ffff000000000000191617905533600052601d8552604060002090815490836138468184166142e1565b16911617905561385a6105918389896142f4565b90604051911681527f01135a8893e368a4f0eea30fdad456110cd3ffafa9db6e154aba1319627ceb09843392a261444b565b6135b3565b61389a906140c7565b896137f3565b6138b79150863d881161108c5761107e81836140db565b8a613678565b6064906040519060e560020a62461bcd0282526004820152600860248201527f4f6e6c7920454f410000000000000000000000000000000000000000000000006044820152fd5b346103b65760203660031901126103b65761ffff61392061419d565b16600052601c602052602060ff604060002054166040519015158152f35b346103b65760003660031901126103b6576020600160a060020a0360065416604051908152f35b346103b65760203660031901126103b657600160a060020a03613986614094565b61398e614286565b16600160a060020a031981816004541617600455600a541617600a556000604051f35b346103b65760003660031901126103b657602061ffff640100000000601e540416604051908152f35b346103b65760003660031901126103b6576020601f54604051908152f35b346103b65760203660031901126103b6576004356001605060020a0381168091036103b657613a25614286565b6001605060020a0319602a541617602a556000604051f35b346103b65760003660031901126103b65760206001605060020a03815416604051908152f35b346103b65760403660031901126103b657613a7c61416d565b613a8461417d565b90613a8d614286565b600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c805460ff92831660ff199182161790915560016000527fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be9582078054939092169216919091179055005b346103b65760403660031901126103b657613b13614094565b600160a060020a0360243591166000526015602052604060002080548210156103b657602091613b429161413c565b90546008604051920260020a90048152f35b346103b6576020806003193601126103b657600160a060020a03613b76614094565b169081600052601a80825260406000205491613b9183614387565b9360005b848110613baa576040518061123d88826140fd565b613bc8908260005284845261ffff600861126a83604060002061413c565b613b95565b346103b65760803660031901126103b657613be6614094565b50602435600160a060020a038116036103b65767ffffffffffffffff6064358181116103b657366023820112156103b65780600401359182116117dd5760405191613c3b601f8201601f1916602001846140db565b80835236602482840101116103b657600092816024602094018483013701015260206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b60603660031901126103b657613ca060026001541415614321565b6002600155601f5480158015614024575b15613fdd57613cc2426004356155b1565b602254111580613fc6575b15613f7f57602b543403613f3857613ce49061444b565b80601f5560405190613cf5826140aa565b600182528060208301524260408301526004356060830152602435608083015260443560a0830152600060c0830152600060e08301526000610100830152600061012083015260006101408301526000610160830152600061018083015260006101a083015260006101c083015260006101e08301526000610200830152600261022083015260005260146020526040600020908051600481101561084457825460ff9190911660ff199091161782556020810151600183015560408101516002830155606081015160038301556080810151600483015560a0810151600583015560c081015160068301805460e084015161010085015161012086015161014087015169ffff000000000000000061ffff91821668010000000000000000021691811666010000000000000267ffff000000000000169281166401000000000265ffff0000000016620100009482169490940263ffff000016961669ffffffffffffffffffff1990941693909317949094171792909217919091179055600d9061022090610160810151600785015561018081015160088501556101a081015160098501556101c0810151600a8501556101e0810151600b850155610200810151600c85015501519101556000808080600160a060020a036002541681903415613f2e575b3491f11561099a57601f547f8dc39708566b7945376021b1bdb90c66a5b3b63ba0455223bd3782f357ac60026080604051428152600435602082015260243560408201526044356060820152a260018055005b6108fc9150613edb565b606460405160e560020a62461bcd02815260206004820152601160248201527f7365656420636f7374206e6f74206d65740000000000000000000000000000006044820152fd5b606460405160e560020a62461bcd02815260206004820152600c60248201527f696e76616c69642074696d6500000000000000000000000000000000000000006044820152fd5b50613fd3426004356155b1565b6021541015613ccd565b606460405160e560020a62461bcd02815260206004820152601560248201527f73657373696f6e206e6f7420636c61696d61626c6500000000000000000000006044820152fd5b5080600052601460205260ff60406000205416600481101561084457600314613cb1565b346103b65760203660031901126103b657600160a060020a03614069614094565b614071614286565b16600160a060020a03198181600354161760035560095416176009556000604051f35b60043590600160a060020a03821682036103b657565b610240810190811067ffffffffffffffff8211176117dd57604052565b67ffffffffffffffff81116117dd57604052565b90601f8019910116810190811067ffffffffffffffff8211176117dd57604052565b6020908160408183019282815285518094520193019160005b828110614124575050505090565b835161ffff1685529381019392810192600101614116565b80548210156141545760005260206000200190600090565b60e060020a634e487b7102600052603260045260246000fd5b6004359060ff821682036103b657565b6024359060ff821682036103b657565b6064359060ff821682036103b657565b6004359061ffff821682036103b657565b9181601f840112156103b65782359167ffffffffffffffff83116103b6576020808501948185020101116103b657565b91936001605060020a03608094600160a060020a0360ff9499989761ffff60a088019b1687521660208601521660408401521660608201520152565b9060048210156108445752565b9190918054831015614154576000526002600f6020600020601085040193160290565b60406003198201126103b6576004359067ffffffffffffffff82116103b657614275916004016141ae565b909160243580151581036103b65790565b600160a060020a0360005416330361429a57565b606460405160e560020a62461bcd02815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b61ffff8091169081146130bf5760010190565b9190811015614154576020020190565b3560ff811681036103b65790565b3561ffff811681036103b65790565b1561432857565b606460405160e560020a62461bcd02815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b67ffffffffffffffff81116117dd5760208091020190565b906143918261436f565b61439e60405191826140db565b82815280926143af601f199161436f565b0190602036910137565b8051821015614154576020809202010190565b80600019048211811515166130bf570290565b9190808252602080920192916000805b8382106143fe57505050505090565b9091929394853561ffff81168091036144245781528301948301939291600101906143ef565b8280fd5b604090600160a060020a03614448959316815281602082015201916143df565b90565b60001981146130bf5760010190565b919082018092116130bf57565b60209093929193600160a060020a0360408201951681520152565b9192916000919060608515615525575061449e82602b546143cc565b34036154de57600160a060020a039060008080808560025416819034156154d4575b3491f11561099a5781600b54166040908151907f4ea943e70000000000000000000000000000000000000000000000000000000082526020918281600481855afa9081156154c957908791600091615499575b501061542d57906000809260248551809581937f4b3c08f30000000000000000000000000000000000000000000000000000000083528b60048401525af191821561542257600092615392575b505092600c541690813b156103b6576000815180937fd8cd1ec40000000000000000000000000000000000000000000000000000000082528183816145aa8b8a3360048501614428565b03925af19081156153885750615374575b506145c583614387565b9591905b8493855b8181106146f157505050505080156146ed576145eb8160295461445a565b6029556040518181527f55d1a86a8274532ca7ac7b427c3d0ed3520c2125efbfae844d4556cf6795c2bf60203392a2600160a060020a038060085416803b156146e95783604051809260e060020a6340c10f19028252818381614652893360048401614467565b03925af180156146de579084916146ca575b5050600c541690813b15614424576146998392839260405194858094819360e060020a631fb2e3e70283523360048401614467565b03925af180156146bf576146ab575050565b6146b582916140c7565b6146bc5750565b80fd5b6040513d84823e3d90fd5b6146d3906140c7565b614424578238614664565b6040513d86823e3d90fd5b8380fd5b5050565b909192939461ffff6147076105918486886142f4565b168752600d80602052600160ff60408a20541614600014614bb75750604090876147356105918587896142f4565b8815614bb15761474585896143b9565b515b61ffff8216808452601690816020526147a661479b600160a060020a039661477a88620100008c84205404163314615563565b8381528460205260b060020a6001605060020a039a8b9220540416426155b1565b886020541610615ca7565b8c80928d89602a541680421115600014614b6f575050828252806020528d620151806147dc611f0b6002604087200154426155b1565b04995b8115614b4657505082604083614827938360209998979652600f895282822060ff19815416905588526000600283832082815582600182015501553381526018885220615994565b508560095416604051948580927f516d60bc00000000000000000000000000000000000000000000000000000000825260049788915afa908115614b39578f99989796959493929161ffff918b91614b0a575b5016151580614aee575b15614a2b5750506020906024856009541691604051998a9384927fc03e3686000000000000000000000000000000000000000000000000000000008452878401525af19586156149fb578c96614a0a575b50826005541690813b15614a06578261490c92888f80946040519687958694859360e160020a6321421707028552309085016155be565b03925af180156149fb578b98979695949392918d916149d2575b5050916149b2959493916149a69394168c7f06b1110002490d9c1456210289425dc07e72b88a1274054bc107a56ee08340b43391604051a35b601e80549061ffff614972818416615d0f565b1661ffff19809316179055338d52601760205260408d209081549061ffff61499b818416615d0f565b16911617905561445a565b976149bb575b5061444b565b939291936145cd565b61ffff6149c8838d6143b9565b91169052386149ac565b6149e4919293949596979899506140c7565b6149f75790899695949392918b38614926565b8a80fd5b6040513d8e823e3d90fd5b8c80fd5b614a2491965060203d60201161108c5761107e81836140db565b94386148d5565b94915096506005541690813b15614a0657918c91614a65938360405180968195829460e160020a63214217070284523390309085016155be565b03925af18015614ae3578a979695949392918c91614abc575b5050916149a6916149b29594936040519081527f5e0a9adf9530fdb8889d2e1f6449a9f4a2f2881dbe5b19d75fa2a0f33b3462b960203392a261495f565b614acd9192939495969798506140c7565b614adf57908895949392918a38614a7e565b8980fd5b6040513d8d823e3d90fd5b5060018952600e60205260ff60408a2054166064840610614884565b614b2c915060203d602011614b32575b614b2481836140db565b810190615cf5565b3861487a565b503d614b1a565b8f604051903d90823e3d90fd5b909b9a989497506149a696506149b299955060409183946002945260205242169220015561445a565b84845282602052600290808260408720015410600014614ba857611f0b614ba1916201518093604088200154906155b1565b04996147df565b505082996147df565b81614747565b61ffff614bc86105918587896142f4565b16885280602052600260ff60408a2054161460001461507b5750614bf06105918385876142f4565b861561507457614c0083876143b9565b51915b61ffff821689526016602052614c2c600160a060020a036201000060408c205404163314615563565b61ffff821689526016602052614c6a614c586001605060020a0360b060020a60408d20540416426155b1565b6001605060020a036020541610615ca7565b8891896001605060020a03602a5416804211156000146150305750614ca9611fae60026040620151809461ffff871681526016602052200154426155b1565b04925b898015614fff575061ffff82168b52600f60205260408b2060ff19815416905560166020526000600260408d208281558260018201550155338b526018602052614cfd61ffff831660408d20615994565b5060046020600160a060020a03600a5416604051928380927fd885ce610000000000000000000000000000000000000000000000000000000082525afa9081156149fb579061ffff918d91614fe0575b5016151580614fc4575b15614ef757506020600160a060020a03600a5416946024604051809781937feba9bb2d00000000000000000000000000000000000000000000000000000000835260048301525afa938415614eec578a94614ecb575b50600160a060020a0360095416803b156149f7578a60405180927f8f5ff5cc000000000000000000000000000000000000000000000000000000008252818381614dfb888c60048401615c89565b03925af18015614ae3578a979695949392918c91614ea8575b5050916149a691600160a060020a036149b29695168c7fdfe086ffa31eb2411029ef981d5f6924ac6c1b8384b01c085d7ec75776d701133391604051a35b601e805463ffff00006201000061ffff614e6f8183860416615d0f565b1602169063ffff00001916179055338c52601760205260408c20805461ffff614e99818316615d0f565b169061ffff191617905561445a565b614eb99192939495969798506140c7565b614adf57908895949392918a38614e14565b614ee591945060203d60201161108c5761107e81836140db565b9238614dad565b6040513d8c823e3d90fd5b9350600160a060020a0360095416803b156149f7578a60405180927fcda2d9dc000000000000000000000000000000000000000000000000000000008252818381614f46883360048401615c89565b03925af18015614ae3578a979695949392918c91614fa1575b5050916149a6916149b295949361ffff604051911681527f99a3889316e5f428bc3b6a66ef1be5baa20746deea093c4e4a9e0f12dff0d9f060203392a2614e52565b614fb29192939495969798506140c7565b614adf57908895949392918a38614f5f565b5060028b52600e60205260ff60408c2054166064860610614d57565b614ff9915060203d602011614b3257614b2481836140db565b38614d4d565b96959390926149b2955061ffff6149a693168c5260166020528b600260406001605060020a0342169220015561445a565b61ffff8316825260166020528060026040842001541060001461506d57611fae61506691600260406201518095200154906155b1565b0492614cac565b5092614cac565b8791614c03565b61ffff61508c6105918587896142f4565b16885280602052600360ff60408a205416146000146152fb57506150b46105918385876142f4565b9061ffff821688526016602052600160a060020a03916150e0836201000060408c205404163314615563565b61ffff81168952601660205261511a604061510f8b60b060020a6001605060020a0393849220540416426155b1565b906020541610615ca7565b6024549261ffff82168a5260166020528861513c600260408d200154866155b1565b9481156152d457505061ffff82168a52600f60205260408a2060ff19815416905560166020526000600260408c208281558260018201550155338a52601860205261518e61ffff831660408c20615994565b50338a5260196020526151a861ffff831660408c20615994565b50600a5416803b15614adf578960405180927f0f881a4d0000000000000000000000000000000000000000000000000000000082528183816151ee883360048401615c89565b03925af18015614eec57899695949392918b916152af575b50509161529e916149b29493601e805465ffff0000000064010000000061ffff6152338183860416615d0f565b1602169065ffff000000001916179055338c52601760205260408c20805461ffff61525f818316615d0f565b169061ffff191617905561ffff604051911681527f880f69f1c4d4831a8a2161f3b0e69ef0afe018c0acf4c41b060831f4977b372960203392a261445a565b961561444b578761127e828c6143b9565b6152bf91929394959697506140c7565b6152d0579087949392918938615206565b8880fd5b6149b295925061ffff61529e949897959298168c526016602052600260408d20015561445a565b61ffff6153116105918587899b9897969b6142f4565b16885260205260ff6040882054161561532d576149b29061444b565b606460405160e560020a62461bcd02815260206004820152601060248201527f496e76616c696420546f6b656e204964000000000000000000000000000000006044820152fd5b61537f9194506140c7565b600092386145bb565b513d6000823e3d90fd5b3d8084833e6153a181836140db565b81019082818303126146e95780519067ffffffffffffffff821161541e570181601f820112156146e9578051906153d78261436f565b946153e4875196876140db565b828652848080880194028301019384116146bc57508301905b82821061540f57505050503880614560565b815181529083019083016153fd565b8480fd5b83513d6000823e3d90fd5b50608491519060e560020a62461bcd0282526004820152603160248201527f4e6f7420656e6f7567682072616e646f6d206e756d626572732e20506c65617360448201527f652074727920616761696e20736f6f6e2e0000000000000000000000000000006064820152fd5b91508382813d83116154c2575b6154b081836140db565b810103126146bc575086905138614513565b503d6154a6565b84513d6000823e3d90fd5b6108fc91506144c0565b606460405160e560020a62461bcd02815260206004820152601c60248201527f496e76616c69642076616c756520666f722072616e646f6d6e657373000000006044820152fd5b90604051956040870187811067ffffffffffffffff8211176117dd5760405260018752602087016020368237875115614154576000905291906145c9565b1561556a57565b606460405160e560020a62461bcd02815260206004820152600960248201527f6e6f74206f776e657200000000000000000000000000000000000000000000006044820152fd5b919082039182116130bf57565b600160a060020a0391821681529116602082015261ffff909116604082015260600190565b600092835b8381106156d1575050505080156156ce57600160a060020a038060085416803b156103b6576000604051809260e060020a6340c10f19028252818381615632893360048401614467565b03925af1801561099a576156bf575b50600c5416803b156103b6576000604051809260e060020a631fb2e3e7028252818381615672883360048401614467565b03925af1801561099a576156b0575b506040519081527f55d1a86a8274532ca7ac7b427c3d0ed3520c2125efbfae844d4556cf6795c2bf60203392a2565b6156b9906140c7565b38615681565b6156c8906140c7565b38615641565b50565b839061ffff95866156e66105918486896142f4565b16600052601b966020888152600160a060020a03916040926157143382620100008760002054041614615563565b81615723610591888a8d6142f4565b166000528a835261574760029562015180611e6e61256789896000200154426155b1565b94859b8a8a600014615941579361576a6105918a8398999a9b9c600097986142f4565b16835285528582208281558260018201550155601e8054660100000000000090600019858383041601928584116130bf576105918a8e6157db938f969567ffff0000000000008b97886157e29b1602169067ffff000000000000191617905533600052601a8a528a600020956142f4565b1690615994565b508060065416906157f7610591888c8c6142f4565b91803b156103b65760008651809260e160020a632142170702825281838161582560049933308c85016155be565b03925af1801561593657615927575b50600c5416803b156103b657896000918a8361587f958951968795869485937fc5f5209600000000000000000000000000000000000000000000000000000000855233908501614428565b03925af180156154c9579161591396959493917f12f303115cfb46def8276dd03ba00e97c305442c3bf65667148f74e9e6fab96d93615918575b506158c8610591878c8c6142f4565b818551911681527fadd31af9b54c20c8528e24773d8aa6e3c5787ec02131bbebed49d8876fcb6821833392a25b615903610591878c8c6142f4565b16925193845286151593a361444b565b6155e8565b615921906140c7565b386158b9565b615930906140c7565b38615834565b86513d6000823e3d90fd5b849350936159786105918a6159139c7f12f303115cfb46def8276dd03ba00e97c305442c3bf65667148f74e9e6fab96d99986142f4565b1660005283526001605060020a034216908560002001556158f5565b906001820190600092818452826020526040842054801515600014615aa65760001990808201818111615a8f57835490838201918211615a7857808203615a23575b50505081548015615a0c5701906159ed828261413c565b60088254910260020a8703191690555582526020526040812055600190565b60248660e060020a634e487b710281526031600452fd5b615a636008615a35615a47948861413c565b9054910260020a90049283928761413c565b819391549060080260020a918260000392839102169119161790565b905586528460205260408620553880806159d6565b60248860e060020a634e487b710281526011600452fd5b60248760e060020a634e487b710281526011600452fd5b5050505090565b15615ab457565b606460405160e560020a62461bcd02815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f7765640000000000000000000000006044820152fd5b15615b0257565b606460405160e560020a62461bcd02815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f7765640000000000006044820152fd5b908160209103126103b65751600160a060020a03811681036103b65790565b9392600492615b9091600160a060020a036040941687526060602088015260608701916143df565b930152565b9075ffffffffffffffffffffffffffffffffffffffff000062010000600160a060020a038454931602169075ffffffffffffffffffffffffffffffffffffffff00001916179055565b9075ffffffffffffffffffffffffffffffffffffffffffff82549160b060020a6001605060020a038319921602169116179055565b91906001830160009082825280602052604082205415600014615c835784549468010000000000000000861015615c6c5783615c5c615a47886001604098999a0185558461413c565b9055549382526020522055600190565b60248360e060020a634e487b710281526041600452fd5b50925050565b600160a060020a03909116815261ffff909116602082015260400190565b15615cae57565b606460405160e560020a62461bcd02815260206004820152601c60248201527f4d7573742077616974206d696e696d756d207374616b652074696d65000000006044820152fd5b908160209103126103b6575161ffff811681036103b65790565b61ffff1680156130bf576000190190565b600061ffff60009216808352602090600f825260409260ff848620541615615aa657600d83528385205460ff16600103615dc05750602a546001605060020a0316428110615d8b5750615d8792846016611f0b9460029462015180985252200154426155b1565b0490565b9291601691855252816002828520015410600014615dbb57615d87916002611f0b926201518095200154906155b1565b505090565b8385205460ff16600203615e315750602a546001605060020a0316428110615e015750615d8792846016611fae9460029462015180985252200154426155b1565b9291601691855252816002828520015410600014615dbb57615d87916002611fae926201518095200154906155b1565b939050600360ff848395949520541614615e4c575b50505090565b60245460169093522060020154615e649250906155b1565b388080615e46565b91909161ffff808094169116019182116130bf57565b15615e8957565b606460405160e560020a62461bcd02815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b8054680100000000000000008110156117dd57615ef291600182018155614227565b600882939254910260020a9161ffff92808402938492160216911916179055565b61ffff640100000000601e5404168015615f4a57615f37615f40926023549061445a565b0460245461445a565b6024556000602355565b50615f579060235461445a565b60235556fea2646970667358221220295e39989d072717153efe72902910460dfa51ec525ddad3430f71c437050f3a64736f6c63430008100033
Deployed Bytecode
0x6080604052600436101561001b575b361561001957600080fd5b005b7c010000000000000000000000000000000000000000000000000000000060003504806304cb2bbd146140485780630d234e6d14613c85578063150b7a0214613bcd57806318f5c77114613b545780631dd4987514613afa578063212ea12514613a63578063242df9e114613a3d5780632b7fd5c6146139f85780633514ed41146139da578063360e7df1146139b1578063368e0ed81461396557806337d4fc841461393e578063383eb36a14613904578063385c5482146135565780633ec6222d14612eb357806340d1d25514612e8c57806346f0d83414612e52578063476c0d0514612e145780634824785014612da7578063486a6e7014612d805780634b559a6d14612d425780634d051db814612c2e5780635671576114612c105780636451a7d814612b905780636b03e10514612b6f5780636bf6eaff14612b485780636ca9063714612b115780636ce5367914612acf5780636db5c8fd14612ab15780636f089d5a146128755780636fd7e4841461284e578063715018a6146127f05780637654f60d146127c5578063767bcab5146127795780637bf0bdc91461275d5780637c99f826146127185780637d5f9547146126fa57806381d3c14f146126d35780638629b20014612686578063887dd1db1461260d5780638b9ed3e6146125a05780638da5cb5b146125795780639073c1b3146125275780639695863a146124ef578063a4921d85146124d1578063a6d2de98146124a6578063aba7d7f414612438578063af649ccf146123fe578063b45cc46c146123bc578063b4d1d7951461239e578063bb89299214612365578063bc77666314612066578063bd48652e14612048578063c2286ab514611dac578063c3e9fff6146112c5578063c3fbcbbf146112a7578063c61a64b714611289578063cb1f626e146111d5578063cfd25070146111b7578063d4f3cc8c1461119b578063d89c6a4e14611174578063dbce286414611143578063e04dc2841461111c578063e38bf1c3146110da578063e44a25a1146108cc578063eaf5e94d1461087f578063ebf3b0561461085d578063ef2c03a0146105d3578063efa09d68146104de578063f191cf25146104c2578063f2fde38b146103e2578063f7fdc195146103bb5763fccd83dd0361000e57346103b65760803660031901126103b65761037861416d565b61038061417d565b9060443560ff81168091036103b65760ff80938161039c61418d565b946103a5614286565b166025551660265560275516602855005b600080fd5b346103b65760003660031901126103b657602061ffff62010000601e540416604051908152f35b346103b65760203660031901126103b6576103fb614094565b610403614286565b600160a060020a038091169081156104555760009182549181600160a060020a0319841617845560405192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08484a3f35b608460405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346103b65760003660031901126103b657602060405160038152f35b346103b65760403660031901126103b65767ffffffffffffffff6004358181116103b6576105109036906004016141ae565b916024359081116103b6576105299036906004016141ae565b610534929192614286565b8084036103b65760005b61ffff90818116868110156100195760ff8061056361055e84888b6142f4565b614304565b161515806105b9575b156103b6576105b49361059661059161058961055e868a8d6142f4565b948b8a6142f4565b614312565b16600052600d6020526040600020911660ff198254161790556142e1565b61053e565b506003816105cb61055e85898c6142f4565b16111561056c565b346103b65760203660031901126103b65760006102206040516105f5816140aa565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015282610120820152826101408201528261016082015282610180820152826101a0820152826101c0820152826101e08201528261020082015201526004356000526014602052604060002060405190610680826140aa565b60ff8154169060048210156108445782600d6102209284610240965260018101546020840152600281015460408401526003810154606084015260048101546080840152600581015460a084015261ffff68010000000000000000600683015482811660c0870152826201000082041660e08701528264010000000082041661010087015282660100000000000082041661012087015204166101408401526007810154610160840152600881015461018084015260098101546101a0840152600a8101546101c0840152600b8101546101e0840152600c810154610200840152015482820152610774604051809461421a565b6020810151602084015260408101516040840152606081015160608401526080810151608084015260a081015160a084015261ffff60c08201511660c084015261ffff60e08201511660e084015261ffff6101008201511661010084015261ffff6101208201511661012084015261ffff610140820151166101408401526101608101516101608401526101808101516101808401526101a08101516101a08401526101c08101516101c08401526101e08101516101e08401526102008101516102008401520151610220820152f35b60e060020a634e487b7102600052602160045260246000fd5b346103b65760003660031901126103b657602061ffff601e5416604051908152f35b346103b65760403660031901126103b657600160a060020a036108a0614094565b1660005260126020526040600020602435600052602052602060ff604060002054166040519015158152f35b346103b6576020806003193601126103b65760043567ffffffffffffffff81116103b6576108fe9036906004016141ae565b9060026001936109118286541415614321565b8185553233036110935760005b8481106109a657505050600160a060020a03600c541691823b156103b65761097a92600092836040518096819582947fb25ada4a0000000000000000000000000000000000000000000000000000000084523360048501615b68565b03925af1801561099a5761098d57508055005b610996906140c7565b8055005b6040513d6000823e3d90fd5b600160a060020a03906005918083541692846109c6610591858b8b6142f4565b94604051918280927f6352211e00000000000000000000000000000000000000000000000000000000825261ffff809916600483015260249384915afa91821561099a578b92610a2291600091611066575b5085163314615563565b85610a31610591878d8d6142f4565b16600052600d8088528a8a60ff85816040600020541614600014610bb55750610a62945061059193508792506142f4565b938085169283600052600f875260406000209260ff19938c858254161790553360005260188852610a97856040600020615c13565b50846000526016885260406000209361ffff19948686825416179055610ac1336040600020615b95565b6001605060020a034216610ad9816040600020615bde565b8a604060002001558c80604060002001918254161790555416803b156103b657610b2360009691879260405198898094819360e160020a63214217070283523033600485016155be565b03925af194851561099a57610ba195610ba6575b50601e80548383610b498184166142e1565b1691161790553360005260178652604060002091825491610b6b8184166142e1565b1691161790556040519081527fd802514fd936498a53cd337f77b6e9640c9d5498cc5b68b4b65c084e07f20e4d843392a261444b565b61091e565b610baf906140c7565b8a610b37565b89610bc96105918b86869e9a9b9c9e6142f4565b16600052838b528b816040600020541614600014610dc15750610bf4935061059192509087916142f4565b94808287169485600052600f8952604060002060ff199086828254161790553360005260188a52610c29876040600020615c13565b508660005260168a528a60406000209661ffff19978989825416179055610c54336040600020615b95565b6001605060020a034216610c6c816040600020615bde565b8260406000200155604060002001918254161790555416816003541690803b156103b65787600091610cb9938360405180968195829460e160020a632142170702845233600485016155be565b03925af1801561099a57610db2575b5060095416803b156103b657610d136000969187926040519889809481937f69011e590000000000000000000000000000000000000000000000000000000083523360048401615c89565b03925af194851561099a57610ba195610da3575b50601e805463ffff00006201000084610d4381838604166142e1565b1602169063ffff000019161790553360005260178652604060002091825491610d6d8184166142e1565b1691161790556040519081527fb65f51b46c524ff76c3c55bce9afabbc5498259647f2cd6aaec9797675ce4628843392a261444b565b610dac906140c7565b8a610d27565b610dbb906140c7565b8b610cc8565b85610dd66105918b86869e999e9c989c6142f4565b16600052878b5260039788826040600020541614600014610fec57505061059188859493610e03936142f4565b978489169687600052600f8b5260406000209060ff199188838254161790553360005260188c52610e38896040600020615c13565b503360005260198c52610e4f896040600020615c13565b508860005260168c5260406000209761ffff19988a8a825416179055610e79336040600020615b95565b610e906001605060020a0342166040600020615bde565b60406000200191825416179055548a604060002001555416816004541690803b156103b65787600091610ede938360405180968195829460e160020a632142170702845233600485016155be565b03925af1801561099a57610fdd575b50600a5416803b156103b657610f386000969187926040519889809481937fd848e38d0000000000000000000000000000000000000000000000000000000083523360048401615c89565b03925af194851561099a57610ba195610fce575b50601e805465ffff0000000064010000000084610f6c81838604166142e1565b1602169065ffff0000000019161790553360005260178652604060002091825491610f988184166142e1565b1691161790556040519081527fbfbdfc645118cc5e75423b90768a0df736730d0b2cb1528e4e07a5689a4b4325843392a261444b565b610fd7906140c7565b8a610f4c565b610fe6906140c7565b8b610eed565b965096506110049350610591925090879897916142f4565b16600052845260406000205416156110205750610ba19061444b565b82600b6064926040519260e560020a62461bcd02845260048401528201527f696e76616c6964204e46540000000000000000000000000000000000000000006044820152fd5b6110869150893d8b1161108c575b61107e81836140db565b810190615b49565b8d610a18565b503d611074565b6064906040519060e560020a62461bcd0282526004820152601860248201527f6163636f756e7420746f2073656e64206d69736d6174636800000000000000006044820152fd5b346103b65760203660031901126103b657600160a060020a036110fb614094565b611103614286565b16600160a060020a031960075416176007556000604051f35b346103b65760003660031901126103b6576020600160a060020a0360035416604051908152f35b346103b65761116e6111543661424a565b9161116460026001541415614321565b60026001556155e3565b60018055005b346103b65760003660031901126103b6576020600160a060020a0360025416604051908152f35b346103b65760003660031901126103b657602060405160018152f35b346103b65760003660031901126103b6576020602554604051908152f35b346103b65760403660031901126103b6576111ee614094565b600160a060020a036024359116908160005260109060209082825260406000208160005282526040600020549161122483614387565b9360005b848110611241576040518061123d88826140fd565b0390f35b6112849087600052828452604060002085600052845261ffff600861126a836040600020614227565b9054910260020a90041661127e82896143b9565b5261444b565b611228565b346103b65760003660031901126103b6576020602754604051908152f35b346103b65760003660031901126103b6576020602654604051908152f35b346103b65760803660031901126103b65760043567ffffffffffffffff81116103b6576112f69036906004016141ae565b906112ff61418d565b9161130f60026001541415614321565b60026001556024356000526014602052600360406000200154421015611d6557601f5460243511611d1e5760246020600160a060020a0360085416604051928380927f70a082310000000000000000000000000000000000000000000000000000000082523360048301525afa90811561099a57600091611cec575b50611398826044356143cc565b11611ca557600160ff8416148015611c9a575b15611c5357602435600052601460205260ff60406000205416600481101561084457600103611c0c576024356000526014602052600460406000200154604435101580611bf8575b15611bb15761140861ffff82166044356143cc565b9160005b61ffff8316811061141d5760018055005b61ffff61142e6105918386866142f4565b16600052601660205261145533600160a060020a0362010000604060002054041614615563565b61ffff6114666105918386866142f4565b16600052600d602052600160ff6040600020541614600014611878576114906105918285856142f4565b61ffff811680600052600f6020526114af60ff60406000205416615e82565b8060005260166020526114d633600160a060020a0362010000604060002054041614615563565b33600052601060205260406000206024356000526020526114fb826040600020615ed0565b600090815260116020908152604080832060243584528252808320805473ffffffffffffffffffffffffffffffffffffffff1916331781556044356001820181905560029091018054630100000061ffff979097166101000262ffff001660ff8d1663ffffffff1990921691909117179590951790945560149091529020600701805490916115899161445a565b905560243560005260146020526006604060002001805461ffff6115ae8183166142e1565b169061ffff19161790555b6024356000526014602052600c6040600020016115d785825461445a565b905560ff85166117f6576024356000526014602052611646600660406000200161161561ffff861661ffff6801000000000000000084540416615e6c565b69ffff00000000000000006801000000000000000061ffff8454931602169069ffff00000000000000001916179055565b6024356000526014602052600b60406000200161166485825461445a565b90555b33600052601280602052604060002060243560005260205260ff604060002054161561175a575b50600160a060020a036008541690813b156103b657600060405180937f79cc67900000000000000000000000000000000000000000000000000000000082528183816116de8b3360048401614467565b03925af191821561099a576117469261174b575b5060405185815260ff8716602082015260608060408301527f5a3db6510032b64412a2f3d5c89c6db2b4c5bc72ee45f901e12586282eaafaf2602435928061173e339482018a8a6143df565b0390a361444b565b61140c565b611754906140c7565b866116f2565b3360005260205260406000206024356000526020526040600020600160ff198254161790553360005260156020526040600020805490680100000000000000008210156117dd57816117b49160016117d59401815561413c565b6024929192359083549060080260020a918260000392839102169119161790565b90558561168e565b60e060020a634e487b7102600052604160045260246000fd5b6024356000526014602052611853600660406000200161182861ffff861661ffff660100000000000084540416615e6c565b67ffff000000000000660100000000000061ffff8454931602169067ffff0000000000001916179055565b6024356000526014602052600a60406000200161187185825461445a565b9055611667565b61ffff6118896105918386866142f4565b16600052600d602052600260ff60406000205416146000146119fb576118b36105918285856142f4565b61ffff811680600052600f6020526118d260ff60406000205416615e82565b8060005260166020526118f933600160a060020a0362010000604060002054041614615563565b336000526010602052604060002060243560005260205261191e826040600020615ed0565b600090815260116020908152604080832060243584528252808320805473ffffffffffffffffffffffffffffffffffffffff1916331781556044356001820181905560029091018054630200000061ffff979097166101000262ffff001660ff8d1663ffffffff1990921691909117179590951790945560149091529020600801805490916119ac9161445a565b905560243560005260146020526119f660066040600020016119d761ffff62010000835404166142e1565b63ffff00006201000061ffff8454931602169063ffff00001916179055565b6115b9565b61ffff611a0c6105918386866142f4565b16600052600d602052600360ff6040600020541614600014611b8157611a366105918285856142f4565b61ffff811680600052600f602052611a5560ff60406000205416615e82565b806000526016602052611a7c33600160a060020a0362010000604060002054041614615563565b3360005260106020526040600020602435600052602052611aa1826040600020615ed0565b600090815260116020908152604080832060243584528252808320805473ffffffffffffffffffffffffffffffffffffffff1916331781556044356001820181905560029091018054630300000061ffff979097166101000262ffff001660ff8d1663ffffffff199092169190911717959095179094556014909152902060090180549091611b2f9161445a565b905560243560005260146020526119f66006604060002001611b5c61ffff640100000000835404166142e1565b65ffff0000000064010000000061ffff8454931602169065ffff000000001916179055565b61ffff611b926105918386866142f4565b16600052600d60205260ff604060002054166119f6576117469061444b565b606460405160e560020a62461bcd02815260206004820152601560248201527f426574206e6f742077697468696e206c696d69747300000000000000000000006044820152fd5b5060056040600020015460443511156113f3565b606460405160e560020a62461bcd02815260206004820152600860248201527f6e6f74206f70656e0000000000000000000000000000000000000000000000006044820152fd5b606460405160e560020a62461bcd02815260206004820152600e60248201527f496e76616c69642063686f6963650000000000000000000000000000000000006044820152fd5b5060ff8316156113ab565b606460405160e560020a62461bcd02815260206004820152601060248201527f6e6f7420656e6f75676820544f504941000000000000000000000000000000006044820152fd5b90506020813d602011611d16575b81611d07602093836140db565b810103126103b657518461138b565b3d9150611cfa565b606460405160e560020a62461bcd02815260206004820152601960248201527f4e6f6e2d6578697374656e7420656e63696572726f20696421000000000000006044820152fd5b606460405160e560020a62461bcd02815260206004820152601160248201527f42657474696e672068617320656e6465640000000000000000000000000000006044820152fd5b346103b6576020806003193601126103b657611dc6614094565b600160a060020a03600091168060005260189081845260406000205490601a92838652604060002054926000915b87828410611e845750505050600092602754915b86848610611e1857604051878152f35b859662015180611e6e86611e6961ffff601b611e7597611e4a8a9b9c9d9e611e7b9b6000528d8352604060002061413c565b939054600860029502850a9004166000525260406000200154426155b1565b6143cc565b049061445a565b9561444b565b93929190611e08565b61ffff9192939785600098969852838252611ea389604060002061413c565b939054600860029502850a9004169283600052600d835260ff936001856040600020541614600014611f6457602a54611f1a95506001605060020a0316428110611f245750611f0b62015180926016611f1496611e6e946000525260406000200154426155b1565b602554906143cc565b9661444b565b9190949294611df4565b92935060005260168b5281816040600020015410600014611f5c57611e6e611f0b611f149493620151809360406000200154906155b1565b50509661444b565b60406000205485168203611ff457602a54611f1a95506001605060020a0316428110611fbc5750611fae62015180926016611f1496611e6e946000525260406000200154426155b1565b602654906143cc565b61444b565b92935060005260168b5281816040600020015410600014611f5c57611e6e611fae611f149493620151809360406000200154906155b1565b5091509160038160406000205416146000146120315750611f1a9161202b611f14926024549060168d5260406000200154906155b1565b9061445a565b611f1a9298915060406000205416611fb75761444b565b346103b65760003660031901126103b6576020602954604051908152f35b346103b6576020806003193601126103b6576004359061208b60026001541415614321565b600260015561209b333b15615aad565b6120a6323314615afb565b601f80549283811161231e578060005260149081845260ff604060002054166004811015610844576122d8578394600494600160a060020a0360075416604051968780927f8bf9e8f00000000000000000000000000000000000000000000000000000000082525afa94851561099a576000956122a9575b5060005281855260406000209260ff19936002858254161790558415908160001461223f57805460009081528488526040808220600d0191909155815481516001605060020a034216815260208101919091527f09bf8afaf5f2bd9a17bd7354d426827e4642bd8e64e211eac7e17ff441b9ae4c9190a15b547f9657f8dd92b97e9c1270aafaebd29b77fd358c4ae01bb2240927acd9f6e9cbc287604051888152a28160005282865284600d6040600020015560001461221f57806000528185526122006127106121fa600a60406000200154602854906143cc565b04615f13565b6000528352600360406000209182541617905560018055604051908152f35b61223a6127106121fa600b60406000200154602854906143cc565b612200565b80546000526001600d604060002001557f3f661213bbe0426ad65addd1512e2292027a0ffc14b71d920e5d9217a46859166122a182546040519182916001605060020a03421683602090939291936001605060020a0360408201951681520152565b0390a1612196565b9094508581813d83116122d1575b6122c181836140db565b810103126103b65751938661211e565b503d6122b7565b606484836040519160e560020a62461bcd028352600483015260248201527f6d75737420626520636c6f7365642066697273740000000000000000000000006044820152fd5b6064836040519060e560020a62461bcd0282526004820152601460248201527f4e6f6e6578697374656e742073657373696f6e210000000000000000000000006044820152fd5b61123d61238e6123743661424a565b9161238460026001541415614321565b6002600155614482565b60018055604051918291826140fd565b346103b65760003660031901126103b6576020604051620151808152f35b346103b65760203660031901126103b657600160a060020a036123dd614094565b6123e5614286565b16600160a060020a0319600c541617600c556000604051f35b346103b65760203660031901126103b65761ffff61241a61419d565b16600052600f602052602060ff604060002054166040519015158152f35b346103b65760603660031901126103b657612451614094565b600160a060020a0360443591166000526010602052604060002060243560005260205260406000209081548110156103b65761249261ffff91602093614227565b9190546008604051930260020a9004168152f35b346103b65760203660031901126103b65760206124c96124c461419d565b615d20565b604051908152f35b346103b65760003660031901126103b6576020602854604051908152f35b346103b65760203660031901126103b65761ffff61250b61419d565b16600052600d602052602060ff60406000205416604051908152f35b346103b65760203660031901126103b65761ffff61254361419d565b16600052601b602052602062015180612570612567600260406000200154426155b1565b602754906143cc565b04604051908152f35b346103b65760003660031901126103b6576020600160a060020a0360005416604051908152f35b346103b65760203660031901126103b65761ffff806125bd61419d565b16600052601b602052604060002061123d815491600260ff6001830154169101549060405194846001605060020a0360b060020a8897041691600160a060020a03620100008304169116866141de565b346103b6576020806003193601126103b657600160a060020a0361262f614094565b16908160005260188082526040600020549161264a83614387565b9360005b848110612663576040518061123d88826140fd565b612681908260005284845261ffff600861126a83604060002061413c565b61264e565b346103b65760403660031901126103b657600160a060020a036126a7614094565b1660005260136020526040600020602435600052602052602060ff604060002054166040519015158152f35b346103b65760403660031901126103b6576126ec614286565b600435602255602435602155005b346103b65760003660031901126103b6576020602b54604051908152f35b346103b65760203660031901126103b6576004356001605060020a0381168091036103b657612745614286565b6001605060020a031960205416176020556000604051f35b346103b65760003660031901126103b657602060405160028152f35b346103b65760203660031901126103b657600160a060020a0361279a614094565b6127a2614286565b16600160a060020a031981816002541617600255600b541617600b556000604051f35b346103b65760003660031901126103b657602061ffff6601000000000000601e540416604051908152f35b346103b65760003660031901126103b657612809614286565b60008054600160a060020a03198116825581600160a060020a0360405192167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08284a3f35b346103b65760003660031901126103b6576020600160a060020a03600c5416604051908152f35b346103b6576020806003193601126103b6576004359061289a60026001541415614321565b6002600155816000526014815260ff60406000205416600481101561084457600103612a6a578160005260148152600360406000200154421115612a2357600160a060020a036007541690813b156103b657600080926004604051809581937fe0c862890000000000000000000000000000000000000000000000000000000083525af190811561099a577ff19bd3fe902a0974137a220994e6406b7fabc07afde18fa74526159d88ac14109261018092612a14575b50600084815260148252604090819020805460ff191681556006810154600782015460088301546009840154600a850154600b860154600c90960154875142815261ffff8781169a82019a909a526201000087048a169881019890985264010000000086048916606089015266010000000000008604891660808901526801000000000000000090950490971660a087015260c086019290925260e0850152610100840152610120830193909352610140820152610160810191909152a260018055005b612a1d906140c7565b84612950565b6064906040519060e560020a62461bcd0282526004820152600c60248201527f6e6f74206f7665722079657400000000000000000000000000000000000000006044820152fd5b6064906040519060e560020a62461bcd0282526004820152601260248201527f6d757374206265206f70656e20666972737400000000000000000000000000006044820152fd5b346103b65760003660031901126103b6576020602154604051908152f35b346103b65760203660031901126103b657600160a060020a03612af0614094565b612af8614286565b16600160a060020a031960085416176008556000604051f35b346103b65760203660031901126103b65760ff612b2c61416d565b16600052600e602052602060ff60406000205416604051908152f35b346103b65760003660031901126103b6576020600160a060020a0360055416604051908152f35b346103b65760203660031901126103b657612b88614286565b600435602b55005b346103b65760403660031901126103b65760a061ffff80612baf61419d565b166000526011602052604060002060243560005260205260ff63010000006040600020600160a060020a0381541693600260018301549201549160405195865260208601528382166040860152610100820416606085015204166080820152f35b346103b65760003660031901126103b6576020602254604051908152f35b346103b65760203660031901126103b65760043560005260146020526040600020805460ff169060018101549060028101546003820154600483015460058401546006850154600786015490600887015492600988015494600a89015496600b8a015498600c8b01549a600d01549b604051612cac819f829061421a565b6020015260408d015260608c015260808b015260a08a015261ffff9081811660c08b0152816201000082041660e08b0152816401000000008204166101008b01528166010000000000008204166101208b0152680100000000000000009004166101408901526101608801526101808701526101a08601526101c08501526101e084015261020083015261022082015261024090f35b346103b65760203660031901126103b657600160a060020a03612d63614094565b16600052601d602052602061ffff60406000205416604051908152f35b346103b65760003660031901126103b6576020600160a060020a0360045416604051908152f35b346103b65760203660031901126103b65761ffff80612dc461419d565b166000526016602052604060002061123d815491600260ff6001830154169101549060405194846001605060020a0360b060020a8897041691600160a060020a03620100008304169116866141de565b346103b65760203660031901126103b657600160a060020a03612e35614094565b166000526017602052602061ffff60406000205416604051908152f35b346103b65760203660031901126103b657600160a060020a03612e73614094565b1660005260156020526020604060002054604051908152f35b346103b65760003660031901126103b65760206001605060020a03602a5416604051908152f35b346103b65760003660031901126103b657612ed360026001541415614321565b6002600155612ee3333b15615aad565b612eee323314615afb565b600060015b336000526015602052604060002054811161347c578060005260148060205260ff6040600020541660048110156108445760031480613457575b80613433575b15613429578160005260205260ff600d604060002001541690600182116133e2576000925b33600052601060205260406000208260005260205260406000205461ffff851610156133ac5733600052601060205260406000208260005260205261ffff6008612fa6866040600020614227565b919054910260020a9004166000526011602052604060002082600052602052612fde33600160a060020a036040600020541614615563565b33600052601060205260406000208260005260205261ffff6008613006866040600020614227565b919054910260020a90041660005260116020526040600020826000526020528260ff60026040600020015416148061334a575b156130d85733600052601060205260406000208260005260205261ffff6008613066866040600020614227565b919054910260020a90041660005260116020526040600020826000526020526001604060002001549060059082600019048211831515166130bf5760046130b3926130b99402049061445a565b936142e1565b92612f58565b60e060020a634e487b7102600052601160045260246000fd5b33600052601060205260406000208260005260205261ffff6008613100866040600020614227565b919054910260020a90041660005260116020526040600020826000526020528260ff6002604060002001541614806132e9575b156131ac5733600052601060205260406000208260005260205261ffff6008613160866040600020614227565b919054910260020a90041660005260116020526040600020826000526020526001604060002001548060001904600311811515166130bf576130b991600260036130b39302049061445a565b33600052601060205260406000208260005260205261ffff60086131d4866040600020614227565b919054910260020a90041660005260116020526040600020826000526020528260ff600260406000200154161480613287575b1561327d5733600052601060205260406000208260005260205261ffff6008613234866040600020614227565b919054910260020a90041660005260116020526040600020826000526020526001604060002001548060001904600211811515166130bf576130b99160026130b392029061445a565b926130b9906142e1565b5033600052601060205260406000208260005260205261ffff60086132b0866040600020614227565b919054910260020a9004166000526011602052604060002082600052602052600360ff6301000000600260406000200154041614613207565b5033600052601060205260406000208260005260205261ffff6008613312866040600020614227565b919054910260020a9004166000526011602052604060002082600052602052600260ff63010000008260406000200154041614613133565b5033600052601060205260406000208260005260205261ffff6008613373866040600020614227565b919054910260020a9004166000526011602052604060002082600052602052600160ff6301000000600260406000200154041614613039565b92506133dd91503360005260136020526040600020816000526020526040600020600160ff1982541617905561444b565b612ef3565b606460405160e560020a62461bcd02815260206004820152601360248201527f496e76616c696420666c697020726573756c74000000000000000000000000006044820152fd5b506133dd9061444b565b5033600052601260205260406000208260005260205260ff60406000205416612f33565b5033600052601360205260406000208260005260205260ff6040600020541615612f2d565b50600160a060020a038060085416803b156103b6576000604051809260e060020a6340c10f190282528183816134b6893360048401614467565b03925af1801561099a57613547575b50600c5416803b156103b6576000604051809260e060020a631fb2e3e70282528183816134f6883360048401614467565b03925af1801561099a57613538575b506040519081527fb402c6d77caa27df743a19982227280843cca089045e00034230e9267f0da25e60203392a260018055005b613541906140c7565b81613505565b613550906140c7565b826134c5565b346103b6576020806003193601126103b65760043567ffffffffffffffff81116103b6576135889036906004016141ae565b9060019261359a600285541415614321565b600284553332036138bd57426001605060020a03169060005b84811061360f57505050600160a060020a03600c541691823b156103b65761097a92600092836040518096819582947fdca3b79e0000000000000000000000000000000000000000000000000000000084523360048501615b68565b600160a060020a0390816006541660248461362e610591858b8b6142f4565b92604051928380927f6352211e00000000000000000000000000000000000000000000000000000000825261ffff80971660048301525afa801561099a57613682916000916138a0575b5084163314615563565b80613691610591848a8a6142f4565b16600052601c845260406000209260ff1993898582541617905533600052601a85526136d16040600020836136ca610591878d8d6142f4565b1690615c13565b506136e0610591848a8a6142f4565b93826136f0610591868c8c6142f4565b16600052601b865260406000208361ffff199616868254161790558261371a610591868c8c6142f4565b16600052601b8652613730336040600020615b95565b8261373f610591868c8c6142f4565b16600052601b8652613755876040600020615bde565b82613764610591868c8c6142f4565b16600052601b86528660026040600020015582613785610591868c8c6142f4565b16600052601b86528960406000200190815416905560065416926137ad610591848a8a6142f4565b93803b156103b6576137df60009591869260405197888094819360e160020a63214217070283523033600485016155be565b03925af193841561099a5761388c94613891575b50601e805467ffff00000000000066010000000000008561381781838604166142e1565b1602169067ffff000000000000191617905533600052601d8552604060002090815490836138468184166142e1565b16911617905561385a6105918389896142f4565b90604051911681527f01135a8893e368a4f0eea30fdad456110cd3ffafa9db6e154aba1319627ceb09843392a261444b565b6135b3565b61389a906140c7565b896137f3565b6138b79150863d881161108c5761107e81836140db565b8a613678565b6064906040519060e560020a62461bcd0282526004820152600860248201527f4f6e6c7920454f410000000000000000000000000000000000000000000000006044820152fd5b346103b65760203660031901126103b65761ffff61392061419d565b16600052601c602052602060ff604060002054166040519015158152f35b346103b65760003660031901126103b6576020600160a060020a0360065416604051908152f35b346103b65760203660031901126103b657600160a060020a03613986614094565b61398e614286565b16600160a060020a031981816004541617600455600a541617600a556000604051f35b346103b65760003660031901126103b657602061ffff640100000000601e540416604051908152f35b346103b65760003660031901126103b6576020601f54604051908152f35b346103b65760203660031901126103b6576004356001605060020a0381168091036103b657613a25614286565b6001605060020a0319602a541617602a556000604051f35b346103b65760003660031901126103b65760206001605060020a03815416604051908152f35b346103b65760403660031901126103b657613a7c61416d565b613a8461417d565b90613a8d614286565b600e6020527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c805460ff92831660ff199182161790915560016000527fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be9582078054939092169216919091179055005b346103b65760403660031901126103b657613b13614094565b600160a060020a0360243591166000526015602052604060002080548210156103b657602091613b429161413c565b90546008604051920260020a90048152f35b346103b6576020806003193601126103b657600160a060020a03613b76614094565b169081600052601a80825260406000205491613b9183614387565b9360005b848110613baa576040518061123d88826140fd565b613bc8908260005284845261ffff600861126a83604060002061413c565b613b95565b346103b65760803660031901126103b657613be6614094565b50602435600160a060020a038116036103b65767ffffffffffffffff6064358181116103b657366023820112156103b65780600401359182116117dd5760405191613c3b601f8201601f1916602001846140db565b80835236602482840101116103b657600092816024602094018483013701015260206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b60603660031901126103b657613ca060026001541415614321565b6002600155601f5480158015614024575b15613fdd57613cc2426004356155b1565b602254111580613fc6575b15613f7f57602b543403613f3857613ce49061444b565b80601f5560405190613cf5826140aa565b600182528060208301524260408301526004356060830152602435608083015260443560a0830152600060c0830152600060e08301526000610100830152600061012083015260006101408301526000610160830152600061018083015260006101a083015260006101c083015260006101e08301526000610200830152600261022083015260005260146020526040600020908051600481101561084457825460ff9190911660ff199091161782556020810151600183015560408101516002830155606081015160038301556080810151600483015560a0810151600583015560c081015160068301805460e084015161010085015161012086015161014087015169ffff000000000000000061ffff91821668010000000000000000021691811666010000000000000267ffff000000000000169281166401000000000265ffff0000000016620100009482169490940263ffff000016961669ffffffffffffffffffff1990941693909317949094171792909217919091179055600d9061022090610160810151600785015561018081015160088501556101a081015160098501556101c0810151600a8501556101e0810151600b850155610200810151600c85015501519101556000808080600160a060020a036002541681903415613f2e575b3491f11561099a57601f547f8dc39708566b7945376021b1bdb90c66a5b3b63ba0455223bd3782f357ac60026080604051428152600435602082015260243560408201526044356060820152a260018055005b6108fc9150613edb565b606460405160e560020a62461bcd02815260206004820152601160248201527f7365656420636f7374206e6f74206d65740000000000000000000000000000006044820152fd5b606460405160e560020a62461bcd02815260206004820152600c60248201527f696e76616c69642074696d6500000000000000000000000000000000000000006044820152fd5b50613fd3426004356155b1565b6021541015613ccd565b606460405160e560020a62461bcd02815260206004820152601560248201527f73657373696f6e206e6f7420636c61696d61626c6500000000000000000000006044820152fd5b5080600052601460205260ff60406000205416600481101561084457600314613cb1565b346103b65760203660031901126103b657600160a060020a03614069614094565b614071614286565b16600160a060020a03198181600354161760035560095416176009556000604051f35b60043590600160a060020a03821682036103b657565b610240810190811067ffffffffffffffff8211176117dd57604052565b67ffffffffffffffff81116117dd57604052565b90601f8019910116810190811067ffffffffffffffff8211176117dd57604052565b6020908160408183019282815285518094520193019160005b828110614124575050505090565b835161ffff1685529381019392810192600101614116565b80548210156141545760005260206000200190600090565b60e060020a634e487b7102600052603260045260246000fd5b6004359060ff821682036103b657565b6024359060ff821682036103b657565b6064359060ff821682036103b657565b6004359061ffff821682036103b657565b9181601f840112156103b65782359167ffffffffffffffff83116103b6576020808501948185020101116103b657565b91936001605060020a03608094600160a060020a0360ff9499989761ffff60a088019b1687521660208601521660408401521660608201520152565b9060048210156108445752565b9190918054831015614154576000526002600f6020600020601085040193160290565b60406003198201126103b6576004359067ffffffffffffffff82116103b657614275916004016141ae565b909160243580151581036103b65790565b600160a060020a0360005416330361429a57565b606460405160e560020a62461bcd02815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b61ffff8091169081146130bf5760010190565b9190811015614154576020020190565b3560ff811681036103b65790565b3561ffff811681036103b65790565b1561432857565b606460405160e560020a62461bcd02815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b67ffffffffffffffff81116117dd5760208091020190565b906143918261436f565b61439e60405191826140db565b82815280926143af601f199161436f565b0190602036910137565b8051821015614154576020809202010190565b80600019048211811515166130bf570290565b9190808252602080920192916000805b8382106143fe57505050505090565b9091929394853561ffff81168091036144245781528301948301939291600101906143ef565b8280fd5b604090600160a060020a03614448959316815281602082015201916143df565b90565b60001981146130bf5760010190565b919082018092116130bf57565b60209093929193600160a060020a0360408201951681520152565b9192916000919060608515615525575061449e82602b546143cc565b34036154de57600160a060020a039060008080808560025416819034156154d4575b3491f11561099a5781600b54166040908151907f4ea943e70000000000000000000000000000000000000000000000000000000082526020918281600481855afa9081156154c957908791600091615499575b501061542d57906000809260248551809581937f4b3c08f30000000000000000000000000000000000000000000000000000000083528b60048401525af191821561542257600092615392575b505092600c541690813b156103b6576000815180937fd8cd1ec40000000000000000000000000000000000000000000000000000000082528183816145aa8b8a3360048501614428565b03925af19081156153885750615374575b506145c583614387565b9591905b8493855b8181106146f157505050505080156146ed576145eb8160295461445a565b6029556040518181527f55d1a86a8274532ca7ac7b427c3d0ed3520c2125efbfae844d4556cf6795c2bf60203392a2600160a060020a038060085416803b156146e95783604051809260e060020a6340c10f19028252818381614652893360048401614467565b03925af180156146de579084916146ca575b5050600c541690813b15614424576146998392839260405194858094819360e060020a631fb2e3e70283523360048401614467565b03925af180156146bf576146ab575050565b6146b582916140c7565b6146bc5750565b80fd5b6040513d84823e3d90fd5b6146d3906140c7565b614424578238614664565b6040513d86823e3d90fd5b8380fd5b5050565b909192939461ffff6147076105918486886142f4565b168752600d80602052600160ff60408a20541614600014614bb75750604090876147356105918587896142f4565b8815614bb15761474585896143b9565b515b61ffff8216808452601690816020526147a661479b600160a060020a039661477a88620100008c84205404163314615563565b8381528460205260b060020a6001605060020a039a8b9220540416426155b1565b886020541610615ca7565b8c80928d89602a541680421115600014614b6f575050828252806020528d620151806147dc611f0b6002604087200154426155b1565b04995b8115614b4657505082604083614827938360209998979652600f895282822060ff19815416905588526000600283832082815582600182015501553381526018885220615994565b508560095416604051948580927f516d60bc00000000000000000000000000000000000000000000000000000000825260049788915afa908115614b39578f99989796959493929161ffff918b91614b0a575b5016151580614aee575b15614a2b5750506020906024856009541691604051998a9384927fc03e3686000000000000000000000000000000000000000000000000000000008452878401525af19586156149fb578c96614a0a575b50826005541690813b15614a06578261490c92888f80946040519687958694859360e160020a6321421707028552309085016155be565b03925af180156149fb578b98979695949392918d916149d2575b5050916149b2959493916149a69394168c7f06b1110002490d9c1456210289425dc07e72b88a1274054bc107a56ee08340b43391604051a35b601e80549061ffff614972818416615d0f565b1661ffff19809316179055338d52601760205260408d209081549061ffff61499b818416615d0f565b16911617905561445a565b976149bb575b5061444b565b939291936145cd565b61ffff6149c8838d6143b9565b91169052386149ac565b6149e4919293949596979899506140c7565b6149f75790899695949392918b38614926565b8a80fd5b6040513d8e823e3d90fd5b8c80fd5b614a2491965060203d60201161108c5761107e81836140db565b94386148d5565b94915096506005541690813b15614a0657918c91614a65938360405180968195829460e160020a63214217070284523390309085016155be565b03925af18015614ae3578a979695949392918c91614abc575b5050916149a6916149b29594936040519081527f5e0a9adf9530fdb8889d2e1f6449a9f4a2f2881dbe5b19d75fa2a0f33b3462b960203392a261495f565b614acd9192939495969798506140c7565b614adf57908895949392918a38614a7e565b8980fd5b6040513d8d823e3d90fd5b5060018952600e60205260ff60408a2054166064840610614884565b614b2c915060203d602011614b32575b614b2481836140db565b810190615cf5565b3861487a565b503d614b1a565b8f604051903d90823e3d90fd5b909b9a989497506149a696506149b299955060409183946002945260205242169220015561445a565b84845282602052600290808260408720015410600014614ba857611f0b614ba1916201518093604088200154906155b1565b04996147df565b505082996147df565b81614747565b61ffff614bc86105918587896142f4565b16885280602052600260ff60408a2054161460001461507b5750614bf06105918385876142f4565b861561507457614c0083876143b9565b51915b61ffff821689526016602052614c2c600160a060020a036201000060408c205404163314615563565b61ffff821689526016602052614c6a614c586001605060020a0360b060020a60408d20540416426155b1565b6001605060020a036020541610615ca7565b8891896001605060020a03602a5416804211156000146150305750614ca9611fae60026040620151809461ffff871681526016602052200154426155b1565b04925b898015614fff575061ffff82168b52600f60205260408b2060ff19815416905560166020526000600260408d208281558260018201550155338b526018602052614cfd61ffff831660408d20615994565b5060046020600160a060020a03600a5416604051928380927fd885ce610000000000000000000000000000000000000000000000000000000082525afa9081156149fb579061ffff918d91614fe0575b5016151580614fc4575b15614ef757506020600160a060020a03600a5416946024604051809781937feba9bb2d00000000000000000000000000000000000000000000000000000000835260048301525afa938415614eec578a94614ecb575b50600160a060020a0360095416803b156149f7578a60405180927f8f5ff5cc000000000000000000000000000000000000000000000000000000008252818381614dfb888c60048401615c89565b03925af18015614ae3578a979695949392918c91614ea8575b5050916149a691600160a060020a036149b29695168c7fdfe086ffa31eb2411029ef981d5f6924ac6c1b8384b01c085d7ec75776d701133391604051a35b601e805463ffff00006201000061ffff614e6f8183860416615d0f565b1602169063ffff00001916179055338c52601760205260408c20805461ffff614e99818316615d0f565b169061ffff191617905561445a565b614eb99192939495969798506140c7565b614adf57908895949392918a38614e14565b614ee591945060203d60201161108c5761107e81836140db565b9238614dad565b6040513d8c823e3d90fd5b9350600160a060020a0360095416803b156149f7578a60405180927fcda2d9dc000000000000000000000000000000000000000000000000000000008252818381614f46883360048401615c89565b03925af18015614ae3578a979695949392918c91614fa1575b5050916149a6916149b295949361ffff604051911681527f99a3889316e5f428bc3b6a66ef1be5baa20746deea093c4e4a9e0f12dff0d9f060203392a2614e52565b614fb29192939495969798506140c7565b614adf57908895949392918a38614f5f565b5060028b52600e60205260ff60408c2054166064860610614d57565b614ff9915060203d602011614b3257614b2481836140db565b38614d4d565b96959390926149b2955061ffff6149a693168c5260166020528b600260406001605060020a0342169220015561445a565b61ffff8316825260166020528060026040842001541060001461506d57611fae61506691600260406201518095200154906155b1565b0492614cac565b5092614cac565b8791614c03565b61ffff61508c6105918587896142f4565b16885280602052600360ff60408a205416146000146152fb57506150b46105918385876142f4565b9061ffff821688526016602052600160a060020a03916150e0836201000060408c205404163314615563565b61ffff81168952601660205261511a604061510f8b60b060020a6001605060020a0393849220540416426155b1565b906020541610615ca7565b6024549261ffff82168a5260166020528861513c600260408d200154866155b1565b9481156152d457505061ffff82168a52600f60205260408a2060ff19815416905560166020526000600260408c208281558260018201550155338a52601860205261518e61ffff831660408c20615994565b50338a5260196020526151a861ffff831660408c20615994565b50600a5416803b15614adf578960405180927f0f881a4d0000000000000000000000000000000000000000000000000000000082528183816151ee883360048401615c89565b03925af18015614eec57899695949392918b916152af575b50509161529e916149b29493601e805465ffff0000000064010000000061ffff6152338183860416615d0f565b1602169065ffff000000001916179055338c52601760205260408c20805461ffff61525f818316615d0f565b169061ffff191617905561ffff604051911681527f880f69f1c4d4831a8a2161f3b0e69ef0afe018c0acf4c41b060831f4977b372960203392a261445a565b961561444b578761127e828c6143b9565b6152bf91929394959697506140c7565b6152d0579087949392918938615206565b8880fd5b6149b295925061ffff61529e949897959298168c526016602052600260408d20015561445a565b61ffff6153116105918587899b9897969b6142f4565b16885260205260ff6040882054161561532d576149b29061444b565b606460405160e560020a62461bcd02815260206004820152601060248201527f496e76616c696420546f6b656e204964000000000000000000000000000000006044820152fd5b61537f9194506140c7565b600092386145bb565b513d6000823e3d90fd5b3d8084833e6153a181836140db565b81019082818303126146e95780519067ffffffffffffffff821161541e570181601f820112156146e9578051906153d78261436f565b946153e4875196876140db565b828652848080880194028301019384116146bc57508301905b82821061540f57505050503880614560565b815181529083019083016153fd565b8480fd5b83513d6000823e3d90fd5b50608491519060e560020a62461bcd0282526004820152603160248201527f4e6f7420656e6f7567682072616e646f6d206e756d626572732e20506c65617360448201527f652074727920616761696e20736f6f6e2e0000000000000000000000000000006064820152fd5b91508382813d83116154c2575b6154b081836140db565b810103126146bc575086905138614513565b503d6154a6565b84513d6000823e3d90fd5b6108fc91506144c0565b606460405160e560020a62461bcd02815260206004820152601c60248201527f496e76616c69642076616c756520666f722072616e646f6d6e657373000000006044820152fd5b90604051956040870187811067ffffffffffffffff8211176117dd5760405260018752602087016020368237875115614154576000905291906145c9565b1561556a57565b606460405160e560020a62461bcd02815260206004820152600960248201527f6e6f74206f776e657200000000000000000000000000000000000000000000006044820152fd5b919082039182116130bf57565b600160a060020a0391821681529116602082015261ffff909116604082015260600190565b600092835b8381106156d1575050505080156156ce57600160a060020a038060085416803b156103b6576000604051809260e060020a6340c10f19028252818381615632893360048401614467565b03925af1801561099a576156bf575b50600c5416803b156103b6576000604051809260e060020a631fb2e3e7028252818381615672883360048401614467565b03925af1801561099a576156b0575b506040519081527f55d1a86a8274532ca7ac7b427c3d0ed3520c2125efbfae844d4556cf6795c2bf60203392a2565b6156b9906140c7565b38615681565b6156c8906140c7565b38615641565b50565b839061ffff95866156e66105918486896142f4565b16600052601b966020888152600160a060020a03916040926157143382620100008760002054041614615563565b81615723610591888a8d6142f4565b166000528a835261574760029562015180611e6e61256789896000200154426155b1565b94859b8a8a600014615941579361576a6105918a8398999a9b9c600097986142f4565b16835285528582208281558260018201550155601e8054660100000000000090600019858383041601928584116130bf576105918a8e6157db938f969567ffff0000000000008b97886157e29b1602169067ffff000000000000191617905533600052601a8a528a600020956142f4565b1690615994565b508060065416906157f7610591888c8c6142f4565b91803b156103b65760008651809260e160020a632142170702825281838161582560049933308c85016155be565b03925af1801561593657615927575b50600c5416803b156103b657896000918a8361587f958951968795869485937fc5f5209600000000000000000000000000000000000000000000000000000000855233908501614428565b03925af180156154c9579161591396959493917f12f303115cfb46def8276dd03ba00e97c305442c3bf65667148f74e9e6fab96d93615918575b506158c8610591878c8c6142f4565b818551911681527fadd31af9b54c20c8528e24773d8aa6e3c5787ec02131bbebed49d8876fcb6821833392a25b615903610591878c8c6142f4565b16925193845286151593a361444b565b6155e8565b615921906140c7565b386158b9565b615930906140c7565b38615834565b86513d6000823e3d90fd5b849350936159786105918a6159139c7f12f303115cfb46def8276dd03ba00e97c305442c3bf65667148f74e9e6fab96d99986142f4565b1660005283526001605060020a034216908560002001556158f5565b906001820190600092818452826020526040842054801515600014615aa65760001990808201818111615a8f57835490838201918211615a7857808203615a23575b50505081548015615a0c5701906159ed828261413c565b60088254910260020a8703191690555582526020526040812055600190565b60248660e060020a634e487b710281526031600452fd5b615a636008615a35615a47948861413c565b9054910260020a90049283928761413c565b819391549060080260020a918260000392839102169119161790565b905586528460205260408620553880806159d6565b60248860e060020a634e487b710281526011600452fd5b60248760e060020a634e487b710281526011600452fd5b5050505090565b15615ab457565b606460405160e560020a62461bcd02815260206004820152601460248201527f436f6e7472616374206e6f7420616c6c6f7765640000000000000000000000006044820152fd5b15615b0257565b606460405160e560020a62461bcd02815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f7765640000000000006044820152fd5b908160209103126103b65751600160a060020a03811681036103b65790565b9392600492615b9091600160a060020a036040941687526060602088015260608701916143df565b930152565b9075ffffffffffffffffffffffffffffffffffffffff000062010000600160a060020a038454931602169075ffffffffffffffffffffffffffffffffffffffff00001916179055565b9075ffffffffffffffffffffffffffffffffffffffffffff82549160b060020a6001605060020a038319921602169116179055565b91906001830160009082825280602052604082205415600014615c835784549468010000000000000000861015615c6c5783615c5c615a47886001604098999a0185558461413c565b9055549382526020522055600190565b60248360e060020a634e487b710281526041600452fd5b50925050565b600160a060020a03909116815261ffff909116602082015260400190565b15615cae57565b606460405160e560020a62461bcd02815260206004820152601c60248201527f4d7573742077616974206d696e696d756d207374616b652074696d65000000006044820152fd5b908160209103126103b6575161ffff811681036103b65790565b61ffff1680156130bf576000190190565b600061ffff60009216808352602090600f825260409260ff848620541615615aa657600d83528385205460ff16600103615dc05750602a546001605060020a0316428110615d8b5750615d8792846016611f0b9460029462015180985252200154426155b1565b0490565b9291601691855252816002828520015410600014615dbb57615d87916002611f0b926201518095200154906155b1565b505090565b8385205460ff16600203615e315750602a546001605060020a0316428110615e015750615d8792846016611fae9460029462015180985252200154426155b1565b9291601691855252816002828520015410600014615dbb57615d87916002611fae926201518095200154906155b1565b939050600360ff848395949520541614615e4c575b50505090565b60245460169093522060020154615e649250906155b1565b388080615e46565b91909161ffff808094169116019182116130bf57565b15615e8957565b606460405160e560020a62461bcd02815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b8054680100000000000000008110156117dd57615ef291600182018155614227565b600882939254910260020a9161ffff92808402938492160216911916179055565b61ffff640100000000601e5404168015615f4a57615f37615f40926023549061445a565b0460245461445a565b6024556000602355565b50615f579060235461445a565b60235556fea2646970667358221220295e39989d072717153efe72902910460dfa51ec525ddad3430f71c437050f3a64736f6c63430008100033
Deployed Bytecode Sourcemap
618:40721:14:-:0;;;;;;;;;-1:-1:-1;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4168:34;618:40721;4168:34;;;618:40721;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;1063:62:0;;;:::i;:::-;618:40721:14;11753:30;618:40721;;11793:26;618:40721;11829:28;618:40721;;11867:24;618:40721;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;4032:25;618:40721;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;:::i;:::-;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;618:40721:14;;;2169:22:0;;;618:40721:14;;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;2573:40:0;;;;618:40721:14;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;1063:62:0;;;;;:::i;:::-;12402:34:14;;;618:40721;;;12489:3;618:40721;;;;;12466:21;;;;;;618:40721;12516:9;;;;;;;:::i;:::-;;:::i;:::-;618:40721;12516:14;;:32;;;12489:3;618:40721;;;12489:3;12588:9;12571:13;;12588:9;;;;;;:::i;:::-;12571:13;;;;:::i;:::-;;:::i;:::-;618:40721;;;12563:7;618:40721;;;;;;;;;;;;;;;12489:3;:::i;:::-;12452:12;;12516:32;12534:9;618:40721;12534:9;;;;;;;:::i;:::-;618:40721;12534:14;;12516:32;;618:40721;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12936:9;618:40721;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;3999:27;618:40721;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;-1:-1:-1;;;;;618:40721:14;;:::i;:::-;;;;2454:58;618:40721;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1744:1:1;;2325:7;618:40721:14;2317:63:1;618:40721:14;;;2325:19:1;;2317:63;:::i;:::-;618:40721:14;;;19635:9;19621:10;:23;618:40721;;;19700:20;;;;;;618:40721;;;-1:-1:-1;;;;;20214:12:14;618:40721;;20214:56;;;;;;;618:40721;;;;;;20214:56;;;;;;618:40721;20214:56;;19621:10;618:40721;20214:56;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;618:40721:14;;;20214:56;;;;:::i;:::-;618:40721;;;20214:56;618:40721;;;;;;;;;19722:3;-1:-1:-1;;;;;19749:7:14;;618:40721;;;;;19765:12;;;;;;;;:::i;:::-;618:40721;;;19749:29;;;;618:40721;19749:29;;618:40721;;;;;19749:29;;618:40721;;19749:29;;;;;;;;;;;;19741:65;19749:29;618:40721;19749:29;;;19722:3;-1:-1:-1;618:40721:14;;19621:10;19749:43;19741:65;:::i;:::-;19833:12;;;;;;;:::i;:::-;618:40721;;;19825:7;618:40721;;;;;;;;;;;;;19825:26;19821:373;2325:7:1;;;19883:12:14;;;;;;;;;;;:::i;:::-;618:40721;;;;;;;;20340:11;618:40721;;;;;;;;;;;;;;;;;19621:10;618:40721;;20377:20;618:40721;;10606:32:13;618:40721:14;;;;10606:32:13;:::i;:::-;;618:40721:14;;;20432:13;618:40721;;;;;;;;;;;;;;;;;20482:41;19621:10;618:40721;;;20482:41;:::i;:::-;-1:-1:-1;;;;;20580:15:14;618:40721;20533:63;618:40721;;;;20533:63;:::i;:::-;618:40721;;;;20606:28;618:40721;;;;;;20670:32;618:40721;;;;;;;;;20716:60;;;;;;618:40721;;;;;;;20716:60;;;;;;-1:-1:-1;;;;;20716:60:14;;20761:4;19621:10;618:40721;20716:60;;;:::i;:::-;;;;;;;;;;19722:3;20716:60;;;19821:373;20787:15;;618:40721;;;;20787:15;618:40721;;;20787:15;:::i;:::-;618:40721;;;;;;19621:10;618:40721;;20812:18;618:40721;;;;;;;;;20812:32;618:40721;;;20812:32;:::i;:::-;618:40721;;;;;;;;;;;20859:33;19621:10;;20859:33;;19722:3;:::i;:::-;19688:10;;20716:60;;;;:::i;:::-;;;;19821:373;19929:12;;;;;;;;;;;;:::i;:::-;618:40721;;;;;;;;;;;;;19921:26;19917:277;1744:1:1;;;19977:12:14;;;;;;;;;;;:::i;:::-;618:40721;;;;;;;;;20973:11;618:40721;;;;;;;;;;;;;;;;19621:10;618:40721;;21010:20;618:40721;;10606:32:13;618:40721:14;;;;10606:32:13;:::i;:::-;;618:40721:14;;;21065:13;618:40721;;;;;;;;;;;;;;;;;;21115:41;19621:10;618:40721;;;21115:41;:::i;:::-;-1:-1:-1;;;;;21213:15:14;618:40721;21166:63;618:40721;;;;21166:63;:::i;:::-;618:40721;;;;21239:28;618:40721;;;;21303:32;618:40721;;;;;;;;;;;;;21349:62;;;;;;618:40721;;;21349:62;618:40721;;;;21349:62;;;;;;-1:-1:-1;;;;;21349:62:14;;19621:10;618:40721;21349:62;;;:::i;:::-;;;;;;;;;;;19917:277;618:40721;21444:16;618:40721;;21444:49;;;;;;618:40721;;;;;;;21444:49;;;;;;618:40721;21444:49;;19621:10;618:40721;21444:49;;;:::i;:::-;;;;;;;;;;19722:3;21444:49;;;19917:277;21551:13;;618:40721;;;;;21551:13;618:40721;;;;;21551:13;:::i;:::-;618:40721;;;;;;;;;;19621:10;618:40721;;21574:18;618:40721;;;;;;;;;21574:32;618:40721;;;21574:32;:::i;:::-;618:40721;;;;;;;;;;;21621:31;19621:10;;21621:31;;19722:3;:::i;21444:49::-;;;;:::i;:::-;;;;21349:62;;;;:::i;:::-;;;;19917:277;20023:12;;;;;;;;;;;;;:::i;:::-;618:40721;;;;;;;;;;;;;;;20015:26;20011:183;20040:1;;;20074:12;;;;;;;;;;:::i;:::-;618:40721;;;;;;;;21727:11;618:40721;;;;;;;;;;;;;;;;;19621:10;618:40721;;21764:20;618:40721;;10606:32:13;618:40721:14;;;;10606:32:13;:::i;:::-;;19621:10:14;618:40721;;21819:23;618:40721;;10606:32:13;618:40721:14;;;;10606:32:13;:::i;:::-;;618:40721:14;;;21877:13;618:40721;;;;;;;;;;;;;;;;;21927:41;19621:10;618:40721;;;21927:41;:::i;:::-;21978:63;-1:-1:-1;;;;;22025:15:14;618:40721;;;;21978:63;:::i;:::-;618:40721;;;22051:32;618:40721;;;;;;;;;;;;22097:28;618:40721;;;;;;;22174:60;;;;;;618:40721;;;22174:60;618:40721;;;;22174:60;;;;;;-1:-1:-1;;;;;22174:60:14;;19621:10;618:40721;22174:60;;;:::i;:::-;;;;;;;;;;;20011:183;618:40721;22272:14;618:40721;;22272:50;;;;;;618:40721;;;;;;;22272:50;;;;;;618:40721;22272:50;;19621:10;618:40721;22272:50;;;:::i;:::-;;;;;;;;;;19722:3;22272:50;;;20011:183;22384:16;;618:40721;;;;;22384:16;618:40721;;;;;22384:16;:::i;:::-;618:40721;;;;;;;;;;19621:10;618:40721;;22410:18;618:40721;;;;;;;;;22410:32;618:40721;;;22410:32;:::i;:::-;618:40721;;;;;;;;;;;22457:34;19621:10;;22457:34;;19722:3;:::i;22272:50::-;;;;:::i;:::-;;;;22174:60;;;;:::i;:::-;;;;20011:183;20120:12;;;;;;;;;;;;;;;;:::i;:::-;618:40721;;;;;;;;;;20112:26;20108:86;;20011:183;19722:3;20011:183;19722:3;:::i;20108:86::-;618:40721;;;;;;20158:21;-1:-1:-1;;;;;20158:21:14;;618:40721;20158:21;;618:40721;;;;;;;;;20158:21;19749:29;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;618:40721;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;-1:-1:-1;;;;;618:40721:14;;:::i;:::-;1063:62:0;;:::i;:::-;618:40721:14;-1:-1:-1;;;;;618:40721:14;10756:72;618:40721;;;10756:72;618:40721;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;2484:1:1;618:40721:14;;;:::i;:::-;;2317:63:1;1744:1;2325:7;618:40721:14;2325:19:1;;2317:63;:::i;:::-;1744:1;2325:7;618:40721:14;2484:1:1;:::i;:::-;2325:7;618:40721:14;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;-1:-1:-1;;;;;738:95:14;618:40721;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;3871:1;618:40721;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;4483:31;618:40721;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;:::i;:::-;-1:-1:-1;;;;;618:40721:14;;;;;;;;19245:18;618:40721;;;;;;;;;;;;;;;;;;19305:20;;;;:::i;:::-;19339:10;618:40721;19351:10;;;;;;618:40721;;;;;;;:::i;:::-;;;;19363:3;;618:40721;;;;;;;;;;;;;;;;;19396:35;618:40721;;;;19396:35;:::i;:::-;618:40721;;;;;;;;;19382:49;;;;:::i;:::-;618:40721;19363:3;:::i;:::-;19339:10;;618:40721;;;;;;-1:-1:-1;;618:40721:14;;;;;4555:30;618:40721;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;4520:29;618:40721;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;2317:63:1;1744:1;618:40721:14;;2325:19:1;;2317:63;:::i;:::-;1744:1;618:40721:14;;;;;;32059:9;618:40721;;;;;;32059:30;618:40721;32092:15;-1:-1:-1;618:40721:14;;;32163:17;618:40721;;;32148:32;618:40721;;;;-1:-1:-1;;;;;32228:14:14;618:40721;;;;32228:45;;;;618:40721;32228:45;;32261:10;618:40721;32228:45;;618:40721;32228:45;;;;;;;618:40721;32228:45;;;618:40721;;32278:29;618:40721;;;32278:29;:::i;:::-;-1:-1:-1;618:40721:14;;;;;;32347:12;:28;;;;618:40721;;;;;;;;32059:9;618:40721;;;;;;;;;;;;;;;32412:44;618:40721;;;;;;32059:9;618:40721;;;;;;32501:29;618:40721;;;32487:43;;:90;;;618:40721;;;;32689:25;618:40721;;;;;32689:25;:::i;:::-;32729:10;618:40721;32741:16;618:40721;;;32741:16;;;;618:40721;;;;32759:3;618:40721;32800:12;;;;;;:::i;:::-;618:40721;;;32786:13;618:40721;;32778:69;32261:10;-1:-1:-1;;;;;618:40721:14;;;;;;;32786:47;32778:69;:::i;:::-;618:40721;32874:12;;;;;;:::i;:::-;618:40721;;;32866:7;618:40721;;;;;;;;;32866:26;32862:456;618:40721;;;32922:12;;;;;;:::i;:::-;618:40721;;;;;;34354:11;618:40721;;34346:46;618:40721;;;;;;34346:46;:::i;:::-;618:40721;;;32786:13;618:40721;;34402:67;32261:10;-1:-1:-1;;;;;618:40721:14;;;;;;;34410:44;34402:67;:::i;:::-;32261:10;618:40721;;34479:18;618:40721;;;;;;;;;;;34479:59;618:40721;;;;34479:59;:::i;:::-;618:40721;;;;34622:10;618:40721;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;32261:10;618:40721;;;;;-1:-1:-1;34733:41:14;;618:40721;;;1744:1:1;34848:41:14;;;618:40721;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;;;;;;;;32059:9;618:40721;;;;;35143:40;;618:40721;;35143:40;;:54;;;:::i;:::-;618:40721;;;;;;32059:9;618:40721;;35207:33;618:40721;;;35207:33;618:40721;;;35207:35;618:40721;;;35207:35;:::i;:::-;618:40721;;;;;;;;32862:456;618:40721;;;;32059:9;618:40721;;33328:42;618:40721;;;33328:42;:54;618:40721;;;33328:54;:::i;:::-;618:40721;;;;;;;;;;;32059:9;618:40721;;33433:65;:49;618:40721;;;33433:49;:65;618:40721;;;;;;;;;33433:65;:::i;:::-;618:40721;;;;;;;;;;;;;;;;;33433:65;618:40721;;;;32059:9;618:40721;;33583:38;618:40721;;;33583:38;:50;618:40721;;;33583:50;:::i;:::-;618:40721;;33401:505;32261:10;618:40721;;33921:6;618:40721;;;;;;;;;;;;;;;;;;33920:32;33916:161;;33401:505;618:40721;-1:-1:-1;;;;;32228:14:14;618:40721;;34086:45;;;;;;618:40721;;;34086:45;;618:40721;34086:45;;32261:10;;;34086:45;32261:10;;618:40721;34086:45;;;:::i;:::-;;;;;;;;;;32759:3;34086:45;;;33401:505;618:40721;;;;;;;;;;;;;;;;;;;34146:64;618:40721;;32261:10;;618:40721;32261:10;618:40721;;;;;;:::i;:::-;34146:64;;;32759:3;:::i;:::-;32729:10;;34086:45;;;;:::i;:::-;;;;33916:161;32261:10;618:40721;;;;;;;;;;;;;;;;;;;;;;;;;32261:10;618:40721;;34020:16;618:40721;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33916:161;;;618:40721;-1:-1:-1;;;;;618:40721:14;;;;;;;;33401:505;618:40721;;;;32059:9;618:40721;;33721:67;:51;618:40721;;;33721:51;:67;618:40721;;;;;;;;;33721:67;:::i;:::-;618:40721;;;;;;;;;;;;;;;;;33721:67;618:40721;;;;32059:9;618:40721;;33843:40;618:40721;;;33843:40;:52;618:40721;;;33843:52;:::i;:::-;618:40721;;33401:505;;32862:456;618:40721;33002:12;;;;;;:::i;:::-;618:40721;;;32866:7;618:40721;;1744:1:1;618:40721:14;;;;;;32994:26;32990:328;1744:1:1;;;33048:12:14;;;;;;:::i;:::-;618:40721;;;;;;35372:11;618:40721;;35364:44;618:40721;;;;;;35364:44;:::i;:::-;618:40721;;;32786:13;618:40721;;35418:65;32261:10;-1:-1:-1;;;;;618:40721:14;;;;;;;35426:42;35418:65;:::i;:::-;32261:10;618:40721;;35493:18;618:40721;;;;;;;;;;;35493:57;618:40721;;;;35493:57;:::i;:::-;618:40721;;;;35634:10;618:40721;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;32261:10;618:40721;;;;;-1:-1:-1;35743:39:14;;618:40721;;;1744:1:1;35856:39:14;;;618:40721;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;;;;;;;;32059:9;618:40721;;;;;32228:14;36141:38;618:40721;;36141:38;;:52;;;:::i;:::-;618:40721;;;;;;32059:9;618:40721;;36203:33;:31;618:40721;;;36203:31;:33;618:40721;;;;;;36203:33;:::i;:::-;618:40721;;;;;;;;;;;;;;;;;36203:33;32862:456;;32990:328;618:40721;33128:12;;;;;;:::i;:::-;618:40721;;;32866:7;618:40721;;;;;;;;;33120:26;33116:202;32059:30;;;33177:12;;;;;;:::i;:::-;618:40721;;;;;;36372:11;618:40721;;36364:47;618:40721;;;;;;36364:47;:::i;:::-;618:40721;;;32786:13;618:40721;;36421:68;32261:10;-1:-1:-1;;;;;618:40721:14;;;;;;;36429:45;36421:68;:::i;:::-;32261:10;618:40721;;36499:18;618:40721;;;;;;;;;;;36499:60;618:40721;;;;36499:60;:::i;:::-;618:40721;;;;36643:10;618:40721;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;32261:10;618:40721;;;;;-1:-1:-1;36755:42:14;;618:40721;;;1744:1:1;36871:42:14;;;618:40721;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;;;;;;;;32059:9;618:40721;;;;;37171:41;;618:40721;;37171:41;;:55;;;:::i;:::-;618:40721;;;;;;32059:9;618:40721;;37236:36;:34;618:40721;;;37236:34;:36;618:40721;;;;;;37236:36;:::i;:::-;618:40721;;;;;;;;;;;;;;;;;33116:202;618:40721;33257:12;;;;;;:::i;:::-;618:40721;;;32866:7;618:40721;;;;;;;;32990:328;33245:73;32759:3;33295:8;32759:3;:::i;618:40721::-;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;32487:90;618:40721;32548:29;618:40721;;;32548:29;618:40721;;;32534:43;;32487:90;;618:40721;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;32228:14;618:40721;;;;;;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;32347:28;618:40721;;;;32363:12;32347:28;;618:40721;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;32228:45;;;618:40721;32228:45;;618:40721;32228:45;;;;;;618:40721;32228:45;;;:::i;:::-;;;618:40721;;;;;32228:45;;;;;;-1:-1:-1;32228:45:14;;618:40721;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;618:40721:14;;;;;;29246:20;618:40721;;;;;;;;29317:20;;618:40721;;;;;;;;29380:10;618:40721;29375:1244;29392:17;;;;;;;30633:10;;;;618:40721;;30817:15;618:40721;30628:224;30645:15;;;;;;;618:40721;;;;;;30662:3;618:40721;;4813:12;30764:68;618:40721;30765:48;618:40721;30783:15;30756:85;618:40721;4904:18:13;618:40721:14;;;;;30662:3;618:40721;;;;;;;;;4904:18:13;:::i;:::-;618:40721:14;;;;;;;;;;;;;;;;;;30783:30;618:40721;30765:15;:48;:::i;:::-;30764:68;:::i;:::-;618:40721;30756:85;;:::i;:::-;30662:3;;:::i;:::-;30633:10;;;;;;29411:3;618:40721;;;;;;;;;;;;;;4904:18:13;618:40721:14;;;;4904:18:13;:::i;:::-;618:40721:14;;;;;;;;;;;;;;;;29509:7;618:40721;;;;29529:1;618:40721;;;;;;29509:21;29505:1104;29529:1;;;29572:12;618:40721;29411:3;;-1:-1:-1;;;;;;618:40721:14;29553:15;:31;-1:-1:-1;29553:31:14;;618:40721;29617:46;4813:12;618:40721;29635:13;29608:84;618:40721;29616:67;618:40721;;;;;;;29635:28;618:40721;29553:15;29617:46;:::i;:::-;29667:16;618:40721;29616:67;;:::i;29608:84::-;29550:394;29411:3;:::i;:::-;29380:10;;;;;;;29550:394;618:40721;;;;;29721:13;618:40721;;;;;;;29721:28;618:40721;29721:43;29717:227;29721:43;;;29796:64;29797:43;29788:81;618:40721;;4813:12;618:40721;;;;29812:28;618:40721;29797:43;;:::i;29717:227::-;29916:9;;29717:227;19722:3;:::i;29505:1104::-;618:40721;;;;;;29968:21;;618:40721;;30031:12;618:40721;29411:3;;-1:-1:-1;;;;;;618:40721:14;30012:15;:31;-1:-1:-1;30012:31:14;;618:40721;30076:46;4813:12;618:40721;30094:13;30067:82;618:40721;30075:65;618:40721;;;;;;;30094:28;618:40721;30012:15;30076:46;:::i;:::-;30126:14;618:40721;30075:65;;:::i;30009:390::-;19722:3;:::i;30009:390::-;618:40721;;;;;30178:13;618:40721;;;;;;;30178:28;618:40721;30178:43;30174:225;30178:43;;;30253:62;30254:43;30245:79;618:40721;;4813:12;618:40721;;;;30269:28;618:40721;30254:43;;:::i;29964:645::-;618:40721;;;;;;;;;;;30423:21;30419:190;30443:1;;;618:40721;29411:3;618:40721;30473:46;30464:56;618:40721;30473:15;618:40721;;30491:13;618:40721;;;;;30491:28;618:40721;30473:46;;:::i;:::-;30464:56;;:::i;30419:190::-;29411:3;618:40721;;;;;;;;;29964:645;30541:68;29411:3;:::i;618:40721::-;;;;;;-1:-1:-1;;618:40721:14;;;;;4669:31;618:40721;;;;;;;;;;;;;;;;;;;;;;;2317:63:1;1744:1;618:40721:14;;2325:19:1;;2317:63;:::i;:::-;1744:1;618:40721:14;;10332:57;10353:10;10203:59;10278:8;10332:57;:::i;:::-;10399:62;10421:9;10353:10;10407:23;10399:62;:::i;:::-;40590:17;618:40721;;40575:32;;;;618:40721;;;;;40651:9;618:40721;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9600:29:14;618:40721;;;;9600:43;;;;618:40721;9600:43;;;;;;;;;618:40721;9600:43;;;618:40721;;;;;;;;;;;;;;1744:1:1;618:40721:14;;;;;;;9719:11;;9715:303;;;9719:11;;;618:40721;;;;;;;;;;;;;9746:39;;618:40721;;;;;;;;-1:-1:-1;;;;;9824:15:14;618:40721;;;-1:-1:-1;618:40721:14;;;;;;9808:52;;618:40721;9808:52;9715:303;618:40721;10032:38;618:40721;;;;;;10032:38;618:40721;;;;;;;40783:33;618:40721;;;40783:33;618:40721;40848:389;40852:23;;;618:40721;;;;;;41026:16;40992:5;40935:53;:40;618:40721;;;40935:40;618:40721;40978:10;618:40721;40935:53;;:::i;:::-;618:40721;41026:16;:::i;:::-;618:40721;;;;;;;;;;;;;;;;;;;;;;;;40848:389;41209:16;41175:5;41120:51;:38;618:40721;;;41120:38;618:40721;41161:10;618:40721;41120:51;;:::i;41209:16::-;40848:389;;9715:303;618:40721;;;;;9891:39;618:40721;;;9891:39;618:40721;9953:54;;618:40721;;;;9971:15;;;-1:-1:-1;;;;;9971:15:14;618:40721;9953:54;618:40721;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;9953:54;;;;9715:303;;9600:43;;;;;;;;;;;;;;;;;:::i;:::-;;;618:40721;;;;;9600:43;;;;;;;;;618:40721;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;2484:1:1;618:40721:14;;;:::i;:::-;;2317:63:1;1744:1;2325:7;618:40721:14;2325:19:1;;2317:63;:::i;:::-;1744:1;2325:7;618:40721:14;2484:1:1;:::i;:::-;2325:7;618:40721:14;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;618:40721:14;;;;;;;4813:12;618:40721;;;;;;;;;-1:-1:-1;;618:40721:14;;;;-1:-1:-1;;;;;618:40721:14;;:::i;:::-;1063:62:0;;:::i;:::-;618:40721:14;-1:-1:-1;;;;;618:40721:14;11256:25;618:40721;;;11256:25;618:40721;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;:::i;:::-;;;;2077:42;618:40721;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;:::i;:::-;-1:-1:-1;;;;;618:40721:14;;;;;;2165:74;618:40721;;;;;;;;;;;;;;;;;2165:74;;;;;;618:40721;2165:74;618:40721;2165:74;;:::i;:::-;618:40721;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;4591:25;618:40721;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;:::i;:::-;;;;1884:39;618:40721;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;:::i;:::-;;;;27910:15;618:40721;;;4813:12;27891:68;27892:48;27910:30;618:40721;;;27910:30;618:40721;27892:15;:48;:::i;:::-;27944:15;618:40721;27891:68;;:::i;:::-;618:40721;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;:::i;:::-;;;;3514:47;618:40721;;;;;;;;3514:47;;618:40721;3514:47;;;618:40721;;3514:47;;618:40721;;;;;;-1:-1:-1;;;;;;;;618:40721:14;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;:::i;:::-;;;;;;31017:20;618:40721;;;;;;;31081:20;;;;:::i;:::-;31116:10;618:40721;31128:10;;;;;;618:40721;;;;;;;:::i;31140:3::-;;618:40721;;;;;;;;;4904:18:13;618:40721:14;;;;4904:18:13;:::i;31140:3:14:-;31116:10;;618:40721;;;;;;-1:-1:-1;;618:40721:14;;;;-1:-1:-1;;;;;618:40721:14;;:::i;:::-;;;;2588:62;618:40721;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;1063:62:0;;:::i;:::-;618:40721:14;;12704:18;618:40721;;;12732:18;618:40721;;;;;;;;-1:-1:-1;;618:40721:14;;;;;4832:39;618:40721;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;3909:1;618:40721;;;;;;;;;-1:-1:-1;;618:40721:14;;;;-1:-1:-1;;;;;618:40721:14;;:::i;:::-;1063:62:0;;:::i;:::-;618:40721:14;-1:-1:-1;;;;;618:40721:14;;;11367:41;618:40721;;;11367:41;618:40721;11418:46;618:40721;;;11418:46;618:40721;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;4097:26;618:40721;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;1063:62:0;;:::i;:::-;618:40721:14;;;-1:-1:-1;;;;;618:40721:14;;;;;;-1:-1:-1;;;;;618:40721:14;;;;2573:40:0;;;;618:40721:14;;;;;;;-1:-1:-1;;618:40721:14;;;;;-1:-1:-1;;;;;1802:75:14;618:40721;;;;;;;;;;;;;;;;;;;;;;;;2317:63:1;1744:1;618:40721:14;;2325:19:1;;2317:63;:::i;:::-;1744:1;618:40721:14;;;;;39039:9;618:40721;;;;;;;;;;;;;;;39039:44;618:40721;;;;;39039:9;618:40721;;;;;;39143:30;618:40721;39125:15;:48;618:40721;;;-1:-1:-1;;;;;39200:29:14;618:40721;;39200:50;;;;;;618:40721;;;;;;39200:50;;;;618:40721;39200:50;;;;;;;;;39320:669;39200:50;618:40721;39200:50;;;618:40721;-1:-1:-1;618:40721:14;;;;39039:9;618:40721;;;;;;;;;-1:-1:-1;;618:40721:14;;;39402:33;;;618:40721;39200:29;39670:40;;618:40721;39724:38;;;618:40721;39776:41;;;618:40721;39831:40;;;618:40721;39885:38;;;618:40721;39937:42;;;;618:40721;;;39125:15;618:40721;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39320:669;618:40721;;;;39200:50;;;;:::i;:::-;;;;618:40721;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;4208:32;618:40721;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;-1:-1:-1;;;;;618:40721:14;;:::i;:::-;1063:62:0;;:::i;:::-;618:40721:14;-1:-1:-1;;;;;618:40721:14;10627:36;618:40721;;;10627:36;618:40721;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;:::i;:::-;;;;1985:35;618:40721;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;-1:-1:-1;;;;;1087:76:14;618:40721;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;1063:62:0;;:::i;:::-;618:40721:14;;12115:17;618:40721;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;;:::i;:::-;;;;2308:63;618:40721;;;;;;;;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;;2308:63;;618:40721;2308:63;;618:40721;2308:63;;618:40721;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;4246:34;618:40721;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;2766:45;618:40721;;;;;;;;;2766:45;618:40721;2766:45;;618:40721;2766:45;;;;618:40721;;2766:45;;618:40721;;2766:45;;618:40721;2766:45;;;618:40721;2766:45;;;618:40721;2766:45;;;618:40721;2766:45;;;;618:40721;2766:45;;;;618:40721;2766:45;;;;618:40721;2766:45;;;;618:40721;2766:45;;;;618:40721;2766:45;;;618:40721;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;-1:-1:-1;;;;;618:40721:14;;:::i;:::-;;;;3682:54;618:40721;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;:::i;:::-;;;;3005:45;618:40721;;;;;;;;3005:45;;618:40721;3005:45;;;618:40721;;3005:45;;618:40721;;;;;;-1:-1:-1;;;;;;;;618:40721:14;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;618:40721:14;;;;-1:-1:-1;;;;;618:40721:14;;:::i;:::-;;;;3081:52;618:40721;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;-1:-1:-1;;;;;618:40721:14;;:::i;:::-;;;;13072:16;618:40721;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;-1:-1:-1;;;;;4748:26:14;618:40721;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;2317:63:1;1744:1;2325:7;618:40721:14;2325:19:1;;2317:63;:::i;:::-;1744:1;2325:7;618:40721:14;10332:57;10353:10;10203:59;10278:8;10332:57;:::i;:::-;10399:62;10421:9;10353:10;10407:23;10399:62;:::i;:::-;618:40721;2325:7:1;16695:3:14;10353:10;618:40721;;16658:16;618:40721;;;;;;16653:40;;;;618:40721;;;16717:9;618:40721;;;;;;;;;;;;;;;;16717:39;:69;;;16695:3;16717:94;;;16695:3;16714:2217;;;618:40721;;;;;;16859:23;618:40721;;;16859:23;618:40721;;16909:18;2325:7:1;16909:18:14;;618:40721;;;16970:1850;17035:3;10353:10;618:40721;;16993:18;618:40721;;;;;;;;;;;;;;;;;16989:44;;;;10353:10;618:40721;;16993:18;618:40721;;;;;;;;;;;;17126:36;618:40721;;;;17126:36;:::i;:::-;618:40721;;;;;1744:1:1;618:40721:14;;;;;;17115:10;618:40721;;;;;;;;;;17107:116;10353:10;-1:-1:-1;;;;;618:40721:14;;;;;17115:72;17107:116;:::i;:::-;10353:10;618:40721;;16993:18;618:40721;;;;;;;;;;;;17323:36;618:40721;;;;17323:36;:::i;:::-;618:40721;;;;;1744:1:1;618:40721:14;;;;;;17115:10;618:40721;;;;;;;;;;;;1744:1:1;618:40721:14;;;17312:58;618:40721;;17312:75;:170;;;17035:3;17308:1494;;;10353:10;618:40721;;16993:18;618:40721;;;;;;;;;;;;17642:36;618:40721;;;;17642:36;:::i;:::-;618:40721;;;;;1744:1:1;618:40721:14;;;;;;17115:10;618:40721;;;;;;;;;;2325:7:1;618:40721:14;;;17631:58;618:40721;17748:1;;618:40721;;;;;;;;;;;;;;17719:35;618:40721;17035:3;618:40721;;;17719:35;;:::i;:::-;17308:1494;17035:3;:::i;:::-;16975:12;;;618:40721;-1:-1:-1;;;;;618:40721:14;;17115:10;618:40721;;;;;17308:1494;10353:10;618:40721;;16993:18;618:40721;;;;;;;;;;;;17799:36;618:40721;;;;17799:36;:::i;:::-;618:40721;;;;;1744:1:1;618:40721:14;;;;;;17115:10;618:40721;;;;;;;;;;;;1744:1:1;618:40721:14;;;17788:58;618:40721;;17788:75;:177;;;17308:1494;17784:1018;;;10353:10;618:40721;;16993:18;618:40721;;;;;;;;;;;;18125:36;618:40721;;;;18125:36;:::i;:::-;618:40721;;;;;1744:1:1;618:40721:14;;;;;;17115:10;618:40721;;;;;;;;;;2325:7:1;618:40721:14;;;18114:58;618:40721;;;;;;;;;;;;;17035:3;618:40721;1744:1:1;618:40721:14;18202:35;618:40721;;;18202:35;;:::i;17784:1018::-;10353:10;618:40721;;16993:18;618:40721;;;;;;;;;;;;18282:36;618:40721;;;;18282:36;:::i;:::-;618:40721;;;;;1744:1:1;618:40721:14;;;;;;17115:10;618:40721;;;;;;;;;;;;1744:1:1;618:40721:14;;;18271:58;618:40721;;18271:75;:177;;;17784:1018;18267:535;;;10353:10;618:40721;;16993:18;618:40721;;;;;;;;;;;;18608:36;618:40721;;;;18608:36;:::i;:::-;618:40721;;;;;1744:1:1;618:40721:14;;;;;;17115:10;618:40721;;;;;;;;;;2325:7:1;618:40721:14;;;18597:58;618:40721;;;;;1744:1:1;618:40721:14;;;;;;;17035:3;618:40721;1744:1:1;18685:31:14;618:40721;;18685:31;;:::i;18267:535::-;18771:8;17035:3;18771:8;17035:3;:::i;18271:177::-;10353:10;;618:40721;;16993:18;618:40721;;;;;;;;;;;;18393:36;618:40721;;;;18393:36;:::i;:::-;618:40721;;;;;1744:1:1;618:40721:14;;;;;;17115:10;618:40721;;;;;;;;;;;;;1744:1:1;618:40721:14;;;18382:61;618:40721;;;18382:66;18271:177;;17788;10353:10;;618:40721;;16993:18;618:40721;;;;;;;;;;;;17910:36;618:40721;;;;17910:36;:::i;:::-;618:40721;;;;;1744:1:1;618:40721:14;;;;;;17115:10;618:40721;;;;;;;;;;1744:1:1;618:40721:14;;;;;;17899:61;618:40721;;;17899:66;17788:177;;17312:170;10353:10;;618:40721;;16993:18;618:40721;;;;;;;;;;;;17427:36;618:40721;;;;17427:36;:::i;:::-;618:40721;;;;;1744:1:1;618:40721:14;;;;;;17115:10;618:40721;;;;;;;;;;2325:7:1;618:40721:14;;1744:1:1;618:40721:14;;;17416:61;618:40721;;;17416:66;17312:170;;16989:44;;;16695:3;16989:44;;10353:10;618:40721;;18837:10;618:40721;;;;;;;;;;;;;2325:7:1;618:40721:14;;;;;;;;16695:3;:::i;:::-;16641:10;;618:40721;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;16714:2217;18908:8;16695:3;18908:8;16695:3;:::i;16717:94::-;10353:10;;618:40721;;16790:6;618:40721;;;;;;;;;;;;;;;;16717:94;;:69;10353:10;;618:40721;;16761:10;618:40721;;;;;;;;;;;;;;;;16760:26;16717:69;;16653:40;;-1:-1:-1;;;;;618:40721:14;18951:14;618:40721;;18951:37;;;;;618:40721;;;18951:37;;-1:-1:-1;;;;;18951:37:14;;10353:10;;;18951:37;10353:10;;618:40721;18951:37;;;:::i;:::-;;;;;;;;;;;16637:2304;618:40721;18998:12;618:40721;;18998:47;;;;;618:40721;;;18998:47;;-1:-1:-1;;;;;18998:47:14;;10353:10;;;18998:47;10353:10;;618:40721;18998:47;;;:::i;:::-;;;;;;;;;;;16637:2304;618:40721;;;;;;19060:34;618:40721;10353:10;19060:34;;2325:7:1;618:40721:14;;;18998:47;;;;:::i;:::-;;;;18951:37;;;;:::i;:::-;;;;618:40721;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2325:7:1;;618:40721:14;2317:63:1;1744:1;618:40721:14;;2325:19:1;;2317:63;:::i;:::-;1744:1;618:40721:14;;26866:10;26853:9;:23;618:40721;;27341:15;-1:-1:-1;;;;;618:40721:14;;;26916:20;;;;;;618:40721;;;-1:-1:-1;;;;;27732:12:14;618:40721;;27732:54;;;;;;;618:40721;;;;;;27732:54;;;;;;618:40721;27732:54;;26866:10;618:40721;27732:54;;;:::i;26938:3::-;-1:-1:-1;;;;;618:40721:14;;26965:5;618:40721;;;26979:12;;;;;;;:::i;:::-;618:40721;;;26965:27;;;;618:40721;26965:27;;618:40721;;;;;26965:27;;618:40721;26965:27;;;;;;26957:63;26965:27;618:40721;26965:27;;;26938:3;-1:-1:-1;618:40721:14;;26866:10;26965:41;26957:63;:::i;:::-;27061:12;;;;;;;:::i;:::-;618:40721;;;27047:13;618:40721;;;;;;;;;;;;;;;;;26866:10;618:40721;;27095:20;618:40721;;10606:32:13;618:40721:14;;;27132:12;;;;;;;:::i;:::-;618:40721;10606:32:13;;:::i;:::-;;27199:12:14;;;;;;:::i;:::-;27175;;;;;;;;:::i;:::-;618:40721;;;27159:15;618:40721;;;;;;;;;;;;;;;;;27241:12;;;;;;;:::i;:::-;618:40721;;;27159:15;618:40721;;27225:48;26866:10;618:40721;;;27225:48;:::i;:::-;27303:12;;;;;;;:::i;:::-;618:40721;;;27159:15;618:40721;;27287:70;618:40721;;;;27287:70;:::i;:::-;27387:12;;;;;;;:::i;:::-;618:40721;;;27159:15;618:40721;;;1744:1:1;618:40721:14;;;27371:35;618:40721;27462:12;;;;;;;:::i;:::-;618:40721;;;27159:15;618:40721;;;;;;27446:39;618:40721;;;;;;26965:5;618:40721;;27553:12;;;;;;;:::i;:::-;27503:63;;;;;;;618:40721;;;;;;;27503:63;;;;;;-1:-1:-1;;;;;27503:63:14;;27546:4;26866:10;618:40721;27503:63;;;:::i;:::-;;;;;;;;;;26938:3;27503:63;;;26938:3;27581:14;;618:40721;;;;;27581:14;618:40721;;;;;27581:14;:::i;:::-;618:40721;;;;;;;;;;26866:10;618:40721;;27609:20;618:40721;;;;;;;;;;27609:34;618:40721;;;27609:34;:::i;:::-;618:40721;;;;;;27686:12;;;;;;:::i;:::-;618:40721;;;;;;;27662:37;26866:10;;27662:37;;26938:3;:::i;:::-;26904:10;;27503:63;;;;:::i;:::-;;;;26965:27;;;;;;;;;;;;;;:::i;:::-;;;;618:40721;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;:::i;:::-;;;;3592:44;618:40721;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;-1:-1:-1;;;;;1193:74:14;618:40721;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;-1:-1:-1;;;;;618:40721:14;;:::i;:::-;1063:62:0;;:::i;:::-;618:40721:14;-1:-1:-1;;;;;618:40721:14;;;;;;;;;11145:39;618:40721;;;11145:39;618:40721;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;4063:28;618:40721;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;4129:32;618:40721;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;1063:62:0;;:::i;:::-;-1:-1:-1;;;;;618:40721:14;12213:20;618:40721;;;12213:20;618:40721;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;4168:34;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;:::i;:::-;;;:::i;:::-;1063:62:0;;;:::i;:::-;11987:4:14;618:40721;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;:::i;:::-;-1:-1:-1;;;;;618:40721:14;;;;;;2884:53;618:40721;;;;;;;2884:53;;;;;618:40721;2884:53;;;;:::i;:::-;618:40721;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;:::i;:::-;;;;;;31375:20;618:40721;;;;;;;31440:20;;;;:::i;:::-;31475:10;618:40721;31487:10;;;;;;618:40721;;;;;;;:::i;31499:3::-;;618:40721;;;;;;;;;4904:18:13;618:40721:14;;;;4904:18:13;:::i;31499:3:14:-;31475:10;;618:40721;;;;;;-1:-1:-1;;618:40721:14;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;2317:63:1;1744:1;618:40721:14;;2325:19:1;;2317:63;:::i;:::-;1744:1;618:40721:14;;37565:17;618:40721;37565:22;;37564:98;;;;618:40721;;;;37709:26;37720:15;618:40721;;37709:26;:::i;:::-;37740:11;618:40721;-1:-1:-1;37708:43:14;37707:94;;;618:40721;;;;37849:9;618:40721;37836:9;:22;618:40721;;37891:19;;;:::i;:::-;618:40721;37565:17;618:40721;;;;;;;:::i;:::-;;;;37952:739;618:40721;37952:739;;618:40721;37720:15;618:40721;37952:739;;618:40721;;;;37952:739;;618:40721;;;37952:739;;;618:40721;;;37952:739;;;618:40721;;37952:739;;;618:40721;;37952:739;;;618:40721;;37952:739;;;618:40721;;37952:739;;;618:40721;;37952:739;;;618:40721;;37952:739;;;618:40721;;37952:739;;;618:40721;;37952:739;;;618:40721;;37952:739;;;618:40721;;37952:739;;;618:40721;;37952:739;;;618:40721;1744:1:1;37952:739:14;;;618:40721;;;37921:9;618:40721;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;37952:739;;618:40721;-1:-1:-1;618:40721:14;;;;37952:739;;618:40721;1744:1:1;618:40721:14;;;;37952:739;;618:40721;;;;;37952:739;;;618:40721;;;;;37952:739;;;618:40721;;;;;37952:739;;;618:40721;;;;;;37952:739;;;618:40721;37952:739;;;618:40721;37952:739;;;618:40721;37952:739;;;618:40721;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;;37952:739;;;;;618:40721;;;;;37952:739;;;618:40721;;;;;37952:739;;;618:40721;;;;;37952:739;;;618:40721;;;;;37952:739;;;618:40721;;;;;37952:739;;;618:40721;;;;;37952:739;618:40721;;;;;;;;-1:-1:-1;;;;;1744:1:1;618:40721:14;;38702:38;37836:9;;38702:38;;;618:40721;37836:9;38702:38;;;;;37565:17;618:40721;38764:148;37952:739;618:40721;;37720:15;618:40721;;;;;;;;;;;;;;;;;;;;38764:148;618:40721;;;;38702:38;;;-1:-1:-1;38702:38:14;;618:40721;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;37707:94;37720:15;37758:26;37720:15;618:40721;;37758:26;:::i;:::-;37789:11;618:40721;-1:-1:-1;37757:43:14;37707:94;;618:40721;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;37564:98;618:40721;;;;37606:9;618:40721;;;;;;;;;;;;;;;37606:55;37564:98;;618:40721;;;;;;-1:-1:-1;;618:40721:14;;;;-1:-1:-1;;;;;618:40721:14;;:::i;:::-;1063:62:0;;:::i;:::-;618:40721:14;-1:-1:-1;;;;;618:40721:14;;;;;;;;;10968:45;618:40721;;;10968:45;618:40721;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;618:40721:14;;-1:-1:-1;618:40721:14;;;-1:-1:-1;618:40721:14;:::o;:::-;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;618:40721:14;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;618:40721:14;;;;-1:-1:-1;618:40721:14;;;;;;;;;:::o;:::-;;-1:-1:-1;;618:40721:14;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::o;1359:130:0:-;-1:-1:-1;;;;;1273:6:0;618:40721:14;;719:10:9;1422:23:0;618:40721:14;;1359:130:0:o;618:40721:14:-;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;1744:1:1:-;;;;:::o;:::-;;618:40721:14;;-1:-1:-1;;;;;1744:1:1;;;;;;;;;;;618:40721:14;1744:1:1;618:40721:14;;;1744:1:1;;618:40721:14;;;;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;-1:-1:-1;618:40721:14;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;-1:-1:-1;;618:40721:14;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;:::o;13200:1956::-;;;;-1:-1:-1;;13200:1956:14;618:40721;13421:615;;;;618:40721;13468:20;618:40721;13468:9;618:40721;13468:20;:::i;:::-;13455:9;:33;618:40721;;-1:-1:-1;;;;;618:40721:14;-1:-1:-1;618:40721:14;;;;13535:18;618:40721;;13535:38;13455:9;;13535:38;;;13421:615;13455:9;13535:38;;;;;618:40721;13612:19;618:40721;;;;;;13612:39;618:40721;13612:39;;;;;;;;;;;;;;;;;;;-1:-1:-1;13612:39:14;;;13421:615;13673:26;;618:40721;;;-1:-1:-1;618:40721:14;;;;;13774:44;;;;618:40721;13774:44;;;13612:39;13774:44;;618:40721;13774:44;;;;;;;-1:-1:-1;13774:44:14;;;13421:615;13767:51;;618:40721;13832:12;618:40721;;13832:54;;;;;;-1:-1:-1;618:40721:14;;13832:54;;618:40721;13832:54;;13865:10;;;13832:54;13865:10;;;13612:39;13832:54;;;:::i;:::-;;;;;;;;;;;;;13421:615;13913:22;;;;:::i;:::-;13421:615;;;;14054:16;14085:10;;14097:19;;;;;;14914:9;;;;;;;14910:57;;14976:24;618:40721;14976:24;618:40721;14976:24;:::i;:::-;;618:40721;;;;;;15015:30;618:40721;15028:10;15015:30;;-1:-1:-1;;;;;618:40721:14;15055:14;618:40721;;15055:37;;;;;618:40721;;;15055:37;;-1:-1:-1;;;;;15055:37:14;;15028:10;;;15055:37;15028:10;;15055:37;;;;:::i;:::-;;;;;;;;;;;;;;14080:821;618:40721;;15102:12;618:40721;;15102:47;;;;;;;618:40721;;;;;;15102:47;;;;;;-1:-1:-1;;;;;15102:47:14;;15028:10;15055:37;15102:47;;;:::i;:::-;;;;;;;;;;;13200:1956;;:::o;15102:47::-;;;;;:::i;:::-;618:40721;;13200:1956;:::o;618:40721::-;;;15102:47;618:40721;;;;;;;;;15055:37;;;;:::i;:::-;618:40721;;15055:37;;;;;618:40721;;;;;;;;;15055:37;618:40721;;;14910:57;14939:17;;:::o;14118:3::-;14149:11;;;;;618:40721;14149:11;;;;;;:::i;:::-;618:40721;;;14141:7;618:40721;;;14165:1;618:40721;;;;;;14141:25;14137:754;14165:1;;;14234:11;618:40721;14234:11;;;;;;;;:::i;:::-;14256:21;;;;14266:7;;;;:::i;:::-;618:40721;14256:21;618:40721;;;;;;22639:13;618:40721;;;;22705:115;22713:55;-1:-1:-1;;;;;618:40721:14;22631:64;618:40721;;;;;;;;22671:10;22639:42;22631:64;:::i;:::-;618:40721;;;;;;-1:-1:-1;;;;;;;;618:40721:14;;;;;;;22713:15;:55;:::i;:::-;618:40721;;;;-1:-1:-1;22705:115:14;:::i;:::-;22830:12;;618:40721;;;22883:12;618:40721;;22713:15;;22864:31;;22861:343;22864:31;;;618:40721;;;;;;;;;4813:12;22918:67;22919:46;22937:28;618:40721;;;22937:28;618:40721;22713:15;22919:46;:::i;22918:67::-;618:40721;22861:343;;23214:965;;;;618:40721;;;;;10906:35:13;618:40721:14;;;;;;;;23240:11;618:40721;;;;;;;;;;;;;;-1:-1:-1;618:40721:14;;;;;;;;14165:1;618:40721;;;;;22671:10;618:40721;;23363:20;618:40721;;;10906:35:13;:::i;:::-;;618:40721:14;23430:16;618:40721;;;;23430:28;;;;618:40721;23430:28;;;;;;;;;;;;;;;;;;;;;;;618:40721;23430:28;;;;;23214:965;618:40721;;23430:32;;:58;;;23214:965;23426:534;;;618:40721;;;;;;23430:16;618:40721;;;;;23560:65;;;;;618:40721;23560:65;;;;;618:40721;23560:65;;;;;;;;;;;23426:534;618:40721;;23643:7;618:40721;;23643:55;;;;;;618:40721;23643:55;618:40721;;;;;;;23643:55;;;;;;;-1:-1:-1;;;;;23643:55:14;;23676:4;23643:55;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;23426:534;23716:18;;;14118:3;23716:18;;;;14296:13;23716:18;618:40721;;22671:10;23757:31;22671:10;618:40721;;;23757:31;23426:534;23986:15;618:40721;;;;23986:15;618:40721;;;23986:15;:::i;:::-;618:40721;;;;;;;;;22671:10;618:40721;;24015:18;618:40721;;;;;;;;;;24015:32;618:40721;;;24015:32;:::i;:::-;618:40721;;;;;;14296:13;:::i;:::-;14327:42;;;23214:965;14137:754;14118:3;:::i;:::-;14085:10;;;;;;14327:42;618:40721;14341:25;;;;:::i;:::-;618:40721;;;;14327:42;;;23643:55;;;;;;;;;;;;;:::i;:::-;618:40721;;23643:55;;;;;;;;;;;;618:40721;;;;23643:55;618:40721;;;;;;;;;23643:55;618:40721;;;23560:65;;;;;618:40721;23560:65;618:40721;23560:65;;;;;;;:::i;:::-;;;;;23426:534;618:40721;;;;;23827:7;618:40721;;23827:60;;;;;;618:40721;;;23827:60;618:40721;;;;23827:60;;;;;;-1:-1:-1;;;;;23827:60:14;;22671:10;23860:4;;23827:60;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23426:534;618:40721;;;14296:13;618:40721;14118:3;618:40721;;;;;;;;23910:35;618:40721;22671:10;23910:35;;23426:534;;23827:60;;;;;;;;;;;;:::i;:::-;618:40721;;23827:60;;;;;;;;;;;618:40721;;;;23827:60;618:40721;;;;;;;;;23430:58;618:40721;14165:1;618:40721;;23481:4;618:40721;;;;;;;;23474:3;618:40721;;23466:22;23430:58;;:28;;;;618:40721;23430:28;618:40721;23430:28;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;618:40721;;;;;;;;;;;23214:965;618:40721;;;;;;;14296:13;618:40721;;14118:3;618:40721;;;;;;;24078:28;618:40721;;;;22713:15;618:40721;;;24078:28;618:40721;14296:13;:::i;22861:343::-;618:40721;;;;;;23015:28;618:40721;;;;;;23015:28;618:40721;23015:43;23011:193;23015:43;;;23082;23081:64;618:40721;4813:12;618:40721;;;;23097:28;618:40721;23082:43;;:::i;23081:64::-;618:40721;23011:193;22861:343;;23011:193;23185:8;;;23011:193;22861:343;;14256:21;;;;14137:754;618:40721;14401:11;;;;;;:::i;:::-;618:40721;;;;;;14417:1;618:40721;;;;;;14393:25;14389:502;14417:1;;;14484:11;;;;;;;:::i;:::-;14506:21;;;;14516:7;;;;:::i;:::-;618:40721;14506:21;;618:40721;;;;;24321:13;618:40721;;24313:64;-1:-1:-1;;;;;618:40721:14;;;;;;;24353:10;24321:42;24313:64;:::i;:::-;618:40721;;;;;24321:13;618:40721;;24387:115;24395:55;-1:-1:-1;;;;;;;;618:40721:14;;;;;;24395:15;:55;:::i;:::-;-1:-1:-1;;;;;618:40721:14;;;-1:-1:-1;24387:115:14;:::i;:::-;24512:12;618:40721;;-1:-1:-1;;;;;24565:12:14;618:40721;;24395:15;;24546:31;;24543:339;24546:31;;;618:40721;24600:65;24601:46;14417:1;618:40721;4813:12;618:40721;;;;;;24321:13;618:40721;;;24619:28;618:40721;24395:15;24601:46;:::i;24600:65::-;618:40721;24543:339;;24892:930;;;;;618:40721;;;;;;24918:11;618:40721;;;;;;;;;;;;24321:13;618:40721;;-1:-1:-1;14417:1:14;618:40721;;;;;;;14165:1;618:40721;;;;;24353:10;618:40721;;25041:20;618:40721;;10906:35:13;618:40721:14;;;;;;10906:35:13;:::i;:::-;;25108:29:14;618:40721;-1:-1:-1;;;;;25108:14:14;618:40721;;;;25108:29;;;;618:40721;25108:29;;;;;;;;;;618:40721;25108:29;;;;;24892:930;618:40721;;25108:33;;:59;;;24892:930;25104:512;;;618:40721;;-1:-1:-1;;;;;25108:14:14;618:40721;;;;;;25239:64;;;;618:40721;25239:64;;25108:29;25239:64;;618:40721;25239:64;;;;;;;;;;;25104:512;618:40721;-1:-1:-1;;;;;25321:16:14;618:40721;;25321:42;;;;;618:40721;;;25321:42;;618:40721;25321:42;;;;;;;;25108:29;25321:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25104:512;25381:18;;;14546:13;25381:18;-1:-1:-1;;;;;14118:3:14;25381:18;;618:40721;24353:10;25422:29;24353:10;618:40721;;;25422:29;25104:512;25630:13;618:40721;;;;;25630:13;618:40721;;;;;25630:13;:::i;:::-;618:40721;;;;;;;;;;24353:10;618:40721;;25657:18;618:40721;;;;;;;;25657:32;618:40721;;;25657:32;:::i;:::-;618:40721;;;;;;;;14546:13;:::i;25321:42::-;;;;;;;;;;;;:::i;:::-;618:40721;;25321:42;;;;;;;;;;;25239:64;;;;;618:40721;25239:64;618:40721;25239:64;;;;;;;:::i;:::-;;;;;;618:40721;;;;;;;;;25104:512;618:40721;;-1:-1:-1;;;;;25490:16:14;618:40721;;25490:55;;;;;618:40721;;;25490:55;;618:40721;25490:55;;24353:10;;;25490:55;24353:10;;25108:29;25490:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25104:512;618:40721;;;14546:13;618:40721;14118:3;618:40721;;;;;;;;;;25568:33;618:40721;24353:10;25568:33;;25104:512;;25490:55;;;;;;;;;;;;:::i;:::-;618:40721;;25490:55;;;;;;;;;;;25108:59;618:40721;14417:1;618:40721;;25160:4;618:40721;;;;;;;;25153:3;618:40721;;25145:22;25108:59;;:29;;;;618:40721;25108:29;618:40721;25108:29;;;;;;;:::i;:::-;;;;24892:930;618:40721;;;;;14118:3;618:40721;;;14546:13;618:40721;;;;24321:13;618:40721;;24395:15;14417:1;618:40721;-1:-1:-1;;;;;24395:15:14;618:40721;;;25720:28;618:40721;14546:13;:::i;24543:339::-;618:40721;;;;;24321:13;618:40721;;;14417:1;618:40721;;;24695:28;618:40721;24695:43;24691:191;24695:43;;;24762;24761:62;618:40721;14417:1;618:40721;4813:12;618:40721;;24777:28;618:40721;24762:43;;:::i;24761:62::-;618:40721;24691:191;24543:339;;24691:191;24863:8;24691:191;24543:339;;14506:21;;;;;14389:502;618:40721;14651:11;;;;;;:::i;:::-;618:40721;;;;;;14667:1;618:40721;;;;;;14643:25;14639:252;14667:1;;;14709:11;;;;;;;:::i;:::-;618:40721;;;;;;25936:13;618:40721;;-1:-1:-1;;;;;618:40721:14;25928:64;618:40721;;;;;;;;25968:10;25936:42;25928:64;:::i;:::-;618:40721;;;;;25936:13;618:40721;;26002:115;618:40721;26010:55;618:40721;-1:-1:-1;;;;;;;;618:40721:14;;;;;;;26010:15;:55;:::i;:::-;618:40721;;;;-1:-1:-1;26002:115:14;:::i;:::-;26137:15;618:40721;;;;;;;25936:13;618:40721;;;26137:46;14417:1;618:40721;;;26155:28;618:40721;26137:46;;:::i;:::-;26195:552;;;;;618:40721;;;;;;;26221:11;618:40721;;;;;;;;;;;;25936:13;618:40721;;-1:-1:-1;14417:1:14;618:40721;;;;;;;14165:1;618:40721;;;;;25968:10;618:40721;;26344:20;618:40721;;10906:35:13;618:40721:14;;;;;;10906:35:13;:::i;:::-;;25968:10:14;618:40721;;26406:23;618:40721;;10906:35:13;618:40721:14;;;;;;10906:35:13;:::i;:::-;;26471:14:14;618:40721;;26471:56;;;;;618:40721;;;26471:56;;618:40721;26471:56;;25968:10;;;26471:56;25968:10;;26471:56;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;26195:552;26542:16;;;14688:42;26542:16;14118:3;26542:16;;;618:40721;;;;;26542:16;618:40721;;;;;26542:16;:::i;:::-;618:40721;;;;;;;;;;25968:10;618:40721;;26572:18;618:40721;;;;;;;;26572:32;618:40721;;;26572:32;:::i;:::-;618:40721;;;;;;;;;;;;;;;26623:36;618:40721;25968:10;26623:36;;14688:42;:::i;:::-;14748:33;;19722:3;14748:33;14762:17;;;;;:::i;26471:56::-;;;;;;;;;;;:::i;:::-;618:40721;;26471:56;;;;;;;;;;618:40721;;;;26195:552;14118:3;618:40721;;;;14688:42;618:40721;;;;;;;;;25936:13;618:40721;;14417:1;618:40721;;;26690:28;618:40721;14688:42;:::i;14639:252::-;618:40721;14813:11;;;;;;;;;;;:::i;:::-;618:40721;;;;;;;;;;;14805:25;14801:90;;14118:3;14639:252;19722:3;:::i;14801:90::-;618:40721;;;-1:-1:-1;;;;;14850:26:14;;618:40721;14850:26;;;618:40721;;;;;;;;;;;14850:26;13832:54;;;;;;:::i;:::-;-1:-1:-1;13832:54:14;;;;;618:40721;;-1:-1:-1;618:40721:14;;;;;13774:44;;;;;;;;;;:::i;:::-;;;618:40721;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13774:44;;;;;;;;618:40721;;;;;;;;;;;;;;;;;13774:44;618:40721;;;-1:-1:-1;618:40721:14;;;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;13612:39;618:40721;;;;;;;;;;;;;;;;;;;13612:39;;;;;;;;;;;;;;;;:::i;:::-;;;618:40721;;;;;;;;13612:39;;;;;;;;;618:40721;;;-1:-1:-1;618:40721:14;;;;;13535:38;;;-1:-1:-1;13535:38:14;;618:40721;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;13421:615;618:40721;;;;;;;;;;;;;;;;;;13992:1;618:40721;;;;;;;;;13966:28;618:40721;;;;-1:-1:-1;618:40721:14;;13421:615;;;;618:40721;;;;:::o;:::-;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;:::o;15162:1156::-;15277:1;15293:10;;15305:20;;;;;;16121:9;;;;;;16117:46;;-1:-1:-1;;;;;618:40721:14;16172:14;618:40721;;16172:37;;;;;15277:1;618:40721;;16172:37;;-1:-1:-1;;;;;16172:37:14;;15394:10;;;16172:37;15394:10;;16172:37;;;;:::i;:::-;;;;;;;;;;;15288:820;618:40721;16219:12;618:40721;;16219:47;;;;;15277:1;618:40721;;16219:47;;-1:-1:-1;;;;;16219:47:14;;15394:10;;;16219:47;15394:10;;16172:37;16219:47;;;:::i;:::-;;;;;;;;;;;15288:820;618:40721;;;;;;16281:30;618:40721;15394:10;16281:30;;15162:1156::o;16219:47::-;;;;:::i;:::-;;;;16172:37;;;;:::i;:::-;;;;16117:46;16146:7;:::o;15327:3::-;618:40721;;;15371:12;;;;;;;;:::i;:::-;618:40721;15277:1;618:40721;15355:15;618:40721;;;;;-1:-1:-1;;;;;618:40721:14;;15394:10;15347:71;15394:10;618:40721;;;15277:1;618:40721;;;;15355:49;15347:71;:::i;:::-;15475:12;;;;;;;:::i;:::-;618:40721;15277:1;618:40721;;;;15432:90;15459:35;618:40721;4813:12;15440:73;15441:53;618:40721;;15277:1;618:40721;15459:35;618:40721;15441:15;:53;:::i;15432:90::-;;;15536:502;;;;;;;15590:12;;;;;;;;;;15277:1;15590:12;;;:::i;:::-;618:40721;;;;;;;;;;;;;;;;;;15621:17;618:40721;;;;;;;;;;;;;;;;;;15696:12;618:40721;;15696:12;618:40721;;;;;;;;10906:35:13;618:40721:14;;;;;;;;;;;15394:10;15277:1;618:40721;15656:20;618:40721;;;15277:1;618:40721;15696:12;;:::i;:::-;618:40721;10906:35:13;;:::i;:::-;;618:40721:14;15727:5;618:40721;;15777:12;;;;;;;:::i;:::-;15727:63;;;;;;15277:1;618:40721;;15727:63;;-1:-1:-1;;;;;15727:63:14;;;;;;;15394:10;;15758:4;15727:63;;;;:::i;:::-;;;;;;;;;;;15536:502;618:40721;15808:12;618:40721;;15808:53;;;;;618:40721;15277:1;618:40721;;;15808:53;618:40721;;;15808:53;;;;;;;618:40721;15808:53;;15394:10;15808:53;;;;:::i;:::-;;;;;;;;;;15327:3;15808:53;;;;;16056:41;15808:53;;;15536:502;15910:12;;;;;;;:::i;:::-;618:40721;;;;;;;15884:39;15394:10;;15884:39;;15536:502;16069:12;;;;;;:::i;:::-;618:40721;;;;;;;;;16056:41;;15327:3;:::i;:::-;15293:10;;15808:53;;;;:::i;:::-;;;;15727:63;;;;:::i;:::-;;;;;618:40721;;;15277:1;618:40721;;;;;15536:502;15978:12;;;;;;;15327:3;15978:12;16056:41;15978:12;;;:::i;:::-;618:40721;15277:1;618:40721;;;-1:-1:-1;;;;;15441:15:14;618:40721;;;15277:1;618:40721;15962:35;618:40721;15536:502;;2685:1388:13;;2888:12;;;-1:-1:-1;;618:40721:14;;;;;;;;;;;2922:15:13;;;2918:1149;2922:15;;;-1:-1:-1;;618:40721:14;;;;;;;;;;;;;;;;;;;;3404:26:13;;;3400:398;;2918:1149;618:40721:14;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2888:12:13;4002:11;:::o;618:40721:14:-;;;-1:-1:-1;;;;;618:40721:14;;;;;;3400:398:13;618:40721:14;;3470:22:13;3592:26;3470:22;;;:::i;:::-;618:40721:14;;;;;;;;;;;3592:26:13;;:::i;:::-;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3400:398:13;;;;;618:40721:14;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;2918:1149:13;4044:12;;;;;:::o;618:40721:14:-;;;;:::o;:::-;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;;;;;;;;618:40721:14;;;;;;;;;;;:::o;2113:404:13:-;;;4250:12;;;-1:-1:-1;618:40721:14;;;;;;;;;;;4250:24:13;2192:319;618:40721:14;;;;;;;;;;;;;;;;4250:12:13;618:40721:14;;;;;;;;;:::i;:::-;;;;;;;;;;;4250:12:13;2446:11;:::o;618:40721:14:-;;;-1:-1:-1;;;;;618:40721:14;;;;;;2192:319:13;-1:-1:-1;2488:12:13;-1:-1:-1;;2488:12:13:o;618:40721:14:-;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;;618:40721:14;;:::o;27981:1119::-;618:40721;;;;;;;;;;28078:11;618:40721;;;;;;;;;;28077:21;28073:40;;28126:7;618:40721;;;;;;;;28146:1;28126:21;28146:1;;-1:-1:-1;28185:12:14;618:40721;-1:-1:-1;;;;;618:40721:14;28166:15;:31;-1:-1:-1;28166:31:14;;618:40721;28224:67;618:40721;;28243:13;28225:46;618:40721;28243:28;618:40721;4813:12;618:40721;;;;28243:28;618:40721;28166:15;28225:46;:::i;28224:67::-;618:40721;27981:1119;:::o;28163:367::-;618:40721;;28325:13;618:40721;;;;;28325:28;618:40721;;;28325:28;618:40721;28325:43;28321:209;28325:43;;;28395:64;618:40721;28325:28;28396:43;618:40721;4813:12;618:40721;;28411:28;618:40721;28396:43;;:::i;28321:209::-;28507:8;;618:40721;:::o;28122:951::-;618:40721;;;;;;28570:1;28550:21;28570:1;;-1:-1:-1;28609:12:14;618:40721;-1:-1:-1;;;;;618:40721:14;28590:15;:31;-1:-1:-1;28590:31:14;;618:40721;28648:65;618:40721;;28667:13;28649:46;618:40721;28570:1;618:40721;4813:12;618:40721;;;;28667:28;618:40721;28590:15;28649:46;:::i;28587:363::-;618:40721;;28747:13;618:40721;;;;;28570:1;618:40721;;;28747:28;618:40721;28747:43;28743:207;28747:43;;;28817:62;618:40721;28570:1;28818:43;618:40721;4813:12;618:40721;;28833:28;618:40721;28818:43;;:::i;28546:527::-;618:40721;;;28990:1;618:40721;;;;;;;;;28970:21;28966:107;;28546:527;;;;618:40721;:::o;28966:107::-;29015:15;618:40721;29033:13;618:40721;;;;28570:1;29033:28;618:40721;29015:46;;-1:-1:-1;618:40721:14;29015:46;:::i;:::-;28966:107;;;;;618:40721;;;;;;;;;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;-1:-1:-1;;;;;618:40721:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40119:323::-;618:40721;;40182:14;618:40721;;;40182:19;;40178:137;;40344:34;40324:72;618:40721;40353:25;618:40721;40344:34;;:::i;:::-;618:40721;40324:72;618:40721;40324:72;:::i;:::-;;618:40721;-1:-1:-1;40353:25:14;618:40721;40119:323::o;40178:137::-;618:40721;40249:35;618:40721;40249:35;618:40721;40249:35;:::i;:::-;;618:40721;40298:7::o
Swarm Source
ipfs://295e39989d072717153efe72902910460dfa51ec525ddad3430f71c437050f3a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,630.03 | 0.0054 | $19.6 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.