Source Code
Overview
XDC Balance
XDC Value
$0.00Latest 25 from a total of 104 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Place Bet | 87590025 | 203 days ago | IN | 0 XDC | 0.00848905 | ||||
| Place Bet | 87590015 | 203 days ago | IN | 0 XDC | 0.00858136 | ||||
| Place Bet | 87584454 | 203 days ago | IN | 0 XDC | 0.00773188 | ||||
| Place Bet | 87584442 | 203 days ago | IN | 0 XDC | 0.00867804 | ||||
| Place Bet | 87584017 | 203 days ago | IN | 0 XDC | 0.00704134 | ||||
| Place Bet | 87581748 | 204 days ago | IN | 0 XDC | 0.00733843 | ||||
| Place Bet | 87581485 | 204 days ago | IN | 0 XDC | 0.0070947 | ||||
| Place Bet | 87581475 | 204 days ago | IN | 0 XDC | 0.0075828 | ||||
| Place Bet | 87578084 | 204 days ago | IN | 0 XDC | 0.00698149 | ||||
| Place Bet | 87578074 | 204 days ago | IN | 0 XDC | 0.00651276 | ||||
| Place Bet | 87577859 | 204 days ago | IN | 0 XDC | 0.0064594 | ||||
| Place Bet | 87577790 | 204 days ago | IN | 0 XDC | 0.00691849 | ||||
| Place Bet | 87577780 | 204 days ago | IN | 0 XDC | 0.00744391 | ||||
| Place Bet | 87552230 | 204 days ago | IN | 0 XDC | 0.00559099 | ||||
| Place Bet | 87550005 | 204 days ago | IN | 0 XDC | 0.00693903 | ||||
| Place Bet | 87549899 | 204 days ago | IN | 0 XDC | 0.00732517 | ||||
| Place Bet | 87549566 | 204 days ago | IN | 0 XDC | 0.00681303 | ||||
| Place Bet | 87549544 | 204 days ago | IN | 0 XDC | 0.00720912 | ||||
| Place Bet | 87546044 | 204 days ago | IN | 0 XDC | 0.00668703 | ||||
| Place Bet | 87545900 | 204 days ago | IN | 0 XDC | 0.00667738 | ||||
| Place Bet | 87545443 | 204 days ago | IN | 0 XDC | 0.00651538 | ||||
| Place Bet | 87545432 | 204 days ago | IN | 0 XDC | 0.00646675 | ||||
| Place Bet | 87545342 | 204 days ago | IN | 0 XDC | 0.00798006 | ||||
| Place Bet | 87545331 | 204 days ago | IN | 0 XDC | 0.00793672 | ||||
| Place Bet | 87545189 | 204 days ago | IN | 0 XDC | 0.00652503 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Roulette
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/**
*Submitted for verification at xdcscan.com on 2025-03-03
*/
// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @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 EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* 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;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
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() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}
// File: contracts/Roulette.sol
pragma solidity ^0.8.20;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address callerConfirmation) external;
function mint(address account, uint256 amount) external;
function burn(address account, uint256 amount) external;
}
enum BetType {
Straight, // Single number bet
Dozen, // 12 numbers (1-12, 13-24, 25-36)
Column, // 12 numbers (vertical 2:1)
Red, // Red numbers
Black, // Black numbers
Even, // Even numbers
Odd, // Odd numbers
Low, // 1-18
High // 19-36
}
struct BetDetails {
BetType betType;
uint8[] numbers;
uint256 amount;
uint256 payout;
}
struct Bet {
uint256 timestamp;
BetDetails[] bets;
uint8 winningNumber;
}
struct UserGameData {
Bet[] recentBets;
uint256 maxHistorySize;
}
struct BetRequest {
uint8 betTypeId; // Using the constants above instead of enum
uint8 number; // Single number for straight bets
uint256 amount; // Amount of tokens to bet
}
contract Roulette is ReentrancyGuard {
// Constants
uint8 public constant MAX_NUMBER = 36;
uint256 public constant DENOMINATOR = 10000;
uint256 public constant MAX_HISTORY_SIZE = 10;
uint256 private constant MAX_BETS_PER_SPIN = 15;
uint256 public constant MAX_BET_AMOUNT = 100_000 * 10**18; // 100k tokens per bet
uint256 public constant MAX_TOTAL_BET_AMOUNT = 500_000 * 10**18; // 500k tokens total per spin
uint256 public constant MAX_POSSIBLE_PAYOUT = 17_500_000 * 10**18; // 17.5M tokens (500k * 35)
// Token variables
IERC20 public gamaToken;
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE");
// State variables
mapping(address => UserGameData) public userData;
uint256 public totalGamesPlayed;
uint256 public totalPayoutAmount;
uint256 public totalWageredAmount;
// Errors
error InvalidBetParameters(string reason);
error InvalidBetType(uint256 betType);
error InsufficientUserBalance(uint256 required, uint256 available);
error TransferFailed(address from, address to, uint256 amount);
error BurnFailed(address account, uint256 amount);
error MintFailed(address account, uint256 amount);
error MissingContractRole(bytes32 role);
error InsufficientAllowance(uint256 required, uint256 allowed);
error MaxPayoutExceeded(uint256 potentialPayout, uint256 maxAllowed);
// Bet type number mappings for frontend
uint8 public constant STRAIGHT_BET = 0;
uint8 public constant DOZEN_BET_FIRST = 1; // 1-12
uint8 public constant DOZEN_BET_SECOND = 2; // 13-24
uint8 public constant DOZEN_BET_THIRD = 3; // 25-36
uint8 public constant COLUMN_BET_FIRST = 4; // 1,4,7...
uint8 public constant COLUMN_BET_SECOND = 5; // 2,5,8...
uint8 public constant COLUMN_BET_THIRD = 6; // 3,6,9...
uint8 public constant RED_BET = 7;
uint8 public constant BLACK_BET = 8;
uint8 public constant EVEN_BET = 9;
uint8 public constant ODD_BET = 10;
uint8 public constant LOW_BET = 11;
uint8 public constant HIGH_BET = 12;
constructor(address _gamaTokenAddress) {
require(_gamaTokenAddress != address(0), "Token address cannot be zero");
gamaToken = IERC20(_gamaTokenAddress);
}
function placeBet(BetRequest[] calldata betRequests) external nonReentrant {
// 1. Input validation
if (betRequests.length == 0) revert InvalidBetParameters("No bets provided");
if (betRequests.length > MAX_BETS_PER_SPIN) revert InvalidBetParameters("Too many bets");
// 2. State checks and initial setup
UserGameData storage user = userData[msg.sender];
uint256 totalAmount;
uint256 maxPossiblePayout;
// 3. Pre-validate all bets and calculate totals in a single pass
(totalAmount, maxPossiblePayout) = _validateAndCalculateTotals(betRequests);
// 4. Balance and allowance checks
_checkBalancesAndAllowances(msg.sender, totalAmount);
// 5. Process the game
uint256 totalPayout = _processGame(betRequests, user, totalAmount);
// 6. Update global stats
totalGamesPlayed++;
totalPayoutAmount += totalPayout;
}
function _validateAndCalculateTotals(BetRequest[] calldata bets) private pure returns (uint256 totalAmount, uint256 maxPossiblePayout) {
for (uint256 i = 0; i < bets.length; i++) {
// Each bet can have a different amount
if (bets[i].amount == 0) revert InvalidBetParameters("Invalid bet amount");
if (bets[i].amount > MAX_BET_AMOUNT) revert InvalidBetParameters("Single bet amount too large");
totalAmount += bets[i].amount;
// Calculate potential payout based on bet type
(BetType betType,) = _processBetRequest(bets[i]);
uint256 multiplier = getPayoutMultiplier(betType);
uint256 potentialPayout = (bets[i].amount * multiplier) / DENOMINATOR;
maxPossiblePayout += potentialPayout;
// Ensures total of all bets doesn't exceed MAX_TOTAL_BET_AMOUNT (500k tokens)
if (totalAmount > MAX_TOTAL_BET_AMOUNT) revert InvalidBetParameters("Total bet amount too large");
}
}
function _checkBalancesAndAllowances(address player, uint256 totalAmount) private view {
if (gamaToken.balanceOf(player) < totalAmount) {
revert InsufficientUserBalance(totalAmount, gamaToken.balanceOf(player));
}
if (gamaToken.allowance(player, address(this)) < totalAmount) {
revert InsufficientAllowance(totalAmount, gamaToken.allowance(player, address(this)));
}
if (!gamaToken.hasRole(BURNER_ROLE, address(this))) {
revert MissingContractRole(BURNER_ROLE);
}
if (!gamaToken.hasRole(MINTER_ROLE, address(this))) {
revert MissingContractRole(MINTER_ROLE);
}
}
function _processGame(BetRequest[] calldata bets, UserGameData storage user, uint256 totalAmount) private returns (uint256 totalPayout) {
// Burn tokens first
try gamaToken.burn(msg.sender, totalAmount) {
} catch {
revert BurnFailed(msg.sender, totalAmount);
}
// Update total wagered amount
totalWageredAmount += totalAmount;
// Generate winning number once for all bets in this transaction
uint8 currentWinningNumber = _generateRandomNumber();
// Process all bets and calculate total payout
BetDetails[] memory betDetails = new BetDetails[](bets.length);
for (uint256 i = 0; i < bets.length; i++) {
// Convert betTypeId to BetType and get numbers
(BetType betType, uint8[] memory numbers) = _processBetRequest(bets[i]);
uint256 payout = _calculatePayout(
numbers,
betType,
bets[i].amount,
currentWinningNumber
);
if (totalPayout + payout < totalPayout) revert("Payout overflow");
totalPayout += payout;
// Store bet details in memory array
betDetails[i] = BetDetails({
betType: betType,
numbers: numbers,
amount: bets[i].amount,
payout: payout
});
}
// Update history with new bet
if (user.recentBets.length >= MAX_HISTORY_SIZE) {
// Shift elements to make room for new bet
for (uint256 j = 0; j < user.recentBets.length - 1; j++) {
user.recentBets[j] = user.recentBets[j + 1];
}
// Update the last element
user.recentBets[user.recentBets.length - 1].timestamp = block.timestamp;
user.recentBets[user.recentBets.length - 1].winningNumber = currentWinningNumber;
// Copy bet details one by one
delete user.recentBets[user.recentBets.length - 1].bets;
for (uint256 i = 0; i < betDetails.length; i++) {
user.recentBets[user.recentBets.length - 1].bets.push(betDetails[i]);
}
} else {
// Create new bet in storage directly
user.recentBets.push();
uint256 newIndex = user.recentBets.length - 1;
user.recentBets[newIndex].timestamp = block.timestamp;
user.recentBets[newIndex].winningNumber = currentWinningNumber;
// Copy bet details one by one
for (uint256 i = 0; i < betDetails.length; i++) {
user.recentBets[newIndex].bets.push(betDetails[i]);
}
}
// Process payouts if any wins
if (totalPayout > 0) {
try gamaToken.mint(msg.sender, totalPayout) {
} catch {
revert MintFailed(msg.sender, totalPayout);
}
}
return totalPayout;
}
function _calculatePayout(uint8[] memory numbers, BetType betType, uint256 betAmount, uint8 _winningNumber) private pure returns (uint256) {
if (betAmount == 0) return 0;
if (betAmount > MAX_BET_AMOUNT) revert InvalidBetParameters("Bet amount exceeds maximum");
if (_isBetWinning(numbers, betType, _winningNumber)) {
uint256 multiplier = getPayoutMultiplier(betType);
if (multiplier == 0) revert("Invalid multiplier");
uint256 winnings = (betAmount * multiplier) / DENOMINATOR;
uint256 totalPayout = winnings + betAmount; // Add original bet amount to winnings
if (totalPayout > MAX_POSSIBLE_PAYOUT) {
revert MaxPayoutExceeded(totalPayout, MAX_POSSIBLE_PAYOUT);
}
return totalPayout;
}
return 0;
}
function _isBetWinning(uint8[] memory numbers, BetType betType, uint8 _winningNumber) private pure returns (bool) {
if (_winningNumber > MAX_NUMBER) return false;
if (_winningNumber == 0) {
return (betType == BetType.Straight && numbers.length == 1 && numbers[0] == 0);
}
if (betType == BetType.Red) return _isRed(_winningNumber);
if (betType == BetType.Black) return !_isRed(_winningNumber) && _winningNumber != 0;
if (betType == BetType.Even) return _winningNumber % 2 == 0 && _winningNumber != 0;
if (betType == BetType.Odd) return _winningNumber % 2 == 1;
if (betType == BetType.Low) return _winningNumber >= 1 && _winningNumber <= 18;
if (betType == BetType.High) return _winningNumber >= 19 && _winningNumber <= 36;
for (uint8 i = 0; i < numbers.length; i++) {
if (numbers[i] == _winningNumber) return true;
}
return false;
}
function _isRed(uint8 number) private pure returns (bool) {
if (number == 0) return false;
uint8[18] memory redNumbers = [
1, 3, 5, 7, 9, 12, 14, 16, 18,
19, 21, 23, 25, 27, 30, 32, 34, 36
];
for (uint8 i = 0; i < redNumbers.length; i++) {
if (redNumbers[i] == number) return true;
}
return false;
}
function getPayoutMultiplier(BetType betType) internal pure returns (uint256) {
// DENOMINATOR = 10000
if (betType == BetType.Straight) return 35 * DENOMINATOR; // 35:1 payout (get 35x plus original bet)
if (betType == BetType.Dozen) return 2 * DENOMINATOR; // 2:1 payout (get 2x plus original bet)
if (betType == BetType.Column) return 2 * DENOMINATOR; // 2:1 payout (get 2x plus original bet)
if (betType >= BetType.Red && betType <= BetType.High) {
return DENOMINATOR; // 1:1 payout (get 1x plus original bet)
}
revert InvalidBetType(uint256(betType));
}
function calculatePayout(uint256 amount, BetType betType) internal pure returns (uint256) {
if (amount == 0) return 0;
if (amount > MAX_BET_AMOUNT) revert InvalidBetParameters("Bet amount exceeds maximum");
uint256 multiplier = getPayoutMultiplier(betType);
if (multiplier == 0) revert("Invalid multiplier");
uint256 winnings = (amount * multiplier) / DENOMINATOR;
// Verify against maximum possible payout
if (winnings > MAX_POSSIBLE_PAYOUT) {
revert MaxPayoutExceeded(winnings, MAX_POSSIBLE_PAYOUT);
}
return winnings;
}
function _isValidBet(uint8[] memory numbers, BetType betType) private pure returns (bool) {
// Validate number range for relevant bet types
if (betType == BetType.Straight || betType == BetType.Dozen || betType == BetType.Column) {
for (uint8 i = 0; i < numbers.length; i++) {
if (numbers[i] > MAX_NUMBER) return false;
}
}
// Specific validations for each bet type
if (betType == BetType.Straight) {
return numbers.length == 1;
} else if (betType == BetType.Dozen) {
return _isValidDozen(numbers);
} else if (betType == BetType.Column) {
return _isValidColumn(numbers);
} else if (betType == BetType.Red || betType == BetType.Black || betType == BetType.Even || betType == BetType.Odd || betType == BetType.Low || betType == BetType.High) {
// For these bet types, the numbers array is ignored
return true;
} else {
return false;
}
}
// Helper functions for bet validation
function _isValidDozen(uint8[] memory numbers) private pure returns (bool) {
if (numbers.length != 12) return false;
// Check if first number is valid starting point for dozens
uint8 start = numbers[0];
if (start != 1 && start != 13 && start != 25) return false;
// Ensure numbers are sequential within the dozen
for (uint8 i = 0; i < 12; i++) {
if (numbers[i] != start + i) return false;
}
return true;
}
function _isValidColumn(uint8[] memory numbers) private pure returns (bool) {
if (numbers.length != 12) return false;
// Check if numbers form a valid column based on the visual layout
// Column 1 (right): 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36
// Column 2 (middle): 2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35
// Column 3 (left): 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34
uint8[] memory validStarts = new uint8[](3);
validStarts[0] = 3;
validStarts[1] = 2;
validStarts[2] = 1;
bool isValidStart = false;
uint8 start = numbers[0];
// Check if it starts with a valid column number
for (uint8 i = 0; i < validStarts.length; i++) {
if (start == validStarts[i]) {
isValidStart = true;
break;
}
}
if (!isValidStart) return false;
// For column starting with 3: increment by 3
// For column starting with 2: increment by 3
// For column starting with 1: increment by 3
for (uint8 i = 0; i < 12; i++) {
uint8 expected = start + (i * 3);
if (numbers[i] != expected || expected > MAX_NUMBER) return false;
}
return true;
}
// Add helper function to get column numbers
function _getColumnNumbers(uint8 columnStart) private pure returns (uint8[] memory) {
uint8[] memory numbers = new uint8[](12);
for (uint8 i = 0; i < 12; i++) {
numbers[i] = columnStart + (i * 3);
}
return numbers;
}
// Add helper function to get dozen numbers
function _getDozenNumbers(uint8 dozenStart) private pure returns (uint8[] memory) {
uint8[] memory numbers = new uint8[](12);
for (uint8 i = 0; i < 12; i++) {
numbers[i] = dozenStart + i;
}
return numbers;
}
// Add view function to help frontend validate bets
function getValidBetNumbers(BetType betType, uint8 start) external pure returns (uint8[] memory) {
if (betType == BetType.Column) {
require(start == 1 || start == 2 || start == 3, "Invalid column start");
return _getColumnNumbers(start);
} else if (betType == BetType.Dozen) {
require(start == 1 || start == 13 || start == 25, "Invalid dozen start");
return _getDozenNumbers(start);
} else {
revert("Invalid bet type for number generation");
}
}
function _generateRandomNumber() private view returns (uint8) {
return uint8(uint256(keccak256(abi.encodePacked(
block.timestamp,
block.prevrandao,
msg.sender,
totalGamesPlayed
))) % (MAX_NUMBER + 1));
}
// Move getBetTypeInfo before _processBetRequest
function getBetTypeInfo(uint8 betTypeId) public pure returns (
string memory name,
bool requiresNumber,
uint256 payoutMultiplier
) {
if (betTypeId == STRAIGHT_BET)
return ("Straight", true, 35 * DENOMINATOR);
if (betTypeId == DOZEN_BET_FIRST)
return ("First Dozen (1-12)", false, 2 * DENOMINATOR);
if (betTypeId == DOZEN_BET_SECOND)
return ("Second Dozen (13-24)", false, 2 * DENOMINATOR);
if (betTypeId == DOZEN_BET_THIRD)
return ("Third Dozen (25-36)", false, 2 * DENOMINATOR);
if (betTypeId == COLUMN_BET_FIRST)
return ("First Column", false, 2 * DENOMINATOR);
if (betTypeId == COLUMN_BET_SECOND)
return ("Second Column", false, 2 * DENOMINATOR);
if (betTypeId == COLUMN_BET_THIRD)
return ("Third Column", false, 2 * DENOMINATOR);
if (betTypeId == RED_BET)
return ("Red", false, DENOMINATOR);
if (betTypeId == BLACK_BET)
return ("Black", false, DENOMINATOR);
if (betTypeId == EVEN_BET)
return ("Even", false, DENOMINATOR);
if (betTypeId == ODD_BET)
return ("Odd", false, DENOMINATOR);
if (betTypeId == LOW_BET)
return ("Low (1-18)", false, DENOMINATOR);
if (betTypeId == HIGH_BET)
return ("High (19-36)", false, DENOMINATOR);
revert InvalidBetParameters("Invalid bet type ID");
}
// Add helper function to convert betTypeId to BetType and generate numbers
function _processBetRequest(BetRequest calldata bet) private pure returns (
BetType betType,
uint8[] memory numbers
) {
if (bet.betTypeId == STRAIGHT_BET) {
require(bet.number <= MAX_NUMBER, "Invalid number for straight bet");
numbers = new uint8[](1);
numbers[0] = bet.number;
return (BetType.Straight, numbers);
}
else if (bet.betTypeId == DOZEN_BET_FIRST) {
return (BetType.Dozen, _getDozenNumbers(1));
}
else if (bet.betTypeId == DOZEN_BET_SECOND) {
return (BetType.Dozen, _getDozenNumbers(13));
}
else if (bet.betTypeId == DOZEN_BET_THIRD) {
return (BetType.Dozen, _getDozenNumbers(25));
}
else if (bet.betTypeId == COLUMN_BET_FIRST) {
return (BetType.Column, _getColumnNumbers(1));
}
else if (bet.betTypeId == COLUMN_BET_SECOND) {
return (BetType.Column, _getColumnNumbers(2));
}
else if (bet.betTypeId == COLUMN_BET_THIRD) {
return (BetType.Column, _getColumnNumbers(3));
}
else if (bet.betTypeId == RED_BET) {
return (BetType.Red, new uint8[](0));
}
else if (bet.betTypeId == BLACK_BET) {
return (BetType.Black, new uint8[](0));
}
else if (bet.betTypeId == EVEN_BET) {
return (BetType.Even, new uint8[](0));
}
else if (bet.betTypeId == ODD_BET) {
return (BetType.Odd, new uint8[](0));
}
else if (bet.betTypeId == LOW_BET) {
return (BetType.Low, new uint8[](0));
}
else if (bet.betTypeId == HIGH_BET) {
return (BetType.High, new uint8[](0));
}
revert InvalidBetParameters("Invalid bet type ID");
}
// Get all valid bet types and their info
function getAllBetTypes() external pure returns (
uint8[] memory betTypeIds,
string[] memory names,
bool[] memory requiresNumbers,
uint256[] memory payoutMultipliers
) {
betTypeIds = new uint8[](13);
names = new string[](13);
requiresNumbers = new bool[](13);
payoutMultipliers = new uint256[](13);
for (uint8 i = 0; i < 13; i++) {
(string memory name, bool requiresNumber, uint256 multiplier) = getBetTypeInfo(i);
betTypeIds[i] = i;
names[i] = name;
requiresNumbers[i] = requiresNumber;
payoutMultipliers[i] = multiplier;
}
}
// Get user's bet history with pagination
function getUserBetHistory(
address player,
uint256 offset,
uint256 limit
) external view returns (
Bet[] memory bets,
uint256 total
) {
Bet[] memory allBets = userData[player].recentBets;
uint256 totalBets = allBets.length;
if (offset >= totalBets) {
return (new Bet[](0), totalBets);
}
uint256 end = offset + limit;
if (end > totalBets) {
end = totalBets;
}
uint256 size = end - offset;
bets = new Bet[](size);
for (uint256 i = 0; i < size; i++) {
bets[i] = allBets[offset + i];
}
return (bets, totalBets);
}
// Get detailed info about a specific bet from history
function getBetDetails(address player, uint256 betIndex) external view returns (
uint256 timestamp,
BetDetails[] memory betDetails,
uint8 resultNumber,
bool isWin
) {
require(betIndex < userData[player].recentBets.length, "Invalid bet index");
Bet memory bet = userData[player].recentBets[betIndex];
uint256 totalPayout = 0;
for (uint256 i = 0; i < bet.bets.length; i++) {
totalPayout += bet.bets[i].payout;
}
return (
bet.timestamp,
bet.bets,
bet.winningNumber,
totalPayout > 0
);
}
// Get all possible winning numbers for a bet type
function getPossibleWinningNumbers(uint8 betTypeId) external pure returns (uint8[] memory numbers) {
if (betTypeId == STRAIGHT_BET) {
numbers = new uint8[](37); // 0-36
for (uint8 i = 0; i <= 36; i++) {
numbers[i] = i;
}
}
else if (betTypeId == RED_BET) {
numbers = new uint8[](18);
uint8[18] memory redNumbers = [
1, 3, 5, 7, 9, 12, 14, 16, 18,
19, 21, 23, 25, 27, 30, 32, 34, 36
];
for (uint8 i = 0; i < 18; i++) {
numbers[i] = redNumbers[i];
}
}
else if (betTypeId == BLACK_BET) {
numbers = new uint8[](18);
uint8[18] memory blackNumbers = [
2, 4, 6, 8, 10, 11, 13, 15, 17,
20, 22, 24, 26, 28, 29, 31, 33, 35
];
for (uint8 i = 0; i < 18; i++) {
numbers[i] = blackNumbers[i];
}
}
else if (betTypeId == EVEN_BET) {
numbers = new uint8[](18);
for (uint8 i = 0; i < 18; i++) {
numbers[i] = (i + 1) * 2;
}
}
else if (betTypeId == ODD_BET) {
numbers = new uint8[](18);
for (uint8 i = 0; i < 18; i++) {
numbers[i] = (i * 2) + 1;
}
}
else if (betTypeId == LOW_BET) {
numbers = new uint8[](18);
for (uint8 i = 0; i < 18; i++) {
numbers[i] = i + 1;
}
}
else if (betTypeId == HIGH_BET) {
numbers = new uint8[](18);
for (uint8 i = 0; i < 18; i++) {
numbers[i] = i + 19;
}
}
else {
revert InvalidBetParameters("Invalid bet type ID for number generation");
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_gamaTokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BurnFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"required","type":"uint256"},{"internalType":"uint256","name":"allowed","type":"uint256"}],"name":"InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"uint256","name":"required","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"name":"InsufficientUserBalance","type":"error"},{"inputs":[{"internalType":"string","name":"reason","type":"string"}],"name":"InvalidBetParameters","type":"error"},{"inputs":[{"internalType":"uint256","name":"betType","type":"uint256"}],"name":"InvalidBetType","type":"error"},{"inputs":[{"internalType":"uint256","name":"potentialPayout","type":"uint256"},{"internalType":"uint256","name":"maxAllowed","type":"uint256"}],"name":"MaxPayoutExceeded","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MintFailed","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"MissingContractRole","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"BLACK_BET","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLUMN_BET_FIRST","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLUMN_BET_SECOND","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLUMN_BET_THIRD","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOZEN_BET_FIRST","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOZEN_BET_SECOND","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOZEN_BET_THIRD","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EVEN_BET","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HIGH_BET","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOW_BET","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BET_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_HISTORY_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NUMBER","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_POSSIBLE_PAYOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOTAL_BET_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ODD_BET","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RED_BET","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STRAIGHT_BET","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gamaToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllBetTypes","outputs":[{"internalType":"uint8[]","name":"betTypeIds","type":"uint8[]"},{"internalType":"string[]","name":"names","type":"string[]"},{"internalType":"bool[]","name":"requiresNumbers","type":"bool[]"},{"internalType":"uint256[]","name":"payoutMultipliers","type":"uint256[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"betIndex","type":"uint256"}],"name":"getBetDetails","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"components":[{"internalType":"enum BetType","name":"betType","type":"uint8"},{"internalType":"uint8[]","name":"numbers","type":"uint8[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"}],"internalType":"struct BetDetails[]","name":"betDetails","type":"tuple[]"},{"internalType":"uint8","name":"resultNumber","type":"uint8"},{"internalType":"bool","name":"isWin","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"betTypeId","type":"uint8"}],"name":"getBetTypeInfo","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"requiresNumber","type":"bool"},{"internalType":"uint256","name":"payoutMultiplier","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"betTypeId","type":"uint8"}],"name":"getPossibleWinningNumbers","outputs":[{"internalType":"uint8[]","name":"numbers","type":"uint8[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"getUserBetHistory","outputs":[{"components":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"components":[{"internalType":"enum BetType","name":"betType","type":"uint8"},{"internalType":"uint8[]","name":"numbers","type":"uint8[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"}],"internalType":"struct BetDetails[]","name":"bets","type":"tuple[]"},{"internalType":"uint8","name":"winningNumber","type":"uint8"}],"internalType":"struct Bet[]","name":"bets","type":"tuple[]"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum BetType","name":"betType","type":"uint8"},{"internalType":"uint8","name":"start","type":"uint8"}],"name":"getValidBetNumbers","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"betTypeId","type":"uint8"},{"internalType":"uint8","name":"number","type":"uint8"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct BetRequest[]","name":"betRequests","type":"tuple[]"}],"name":"placeBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalGamesPlayed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayoutAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWageredAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userData","outputs":[{"internalType":"uint256","name":"maxHistorySize","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801562000010575f80fd5b50604051620056f0380380620056f083398181016040528101906200003691906200015a565b60015f819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000a590620001e8565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000208565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200012482620000f9565b9050919050565b620001368162000118565b811462000141575f80fd5b50565b5f8151905062000154816200012b565b92915050565b5f60208284031215620001725762000171620000f5565b5b5f620001818482850162000144565b91505092915050565b5f82825260208201905092915050565b7f546f6b656e20616464726573732063616e6e6f74206265207a65726f000000005f82015250565b5f620001d0601c836200018a565b9150620001dd826200019a565b602082019050919050565b5f6020820190508181035f8301526200020181620001c2565b9050919050565b6154da80620002165f395ff3fe608060405234801561000f575f80fd5b50600436106101f9575f3560e01c806394bae38511610118578063d5391393116100ab578063e3286e551161007a578063e3286e5514610591578063e60271cf146105c2578063e7efcfc2146105e0578063fa198c4f146105fe578063fea9b57214610630576101f9565b8063d539139314610519578063d56ec8c914610537578063d6b6cd5914610555578063ddebc95214610573576101f9565b8063b8a5e438116100e7578063b8a5e43814610491578063c1066251146104af578063c1a5fe51146104cd578063c8910913146104e9576101f9565b806394bae385146104075780639793e1d614610425578063a398222714610455578063b34daef414610473576101f9565b80634689b44111610190578063790231701161015f578063790231701461038c5780637d3d31ad146103ad578063918f8674146103cb57806394b9b507146103e9576101f9565b80634689b441146103025780635a0db4d2146103205780635bdb2e1b146103505780635c4921291461036e576101f9565b80632ff21494116101cc5780632ff2149414610275578063309167f5146102a857806336b39a60146102c6578063432aeb8f146102e4576101f9565b806319469f1b146101fd5780632257b0571461021b578063282c51f3146102395780632d2cd03414610257575b5f80fd5b61020561064e565b6040516102129190613d52565b60405180910390f35b610223610653565b6040516102309190613d52565b60405180910390f35b610241610658565b60405161024e9190613d83565b60405180910390f35b61025f61067c565b60405161026c9190613db4565b60405180910390f35b61028f600480360381019061028a9190613e59565b61068a565b60405161029f9493929190614105565b60405180910390f35b6102b061093e565b6040516102bd9190613db4565b60405180910390f35b6102ce61094c565b6040516102db9190613d52565b60405180910390f35b6102ec610951565b6040516102f99190613d52565b60405180910390f35b61030a610955565b6040516103179190613db4565b60405180910390f35b61033a60048036038101906103359190614179565b610964565b6040516103479190614210565b60405180910390f35b61035861105e565b6040516103659190613db4565b60405180910390f35b610376611064565b6040516103839190613db4565b60405180910390f35b61039461106a565b6040516103a494939291906144d4565b60405180910390f35b6103b561127b565b6040516103c29190613d52565b60405180910390f35b6103d3611280565b6040516103e09190613db4565b60405180910390f35b6103f1611286565b6040516103fe9190613d52565b60405180910390f35b61040f61128b565b60405161041c9190613d52565b60405180910390f35b61043f600480360381019061043a9190614556565b611290565b60405161044c9190614210565b60405180910390f35b61045d61140f565b60405161046a9190613d52565b60405180910390f35b61047b611414565b6040516104889190613d52565b60405180910390f35b610499611419565b6040516104a69190613d52565b60405180910390f35b6104b761141e565b6040516104c49190613db4565b60405180910390f35b6104e760048036038101906104e291906145f5565b611423565b005b61050360048036038101906104fe9190614640565b611563565b6040516105109190613db4565b60405180910390f35b61052161157e565b60405161052e9190613d83565b60405180910390f35b61053f6115a2565b60405161054c91906146c6565b60405180910390f35b61055d6115c7565b60405161056a9190613d52565b60405180910390f35b61057b6115cc565b6040516105889190613d52565b60405180910390f35b6105ab60048036038101906105a691906146df565b6115d1565b6040516105b99291906148ba565b60405180910390f35b6105ca611912565b6040516105d79190613d52565b60405180910390f35b6105e8611917565b6040516105f59190613db4565b60405180910390f35b61061860048036038101906106139190614179565b61191d565b60405161062793929190614930565b60405180910390f35b610638611e08565b6040516106459190613d52565b60405180910390f35b600881565b600581565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b6969e10de76676d080000081565b5f60605f8060025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01805490508510610713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070a906149b6565b60405180910390fd5b5f60025f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f018681548110610765576107646149d4565b5b905f5260205f2090600302016040518060600160405290815f820154815260200160018201805480602002602001604051908101604052809291908181526020015f905b828210156108a0578382905f5260205f2090600402016040518060800160405290815f82015f9054906101000a900460ff1660088111156107ed576107ec613ec0565b5b60088111156107ff576107fe613ec0565b5b81526020016001820180548060200260200160405190810160405280929190818152602001828054801561087457602002820191905f5260205f20905f905b82829054906101000a900460ff1660ff16815260200190600101906020825f0104928301926001038202915080841161083e5790505b5050505050815260200160028201548152602001600382015481525050815260200190600101906107a9565b505050508152602001600282015f9054906101000a900460ff1660ff1660ff168152505090505f805b82602001515181101561091957826020015181815181106108ed576108ec6149d4565b5b602002602001015160600151826109049190614a2e565b9150808061091190614a61565b9150506108c9565b50815f0151826020015183604001515f84119550955095509550505092959194509250565b69152d02c7e14af680000081565b600181565b5f81565b6a0e79c4e6a3023e8180000081565b60605f60ff168260ff1603610a1057602567ffffffffffffffff81111561098e5761098d614aa8565b5b6040519080825280602002602001820160405280156109bc5781602001602082028036833780820191505090505b5090505f5b60248160ff1611610a0a5780828260ff16815181106109e3576109e26149d4565b5b602002602001019060ff16908160ff16815250508080610a0290614ad5565b9150506109c1565b50611059565b600760ff168260ff1603610b9857601267ffffffffffffffff811115610a3957610a38614aa8565b5b604051908082528060200260200182016040528015610a675781602001602082028036833780820191505090505b5090505f604051806102400160405280600160ff168152602001600360ff168152602001600560ff168152602001600760ff168152602001600960ff168152602001600c60ff168152602001600e60ff168152602001601060ff168152602001601260ff168152602001601360ff168152602001601560ff168152602001601760ff168152602001601960ff168152602001601b60ff168152602001601e60ff168152602001602060ff168152602001602260ff168152602001602460ff1681525090505f5b60128160ff161015610b9157818160ff1660128110610b4f57610b4e6149d4565b5b6020020151838260ff1681518110610b6a57610b696149d4565b5b602002602001019060ff16908160ff16815250508080610b8990614ad5565b915050610b2d565b5050611058565b600860ff168260ff1603610d2057601267ffffffffffffffff811115610bc157610bc0614aa8565b5b604051908082528060200260200182016040528015610bef5781602001602082028036833780820191505090505b5090505f604051806102400160405280600260ff168152602001600460ff168152602001600660ff168152602001600860ff168152602001600a60ff168152602001600b60ff168152602001600d60ff168152602001600f60ff168152602001601160ff168152602001601460ff168152602001601660ff168152602001601860ff168152602001601a60ff168152602001601c60ff168152602001601d60ff168152602001601f60ff168152602001602160ff168152602001602360ff1681525090505f5b60128160ff161015610d1957818160ff1660128110610cd757610cd66149d4565b5b6020020151838260ff1681518110610cf257610cf16149d4565b5b602002602001019060ff16908160ff16815250508080610d1190614ad5565b915050610cb5565b5050611057565b600960ff168260ff1603610de457601267ffffffffffffffff811115610d4957610d48614aa8565b5b604051908082528060200260200182016040528015610d775781602001602082028036833780820191505090505b5090505f5b60128160ff161015610dde576002600182610d979190614afd565b610da19190614b31565b828260ff1681518110610db757610db66149d4565b5b602002602001019060ff16908160ff16815250508080610dd690614ad5565b915050610d7c565b50611056565b600a60ff168260ff1603610ea857601267ffffffffffffffff811115610e0d57610e0c614aa8565b5b604051908082528060200260200182016040528015610e3b5781602001602082028036833780820191505090505b5090505f5b60128160ff161015610ea2576001600282610e5b9190614b31565b610e659190614afd565b828260ff1681518110610e7b57610e7a6149d4565b5b602002602001019060ff16908160ff16815250508080610e9a90614ad5565b915050610e40565b50611055565b600b60ff168260ff1603610f6057601267ffffffffffffffff811115610ed157610ed0614aa8565b5b604051908082528060200260200182016040528015610eff5781602001602082028036833780820191505090505b5090505f5b60128160ff161015610f5a57600181610f1d9190614afd565b828260ff1681518110610f3357610f326149d4565b5b602002602001019060ff16908160ff16815250508080610f5290614ad5565b915050610f04565b50611054565b600c60ff168260ff160361101857601267ffffffffffffffff811115610f8957610f88614aa8565b5b604051908082528060200260200182016040528015610fb75781602001602082028036833780820191505090505b5090505f5b60128160ff16101561101257601381610fd59190614afd565b828260ff1681518110610feb57610fea6149d4565b5b602002602001019060ff16908160ff1681525050808061100a90614ad5565b915050610fbc565b50611053565b6040517f34460f4100000000000000000000000000000000000000000000000000000000815260040161104a90614bdd565b60405180910390fd5b5b5b5b5b5b5b919050565b60055481565b60035481565b606080606080600d67ffffffffffffffff81111561108b5761108a614aa8565b5b6040519080825280602002602001820160405280156110b95781602001602082028036833780820191505090505b509350600d67ffffffffffffffff8111156110d7576110d6614aa8565b5b60405190808252806020026020018201604052801561110a57816020015b60608152602001906001900390816110f55790505b509250600d67ffffffffffffffff81111561112857611127614aa8565b5b6040519080825280602002602001820160405280156111565781602001602082028036833780820191505090505b509150600d67ffffffffffffffff81111561117457611173614aa8565b5b6040519080825280602002602001820160405280156111a25781602001602082028036833780820191505090505b5090505f5b600d8160ff161015611274575f805f6111bf8461191d565b92509250925083888560ff16815181106111dc576111db6149d4565b5b602002602001019060ff16908160ff168152505082878560ff1681518110611207576112066149d4565b5b602002602001018190525081868560ff1681518110611229576112286149d4565b5b60200260200101901515908115158152505080858560ff1681518110611252576112516149d4565b5b602002602001018181525050505050808061126c90614ad5565b9150506111a7565b5090919293565b600c81565b61271081565b600b81565b600a81565b6060600260088111156112a6576112a5613ec0565b5b8360088111156112b9576112b8613ec0565b5b036113305760018260ff1614806112d3575060028260ff16145b806112e1575060038260ff16145b611320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131790614c45565b60405180910390fd5b61132982611e0d565b9050611409565b6001600881111561134457611343613ec0565b5b83600881111561135757611356613ec0565b5b036113ce5760018260ff1614806113715750600d8260ff16145b8061137f575060198260ff16145b6113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b590614cad565b60405180910390fd5b6113c782611ec9565b9050611409565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614d3b565b60405180910390fd5b92915050565b600781565b600281565b600481565b600a81565b61142b611f79565b5f8282905003611470576040517f34460f4100000000000000000000000000000000000000000000000000000000815260040161146790614da3565b60405180910390fd5b600f8282905011156114b7576040517f34460f410000000000000000000000000000000000000000000000000000000081526004016114ae90614e0b565b60405180910390fd5b5f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f806115038585611fbd565b8092508193505050611515338361219f565b5f611522868686866126cd565b905060035f81548092919061153690614a61565b91905055508060045f82825461154c9190614a2e565b925050819055505050505061155f612e46565b5050565b6002602052805f5260405f205f915090508060010154905081565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600381565b600681565b60605f8060025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01805480602002602001604051908101604052809291908181526020015f905b828210156117ab578382905f5260205f2090600302016040518060600160405290815f820154815260200160018201805480602002602001604051908101604052809291908181526020015f905b82821015611778578382905f5260205f2090600402016040518060800160405290815f82015f9054906101000a900460ff1660088111156116c5576116c4613ec0565b5b60088111156116d7576116d6613ec0565b5b81526020016001820180548060200260200160405190810160405280929190818152602001828054801561174c57602002820191905f5260205f20905f905b82829054906101000a900460ff1660ff16815260200190600101906020825f010492830192600103820291508084116117165790505b505050505081526020016002820154815260200160038201548152505081526020019060010190611681565b505050508152602001600282015f9054906101000a900460ff1660ff1660ff168152505081526020019060010190611633565b5050505090505f8151905080861061181d575f67ffffffffffffffff8111156117d7576117d6614aa8565b5b60405190808252806020026020018201604052801561181057816020015b6117fd613a81565b8152602001906001900390816117f55790505b508193509350505061190a565b5f858761182a9190614a2e565b905081811115611838578190505b5f87826118459190614e29565b90508067ffffffffffffffff81111561186157611860614aa8565b5b60405190808252806020026020018201604052801561189a57816020015b611887613a81565b81526020019060019003908161187f5790505b5095505f5b818110156118fe5784818a6118b49190614a2e565b815181106118c5576118c46149d4565b5b60200260200101518782815181106118e0576118df6149d4565b5b602002602001018190525080806118f690614a61565b91505061189f565b50858395509550505050505b935093915050565b600981565b60045481565b60605f805f60ff168460ff1603611982576001612710602361193f9190614e5c565b6040518060400160405280600881526020017f53747261696768740000000000000000000000000000000000000000000000008152509190925092509250611e01565b600160ff168460ff16036119e3575f61271060026119a09190614e5c565b6040518060400160405280601281526020017f466972737420446f7a656e2028312d31322900000000000000000000000000008152509190925092509250611e01565b600260ff168460ff1603611a44575f6127106002611a019190614e5c565b6040518060400160405280601481526020017f5365636f6e6420446f7a656e202831332d3234290000000000000000000000008152509190925092509250611e01565b600360ff168460ff1603611aa5575f6127106002611a629190614e5c565b6040518060400160405280601381526020017f546869726420446f7a656e202832352d333629000000000000000000000000008152509190925092509250611e01565b600460ff168460ff1603611b06575f6127106002611ac39190614e5c565b6040518060400160405280600c81526020017f466972737420436f6c756d6e00000000000000000000000000000000000000008152509190925092509250611e01565b600560ff168460ff1603611b67575f6127106002611b249190614e5c565b6040518060400160405280600d81526020017f5365636f6e6420436f6c756d6e000000000000000000000000000000000000008152509190925092509250611e01565b600660ff168460ff1603611bc8575f6127106002611b859190614e5c565b6040518060400160405280600c81526020017f546869726420436f6c756d6e00000000000000000000000000000000000000008152509190925092509250611e01565b600760ff168460ff1603611c1d575f6127106040518060400160405280600381526020017f52656400000000000000000000000000000000000000000000000000000000008152509190925092509250611e01565b600860ff168460ff1603611c72575f6127106040518060400160405280600581526020017f426c61636b0000000000000000000000000000000000000000000000000000008152509190925092509250611e01565b600960ff168460ff1603611cc7575f6127106040518060400160405280600481526020017f4576656e000000000000000000000000000000000000000000000000000000008152509190925092509250611e01565b600a60ff168460ff1603611d1c575f6127106040518060400160405280600381526020017f4f646400000000000000000000000000000000000000000000000000000000008152509190925092509250611e01565b600b60ff168460ff1603611d71575f6127106040518060400160405280600a81526020017f4c6f772028312d313829000000000000000000000000000000000000000000008152509190925092509250611e01565b600c60ff168460ff1603611dc6575f6127106040518060400160405280600c81526020017f48696768202831392d33362900000000000000000000000000000000000000008152509190925092509250611e01565b6040517f34460f41000000000000000000000000000000000000000000000000000000008152600401611df890614ee7565b60405180910390fd5b9193909250565b602481565b60605f600c67ffffffffffffffff811115611e2b57611e2a614aa8565b5b604051908082528060200260200182016040528015611e595781602001602082028036833780820191505090505b5090505f5b600c8160ff161015611ebf57600381611e779190614b31565b84611e829190614afd565b828260ff1681518110611e9857611e976149d4565b5b602002602001019060ff16908160ff16815250508080611eb790614ad5565b915050611e5e565b5080915050919050565b60605f600c67ffffffffffffffff811115611ee757611ee6614aa8565b5b604051908082528060200260200182016040528015611f155781602001602082028036833780820191505090505b5090505f5b600c8160ff161015611f6f578084611f329190614afd565b828260ff1681518110611f4857611f476149d4565b5b602002602001019060ff16908160ff16815250508080611f6790614ad5565b915050611f1a565b5080915050919050565b60025f5403611fb4576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f81905550565b5f805f5b84849050811015612197575f858583818110611fe057611fdf6149d4565b5b905060600201604001350361202a576040517f34460f4100000000000000000000000000000000000000000000000000000000815260040161202190614f4f565b60405180910390fd5b69152d02c7e14af6800000858583818110612048576120476149d4565b5b905060600201604001351115612093576040517f34460f4100000000000000000000000000000000000000000000000000000000815260040161208a90614fb7565b60405180910390fd5b8484828181106120a6576120a56149d4565b5b90506060020160400135836120bb9190614a2e565b92505f6120df8686848181106120d4576120d36149d4565b5b905060600201612e4f565b5090505f6120ec82613384565b90505f61271082898987818110612106576121056149d4565b5b9050606002016040013561211a9190614e5c565b6121249190615002565b905080856121329190614a2e565b94506969e10de76676d0800000861115612181576040517f34460f410000000000000000000000000000000000000000000000000000000081526004016121789061507c565b60405180910390fd5b505050808061218f90614a61565b915050611fc1565b509250929050565b8060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016121fa91906150a9565b602060405180830381865afa158015612215573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223991906150d6565b1015612316578060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161229a91906150a9565b602060405180830381865afa1580156122b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d991906150d6565b6040517f5f504d2000000000000000000000000000000000000000000000000000000000815260040161230d929190615101565b60405180910390fd5b8060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff1660e01b8152600401612373929190615128565b602060405180830381865afa15801561238e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123b291906150d6565b1015612491578060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff1660e01b8152600401612415929190615128565b602060405180830381865afa158015612430573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061245491906150d6565b6040517f2a1b2dd8000000000000000000000000000000000000000000000000000000008152600401612488929190615101565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166391d148547f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848306040518363ffffffff1660e01b815260040161250d92919061514f565b602060405180830381865afa158015612528573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254c91906151a0565b6125ad577f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8486040517fb3eebf6e0000000000000000000000000000000000000000000000000000000081526004016125a49190613d83565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166391d148547f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6306040518363ffffffff1660e01b815260040161262992919061514f565b602060405180830381865afa158015612644573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266891906151a0565b6126c9577f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66040517fb3eebf6e0000000000000000000000000000000000000000000000000000000081526004016126c09190613d83565b60405180910390fd5b5050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33846040518363ffffffff1660e01b815260040161272a9291906151cb565b5f604051808303815f87803b158015612741575f80fd5b505af1925050508015612752575060015b6127955733826040517f016f84a100000000000000000000000000000000000000000000000000000000815260040161278c9291906151cb565b60405180910390fd5b8160055f8282546127a69190614a2e565b925050819055505f6127b6613506565b90505f8686905067ffffffffffffffff8111156127d6576127d5614aa8565b5b60405190808252806020026020018201604052801561280f57816020015b6127fc613aa3565b8152602001906001900390816127f45790505b5090505f5b87879050811015612950575f806128428a8a85818110612837576128366149d4565b5b905060600201612e4f565b915091505f61286f82848d8d8881811061285f5761285e6149d4565b5b9050606002016040013589613558565b905086818861287e9190614a2e565b10156128bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b69061523c565b60405180910390fd5b80876128cb9190614a2e565b965060405180608001604052808460088111156128eb576128ea613ec0565b5b81526020018381526020018c8c87818110612909576129086149d4565b5b9050606002016040013581526020018281525085858151811061292f5761292e6149d4565b5b6020026020010181905250505050808061294890614a61565b915050612814565b50600a855f018054905010612bef575f5b6001865f01805490506129749190614e29565b811015612a2a57855f0160018261298b9190614a2e565b8154811061299c5761299b6149d4565b5b905f5260205f209060030201865f0182815481106129bd576129bc6149d4565b5b905f5260205f2090600302015f820154815f015560018201816001019080546129e7929190613ada565b50600282015f9054906101000a900460ff16816002015f6101000a81548160ff021916908360ff1602179055509050508080612a2290614a61565b915050612961565b5042855f016001875f0180549050612a429190614e29565b81548110612a5357612a526149d4565b5b905f5260205f2090600302015f018190555081855f016001875f0180549050612a7c9190614e29565b81548110612a8d57612a8c6149d4565b5b905f5260205f2090600302016002015f6101000a81548160ff021916908360ff160217905550845f016001865f0180549050612ac99190614e29565b81548110612ada57612ad96149d4565b5b905f5260205f2090600302016001015f612af49190613b92565b5f5b8151811015612be957855f016001875f0180549050612b159190614e29565b81548110612b2657612b256149d4565b5b905f5260205f209060030201600101828281518110612b4857612b476149d4565b5b6020026020010151908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f015f6101000a81548160ff02191690836008811115612b9e57612b9d613ec0565b5b02179055506020820151816001019080519060200190612bbf929190613bb3565b50604082015181600201556060820151816003015550508080612be190614a61565b915050612af6565b50612d6c565b845f0160018160018154018082558091505003905f5260205f209050505f6001865f0180549050612c209190614e29565b905042865f018281548110612c3857612c376149d4565b5b905f5260205f2090600302015f018190555082865f018281548110612c6057612c5f6149d4565b5b905f5260205f2090600302016002015f6101000a81548160ff021916908360ff1602179055505f5b8251811015612d6957865f018281548110612ca657612ca56149d4565b5b905f5260205f209060030201600101838281518110612cc857612cc76149d4565b5b6020026020010151908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f015f6101000a81548160ff02191690836008811115612d1e57612d1d613ec0565b5b02179055506020820151816001019080519060200190612d3f929190613bb3565b50604082015181600201556060820151816003015550508080612d6190614a61565b915050612c88565b50505b5f831115612e3c5760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933856040518363ffffffff1660e01b8152600401612dd09291906151cb565b5f604051808303815f87803b158015612de7575f80fd5b505af1925050508015612df8575060015b612e3b5733836040517f5c0b206f000000000000000000000000000000000000000000000000000000008152600401612e329291906151cb565b60405180910390fd5b5b5050949350505050565b60015f81905550565b5f60605f60ff16835f016020810190612e689190614179565b60ff1603612f5a57602460ff16836020016020810190612e889190614179565b60ff161115612ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec3906152a4565b60405180910390fd5b600167ffffffffffffffff811115612ee757612ee6614aa8565b5b604051908082528060200260200182016040528015612f155781602001602082028036833780820191505090505b509050826020016020810190612f2b9190614179565b815f81518110612f3e57612f3d6149d4565b5b602002602001019060ff16908160ff16815250505f915061337f565b600160ff16835f016020810190612f719190614179565b60ff1603612f8e576001612f856001611ec9565b9150915061337f565b600260ff16835f016020810190612fa59190614179565b60ff1603612fc2576001612fb9600d611ec9565b9150915061337f565b600360ff16835f016020810190612fd99190614179565b60ff1603612ff6576001612fed6019611ec9565b9150915061337f565b600460ff16835f01602081019061300d9190614179565b60ff160361302a5760026130216001611e0d565b9150915061337f565b600560ff16835f0160208101906130419190614179565b60ff160361305e5760026130556002611e0d565b9150915061337f565b600660ff16835f0160208101906130759190614179565b60ff16036130925760026130896003611e0d565b9150915061337f565b600760ff16835f0160208101906130a99190614179565b60ff16036131055760035f67ffffffffffffffff8111156130cd576130cc614aa8565b5b6040519080825280602002602001820160405280156130fb5781602001602082028036833780820191505090505b509150915061337f565b600860ff16835f01602081019061311c9190614179565b60ff16036131785760045f67ffffffffffffffff8111156131405761313f614aa8565b5b60405190808252806020026020018201604052801561316e5781602001602082028036833780820191505090505b509150915061337f565b600960ff16835f01602081019061318f9190614179565b60ff16036131eb5760055f67ffffffffffffffff8111156131b3576131b2614aa8565b5b6040519080825280602002602001820160405280156131e15781602001602082028036833780820191505090505b509150915061337f565b600a60ff16835f0160208101906132029190614179565b60ff160361325e5760065f67ffffffffffffffff81111561322657613225614aa8565b5b6040519080825280602002602001820160405280156132545781602001602082028036833780820191505090505b509150915061337f565b600b60ff16835f0160208101906132759190614179565b60ff16036132d15760075f67ffffffffffffffff81111561329957613298614aa8565b5b6040519080825280602002602001820160405280156132c75781602001602082028036833780820191505090505b509150915061337f565b600c60ff16835f0160208101906132e89190614179565b60ff16036133445760085f67ffffffffffffffff81111561330c5761330b614aa8565b5b60405190808252806020026020018201604052801561333a5781602001602082028036833780820191505090505b509150915061337f565b6040517f34460f4100000000000000000000000000000000000000000000000000000000815260040161337690614ee7565b60405180910390fd5b915091565b5f80600881111561339857613397613ec0565b5b8260088111156133ab576133aa613ec0565b5b036133c65761271060236133bf9190614e5c565b9050613501565b600160088111156133da576133d9613ec0565b5b8260088111156133ed576133ec613ec0565b5b036134085761271060026134019190614e5c565b9050613501565b6002600881111561341c5761341b613ec0565b5b82600881111561342f5761342e613ec0565b5b0361344a5761271060026134439190614e5c565b9050613501565b6003600881111561345e5761345d613ec0565b5b82600881111561347157613470613ec0565b5b101580156134a3575060088081111561348d5761348c613ec0565b5b8260088111156134a05761349f613ec0565b5b11155b156134b2576127109050613501565b8160088111156134c5576134c4613ec0565b5b6040517f6a3592470000000000000000000000000000000000000000000000000000000081526004016134f89190613db4565b60405180910390fd5b919050565b5f600160246135159190614afd565b60ff164244336003546040516020016135319493929190615327565b604051602081830303815290604052805190602001205f1c6135539190615374565b905090565b5f808303613568575f90506136aa565b69152d02c7e14af68000008311156135b5576040517f34460f410000000000000000000000000000000000000000000000000000000081526004016135ac906153ee565b60405180910390fd5b6135c08585846136b2565b156136a6575f6135cf85613384565b90505f8103613613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360a90615456565b60405180910390fd5b5f61271082866136239190614e5c565b61362d9190615002565b90505f858261363c9190614a2e565b90506a0e79c4e6a3023e8180000081111561369b57806a0e79c4e6a3023e818000006040517f21e510be000000000000000000000000000000000000000000000000000000008152600401613692929190615101565b60405180910390fd5b8093505050506136aa565b5f90505b949350505050565b5f602460ff168260ff1611156136ca575f9050613948565b5f8260ff1603613737575f60088111156136e7576136e6613ec0565b5b8360088111156136fa576136f9613ec0565b5b148015613708575060018451145b801561373057505f845f81518110613723576137226149d4565b5b602002602001015160ff16145b9050613948565b6003600881111561374b5761374a613ec0565b5b83600881111561375e5761375d613ec0565b5b036137735761376c8261394f565b9050613948565b6004600881111561378757613786613ec0565b5b83600881111561379a57613799613ec0565b5b036137bf576137a88261394f565b1580156137b857505f8260ff1614155b9050613948565b600560088111156137d3576137d2613ec0565b5b8360088111156137e6576137e5613ec0565b5b03613813575f6002836137f99190615474565b60ff1614801561380c57505f8260ff1614155b9050613948565b6006600881111561382757613826613ec0565b5b83600881111561383a57613839613ec0565b5b0361385957600160028361384e9190615474565b60ff16149050613948565b6007600881111561386d5761386c613ec0565b5b8360088111156138805761387f613ec0565b5b036138a45760018260ff161015801561389d575060128260ff1611155b9050613948565b6008808111156138b7576138b6613ec0565b5b8360088111156138ca576138c9613ec0565b5b036138ee5760138260ff16101580156138e7575060248260ff1611155b9050613948565b5f5b84518160ff161015613943578260ff16858260ff1681518110613916576139156149d4565b5b602002602001015160ff1603613930576001915050613948565b808061393b90614ad5565b9150506138f0565b505f90505b9392505050565b5f808260ff1603613962575f9050613a7c565b5f604051806102400160405280600160ff168152602001600360ff168152602001600560ff168152602001600760ff168152602001600960ff168152602001600c60ff168152602001600e60ff168152602001601060ff168152602001601260ff168152602001601360ff168152602001601560ff168152602001601760ff168152602001601960ff168152602001601b60ff168152602001601e60ff168152602001602060ff168152602001602260ff168152602001602460ff1681525090505f5b60128160ff161015613a76578360ff16828260ff1660128110613a4b57613a4a6149d4565b5b602002015160ff1603613a6357600192505050613a7c565b8080613a6e90614ad5565b915050613a25565b505f9150505b919050565b60405180606001604052805f8152602001606081526020015f60ff1681525090565b60405180608001604052805f6008811115613ac157613ac0613ec0565b5b8152602001606081526020015f81526020015f81525090565b828054828255905f5260205f20906004028101928215613b81575f5260205f209160040282015b82811115613b805782825f82015f9054906101000a900460ff16815f015f6101000a81548160ff02191690836008811115613b3f57613b3e613ec0565b5b02179055506001820181600101908054613b5a929190613c55565b506002820154816002015560038201548160030155505091600401919060040190613b01565b5b509050613b8e9190613cb1565b5090565b5080545f8255600402905f5260205f2090810190613bb09190613cb1565b50565b828054828255905f5260205f2090601f01602090048101928215613c44579160200282015f5b83821115613c1657835183826101000a81548160ff021916908360ff16021790555092602001926001016020815f01049283019260010302613bd9565b8015613c425782816101000a81549060ff02191690556001016020815f01049283019260010302613c16565b505b509050613c519190613cf7565b5090565b828054828255905f5260205f2090601f01602090048101928215613ca0575f5260205f2091601f016020900482015b82811115613c9f578254825591600101919060010190613c84565b5b509050613cad9190613cf7565b5090565b5b80821115613cf3575f8082015f6101000a81549060ff0219169055600182015f613cdc9190613d12565b600282015f9055600382015f905550600401613cb2565b5090565b5b80821115613d0e575f815f905550600101613cf8565b5090565b5080545f8255601f0160209004905f5260205f2090810190613d349190613cf7565b50565b5f60ff82169050919050565b613d4c81613d37565b82525050565b5f602082019050613d655f830184613d43565b92915050565b5f819050919050565b613d7d81613d6b565b82525050565b5f602082019050613d965f830184613d74565b92915050565b5f819050919050565b613dae81613d9c565b82525050565b5f602082019050613dc75f830184613da5565b92915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613dfe82613dd5565b9050919050565b613e0e81613df4565b8114613e18575f80fd5b50565b5f81359050613e2981613e05565b92915050565b613e3881613d9c565b8114613e42575f80fd5b50565b5f81359050613e5381613e2f565b92915050565b5f8060408385031215613e6f57613e6e613dcd565b5b5f613e7c85828601613e1b565b9250506020613e8d85828601613e45565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60098110613efe57613efd613ec0565b5b50565b5f819050613f0e82613eed565b919050565b5f613f1d82613f01565b9050919050565b613f2d81613f13565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613f6581613d37565b82525050565b5f613f768383613f5c565b60208301905092915050565b5f602082019050919050565b5f613f9882613f33565b613fa28185613f3d565b9350613fad83613f4d565b805f5b83811015613fdd578151613fc48882613f6b565b9750613fcf83613f82565b925050600181019050613fb0565b5085935050505092915050565b613ff381613d9c565b82525050565b5f608083015f83015161400e5f860182613f24565b50602083015184820360208601526140268282613f8e565b915050604083015161403b6040860182613fea565b50606083015161404e6060860182613fea565b508091505092915050565b5f6140648383613ff9565b905092915050565b5f602082019050919050565b5f61408282613e97565b61408c8185613ea1565b93508360208202850161409e85613eb1565b805f5b858110156140d957848403895281516140ba8582614059565b94506140c58361406c565b925060208a019950506001810190506140a1565b50829750879550505050505092915050565b5f8115159050919050565b6140ff816140eb565b82525050565b5f6080820190506141185f830187613da5565b818103602083015261412a8186614078565b90506141396040830185613d43565b61414660608301846140f6565b95945050505050565b61415881613d37565b8114614162575f80fd5b50565b5f813590506141738161414f565b92915050565b5f6020828403121561418e5761418d613dcd565b5b5f61419b84828501614165565b91505092915050565b5f82825260208201905092915050565b5f6141be82613f33565b6141c881856141a4565b93506141d383613f4d565b805f5b838110156142035781516141ea8882613f6b565b97506141f583613f82565b9250506001810190506141d6565b5085935050505092915050565b5f6020820190508181035f83015261422881846141b4565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015614290578082015181840152602081019050614275565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6142b582614259565b6142bf8185614263565b93506142cf818560208601614273565b6142d88161429b565b840191505092915050565b5f6142ee83836142ab565b905092915050565b5f602082019050919050565b5f61430c82614230565b614316818561423a565b9350836020820285016143288561424a565b805f5b85811015614363578484038952815161434485826142e3565b945061434f836142f6565b925060208a0199505060018101905061432b565b50829750879550505050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6143a7816140eb565b82525050565b5f6143b8838361439e565b60208301905092915050565b5f602082019050919050565b5f6143da82614375565b6143e4818561437f565b93506143ef8361438f565b805f5b8381101561441f57815161440688826143ad565b9750614411836143c4565b9250506001810190506143f2565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f6144608383613fea565b60208301905092915050565b5f602082019050919050565b5f6144828261442c565b61448c8185614436565b935061449783614446565b805f5b838110156144c75781516144ae8882614455565b97506144b98361446c565b92505060018101905061449a565b5085935050505092915050565b5f6080820190508181035f8301526144ec81876141b4565b905081810360208301526145008186614302565b9050818103604083015261451481856143d0565b905081810360608301526145288184614478565b905095945050505050565b6009811061453f575f80fd5b50565b5f8135905061455081614533565b92915050565b5f806040838503121561456c5761456b613dcd565b5b5f61457985828601614542565b925050602061458a85828601614165565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126145b5576145b4614594565b5b8235905067ffffffffffffffff8111156145d2576145d1614598565b5b6020830191508360608202830111156145ee576145ed61459c565b5b9250929050565b5f806020838503121561460b5761460a613dcd565b5b5f83013567ffffffffffffffff81111561462857614627613dd1565b5b614634858286016145a0565b92509250509250929050565b5f6020828403121561465557614654613dcd565b5b5f61466284828501613e1b565b91505092915050565b5f819050919050565b5f61468e61468961468484613dd5565b61466b565b613dd5565b9050919050565b5f61469f82614674565b9050919050565b5f6146b082614695565b9050919050565b6146c0816146a6565b82525050565b5f6020820190506146d95f8301846146b7565b92915050565b5f805f606084860312156146f6576146f5613dcd565b5b5f61470386828701613e1b565b935050602061471486828701613e45565b925050604061472586828701613e45565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f82825260208201905092915050565b5f61477282613e97565b61477c8185614758565b93508360208202850161478e85613eb1565b805f5b858110156147c957848403895281516147aa8582614059565b94506147b58361406c565b925060208a01995050600181019050614791565b50829750879550505050505092915050565b5f606083015f8301516147f05f860182613fea565b50602083015184820360208601526148088282614768565b915050604083015161481d6040860182613f5c565b508091505092915050565b5f61483383836147db565b905092915050565b5f602082019050919050565b5f6148518261472f565b61485b8185614739565b93508360208202850161486d85614749565b805f5b858110156148a857848403895281516148898582614828565b94506148948361483b565b925060208a01995050600181019050614870565b50829750879550505050505092915050565b5f6040820190508181035f8301526148d28185614847565b90506148e16020830184613da5565b9392505050565b5f82825260208201905092915050565b5f61490282614259565b61490c81856148e8565b935061491c818560208601614273565b6149258161429b565b840191505092915050565b5f6060820190508181035f83015261494881866148f8565b905061495760208301856140f6565b6149646040830184613da5565b949350505050565b7f496e76616c69642062657420696e6465780000000000000000000000000000005f82015250565b5f6149a06011836148e8565b91506149ab8261496c565b602082019050919050565b5f6020820190508181035f8301526149cd81614994565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614a3882613d9c565b9150614a4383613d9c565b9250828201905080821115614a5b57614a5a614a01565b5b92915050565b5f614a6b82613d9c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a9d57614a9c614a01565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f614adf82613d37565b915060ff8203614af257614af1614a01565b5b600182019050919050565b5f614b0782613d37565b9150614b1283613d37565b9250828201905060ff811115614b2b57614b2a614a01565b5b92915050565b5f614b3b82613d37565b9150614b4683613d37565b9250828202614b5481613d37565b9150808214614b6657614b65614a01565b5b5092915050565b7f496e76616c696420626574207479706520494420666f72206e756d62657220675f8201527f656e65726174696f6e0000000000000000000000000000000000000000000000602082015250565b5f614bc76029836148e8565b9150614bd282614b6d565b604082019050919050565b5f6020820190508181035f830152614bf481614bbb565b9050919050565b7f496e76616c696420636f6c756d6e2073746172740000000000000000000000005f82015250565b5f614c2f6014836148e8565b9150614c3a82614bfb565b602082019050919050565b5f6020820190508181035f830152614c5c81614c23565b9050919050565b7f496e76616c696420646f7a656e207374617274000000000000000000000000005f82015250565b5f614c976013836148e8565b9150614ca282614c63565b602082019050919050565b5f6020820190508181035f830152614cc481614c8b565b9050919050565b7f496e76616c696420626574207479706520666f72206e756d6265722067656e655f8201527f726174696f6e0000000000000000000000000000000000000000000000000000602082015250565b5f614d256026836148e8565b9150614d3082614ccb565b604082019050919050565b5f6020820190508181035f830152614d5281614d19565b9050919050565b7f4e6f20626574732070726f7669646564000000000000000000000000000000005f82015250565b5f614d8d6010836148e8565b9150614d9882614d59565b602082019050919050565b5f6020820190508181035f830152614dba81614d81565b9050919050565b7f546f6f206d616e792062657473000000000000000000000000000000000000005f82015250565b5f614df5600d836148e8565b9150614e0082614dc1565b602082019050919050565b5f6020820190508181035f830152614e2281614de9565b9050919050565b5f614e3382613d9c565b9150614e3e83613d9c565b9250828203905081811115614e5657614e55614a01565b5b92915050565b5f614e6682613d9c565b9150614e7183613d9c565b9250828202614e7f81613d9c565b91508282048414831517614e9657614e95614a01565b5b5092915050565b7f496e76616c6964206265742074797065204944000000000000000000000000005f82015250565b5f614ed16013836148e8565b9150614edc82614e9d565b602082019050919050565b5f6020820190508181035f830152614efe81614ec5565b9050919050565b7f496e76616c69642062657420616d6f756e7400000000000000000000000000005f82015250565b5f614f396012836148e8565b9150614f4482614f05565b602082019050919050565b5f6020820190508181035f830152614f6681614f2d565b9050919050565b7f53696e676c652062657420616d6f756e7420746f6f206c6172676500000000005f82015250565b5f614fa1601b836148e8565b9150614fac82614f6d565b602082019050919050565b5f6020820190508181035f830152614fce81614f95565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61500c82613d9c565b915061501783613d9c565b92508261502757615026614fd5565b5b828204905092915050565b7f546f74616c2062657420616d6f756e7420746f6f206c617267650000000000005f82015250565b5f615066601a836148e8565b915061507182615032565b602082019050919050565b5f6020820190508181035f8301526150938161505a565b9050919050565b6150a381613df4565b82525050565b5f6020820190506150bc5f83018461509a565b92915050565b5f815190506150d081613e2f565b92915050565b5f602082840312156150eb576150ea613dcd565b5b5f6150f8848285016150c2565b91505092915050565b5f6040820190506151145f830185613da5565b6151216020830184613da5565b9392505050565b5f60408201905061513b5f83018561509a565b615148602083018461509a565b9392505050565b5f6040820190506151625f830185613d74565b61516f602083018461509a565b9392505050565b61517f816140eb565b8114615189575f80fd5b50565b5f8151905061519a81615176565b92915050565b5f602082840312156151b5576151b4613dcd565b5b5f6151c28482850161518c565b91505092915050565b5f6040820190506151de5f83018561509a565b6151eb6020830184613da5565b9392505050565b7f5061796f7574206f766572666c6f7700000000000000000000000000000000005f82015250565b5f615226600f836148e8565b9150615231826151f2565b602082019050919050565b5f6020820190508181035f8301526152538161521a565b9050919050565b7f496e76616c6964206e756d62657220666f7220737472616967687420626574005f82015250565b5f61528e601f836148e8565b91506152998261525a565b602082019050919050565b5f6020820190508181035f8301526152bb81615282565b9050919050565b5f819050919050565b6152dc6152d782613d9c565b6152c2565b82525050565b5f8160601b9050919050565b5f6152f8826152e2565b9050919050565b5f615309826152ee565b9050919050565b61532161531c82613df4565b6152ff565b82525050565b5f61533282876152cb565b60208201915061534282866152cb565b6020820191506153528285615310565b60148201915061536282846152cb565b60208201915081905095945050505050565b5f61537e82613d9c565b915061538983613d9c565b92508261539957615398614fd5565b5b828206905092915050565b7f42657420616d6f756e742065786365656473206d6178696d756d0000000000005f82015250565b5f6153d8601a836148e8565b91506153e3826153a4565b602082019050919050565b5f6020820190508181035f830152615405816153cc565b9050919050565b7f496e76616c6964206d756c7469706c69657200000000000000000000000000005f82015250565b5f6154406012836148e8565b915061544b8261540c565b602082019050919050565b5f6020820190508181035f83015261546d81615434565b9050919050565b5f61547e82613d37565b915061548983613d37565b92508261549957615498614fd5565b5b82820690509291505056fea264697066735822122003d2503576067090bc2d25e52f640a7ddf89b993f0443fa5c4d7322b050eebf864736f6c63430008140033000000000000000000000000678adf7955d8f6dcaa9e2fcc1c5ba70bccc464e6
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101f9575f3560e01c806394bae38511610118578063d5391393116100ab578063e3286e551161007a578063e3286e5514610591578063e60271cf146105c2578063e7efcfc2146105e0578063fa198c4f146105fe578063fea9b57214610630576101f9565b8063d539139314610519578063d56ec8c914610537578063d6b6cd5914610555578063ddebc95214610573576101f9565b8063b8a5e438116100e7578063b8a5e43814610491578063c1066251146104af578063c1a5fe51146104cd578063c8910913146104e9576101f9565b806394bae385146104075780639793e1d614610425578063a398222714610455578063b34daef414610473576101f9565b80634689b44111610190578063790231701161015f578063790231701461038c5780637d3d31ad146103ad578063918f8674146103cb57806394b9b507146103e9576101f9565b80634689b441146103025780635a0db4d2146103205780635bdb2e1b146103505780635c4921291461036e576101f9565b80632ff21494116101cc5780632ff2149414610275578063309167f5146102a857806336b39a60146102c6578063432aeb8f146102e4576101f9565b806319469f1b146101fd5780632257b0571461021b578063282c51f3146102395780632d2cd03414610257575b5f80fd5b61020561064e565b6040516102129190613d52565b60405180910390f35b610223610653565b6040516102309190613d52565b60405180910390f35b610241610658565b60405161024e9190613d83565b60405180910390f35b61025f61067c565b60405161026c9190613db4565b60405180910390f35b61028f600480360381019061028a9190613e59565b61068a565b60405161029f9493929190614105565b60405180910390f35b6102b061093e565b6040516102bd9190613db4565b60405180910390f35b6102ce61094c565b6040516102db9190613d52565b60405180910390f35b6102ec610951565b6040516102f99190613d52565b60405180910390f35b61030a610955565b6040516103179190613db4565b60405180910390f35b61033a60048036038101906103359190614179565b610964565b6040516103479190614210565b60405180910390f35b61035861105e565b6040516103659190613db4565b60405180910390f35b610376611064565b6040516103839190613db4565b60405180910390f35b61039461106a565b6040516103a494939291906144d4565b60405180910390f35b6103b561127b565b6040516103c29190613d52565b60405180910390f35b6103d3611280565b6040516103e09190613db4565b60405180910390f35b6103f1611286565b6040516103fe9190613d52565b60405180910390f35b61040f61128b565b60405161041c9190613d52565b60405180910390f35b61043f600480360381019061043a9190614556565b611290565b60405161044c9190614210565b60405180910390f35b61045d61140f565b60405161046a9190613d52565b60405180910390f35b61047b611414565b6040516104889190613d52565b60405180910390f35b610499611419565b6040516104a69190613d52565b60405180910390f35b6104b761141e565b6040516104c49190613db4565b60405180910390f35b6104e760048036038101906104e291906145f5565b611423565b005b61050360048036038101906104fe9190614640565b611563565b6040516105109190613db4565b60405180910390f35b61052161157e565b60405161052e9190613d83565b60405180910390f35b61053f6115a2565b60405161054c91906146c6565b60405180910390f35b61055d6115c7565b60405161056a9190613d52565b60405180910390f35b61057b6115cc565b6040516105889190613d52565b60405180910390f35b6105ab60048036038101906105a691906146df565b6115d1565b6040516105b99291906148ba565b60405180910390f35b6105ca611912565b6040516105d79190613d52565b60405180910390f35b6105e8611917565b6040516105f59190613db4565b60405180910390f35b61061860048036038101906106139190614179565b61191d565b60405161062793929190614930565b60405180910390f35b610638611e08565b6040516106459190613d52565b60405180910390f35b600881565b600581565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b6969e10de76676d080000081565b5f60605f8060025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01805490508510610713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070a906149b6565b60405180910390fd5b5f60025f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f018681548110610765576107646149d4565b5b905f5260205f2090600302016040518060600160405290815f820154815260200160018201805480602002602001604051908101604052809291908181526020015f905b828210156108a0578382905f5260205f2090600402016040518060800160405290815f82015f9054906101000a900460ff1660088111156107ed576107ec613ec0565b5b60088111156107ff576107fe613ec0565b5b81526020016001820180548060200260200160405190810160405280929190818152602001828054801561087457602002820191905f5260205f20905f905b82829054906101000a900460ff1660ff16815260200190600101906020825f0104928301926001038202915080841161083e5790505b5050505050815260200160028201548152602001600382015481525050815260200190600101906107a9565b505050508152602001600282015f9054906101000a900460ff1660ff1660ff168152505090505f805b82602001515181101561091957826020015181815181106108ed576108ec6149d4565b5b602002602001015160600151826109049190614a2e565b9150808061091190614a61565b9150506108c9565b50815f0151826020015183604001515f84119550955095509550505092959194509250565b69152d02c7e14af680000081565b600181565b5f81565b6a0e79c4e6a3023e8180000081565b60605f60ff168260ff1603610a1057602567ffffffffffffffff81111561098e5761098d614aa8565b5b6040519080825280602002602001820160405280156109bc5781602001602082028036833780820191505090505b5090505f5b60248160ff1611610a0a5780828260ff16815181106109e3576109e26149d4565b5b602002602001019060ff16908160ff16815250508080610a0290614ad5565b9150506109c1565b50611059565b600760ff168260ff1603610b9857601267ffffffffffffffff811115610a3957610a38614aa8565b5b604051908082528060200260200182016040528015610a675781602001602082028036833780820191505090505b5090505f604051806102400160405280600160ff168152602001600360ff168152602001600560ff168152602001600760ff168152602001600960ff168152602001600c60ff168152602001600e60ff168152602001601060ff168152602001601260ff168152602001601360ff168152602001601560ff168152602001601760ff168152602001601960ff168152602001601b60ff168152602001601e60ff168152602001602060ff168152602001602260ff168152602001602460ff1681525090505f5b60128160ff161015610b9157818160ff1660128110610b4f57610b4e6149d4565b5b6020020151838260ff1681518110610b6a57610b696149d4565b5b602002602001019060ff16908160ff16815250508080610b8990614ad5565b915050610b2d565b5050611058565b600860ff168260ff1603610d2057601267ffffffffffffffff811115610bc157610bc0614aa8565b5b604051908082528060200260200182016040528015610bef5781602001602082028036833780820191505090505b5090505f604051806102400160405280600260ff168152602001600460ff168152602001600660ff168152602001600860ff168152602001600a60ff168152602001600b60ff168152602001600d60ff168152602001600f60ff168152602001601160ff168152602001601460ff168152602001601660ff168152602001601860ff168152602001601a60ff168152602001601c60ff168152602001601d60ff168152602001601f60ff168152602001602160ff168152602001602360ff1681525090505f5b60128160ff161015610d1957818160ff1660128110610cd757610cd66149d4565b5b6020020151838260ff1681518110610cf257610cf16149d4565b5b602002602001019060ff16908160ff16815250508080610d1190614ad5565b915050610cb5565b5050611057565b600960ff168260ff1603610de457601267ffffffffffffffff811115610d4957610d48614aa8565b5b604051908082528060200260200182016040528015610d775781602001602082028036833780820191505090505b5090505f5b60128160ff161015610dde576002600182610d979190614afd565b610da19190614b31565b828260ff1681518110610db757610db66149d4565b5b602002602001019060ff16908160ff16815250508080610dd690614ad5565b915050610d7c565b50611056565b600a60ff168260ff1603610ea857601267ffffffffffffffff811115610e0d57610e0c614aa8565b5b604051908082528060200260200182016040528015610e3b5781602001602082028036833780820191505090505b5090505f5b60128160ff161015610ea2576001600282610e5b9190614b31565b610e659190614afd565b828260ff1681518110610e7b57610e7a6149d4565b5b602002602001019060ff16908160ff16815250508080610e9a90614ad5565b915050610e40565b50611055565b600b60ff168260ff1603610f6057601267ffffffffffffffff811115610ed157610ed0614aa8565b5b604051908082528060200260200182016040528015610eff5781602001602082028036833780820191505090505b5090505f5b60128160ff161015610f5a57600181610f1d9190614afd565b828260ff1681518110610f3357610f326149d4565b5b602002602001019060ff16908160ff16815250508080610f5290614ad5565b915050610f04565b50611054565b600c60ff168260ff160361101857601267ffffffffffffffff811115610f8957610f88614aa8565b5b604051908082528060200260200182016040528015610fb75781602001602082028036833780820191505090505b5090505f5b60128160ff16101561101257601381610fd59190614afd565b828260ff1681518110610feb57610fea6149d4565b5b602002602001019060ff16908160ff1681525050808061100a90614ad5565b915050610fbc565b50611053565b6040517f34460f4100000000000000000000000000000000000000000000000000000000815260040161104a90614bdd565b60405180910390fd5b5b5b5b5b5b5b919050565b60055481565b60035481565b606080606080600d67ffffffffffffffff81111561108b5761108a614aa8565b5b6040519080825280602002602001820160405280156110b95781602001602082028036833780820191505090505b509350600d67ffffffffffffffff8111156110d7576110d6614aa8565b5b60405190808252806020026020018201604052801561110a57816020015b60608152602001906001900390816110f55790505b509250600d67ffffffffffffffff81111561112857611127614aa8565b5b6040519080825280602002602001820160405280156111565781602001602082028036833780820191505090505b509150600d67ffffffffffffffff81111561117457611173614aa8565b5b6040519080825280602002602001820160405280156111a25781602001602082028036833780820191505090505b5090505f5b600d8160ff161015611274575f805f6111bf8461191d565b92509250925083888560ff16815181106111dc576111db6149d4565b5b602002602001019060ff16908160ff168152505082878560ff1681518110611207576112066149d4565b5b602002602001018190525081868560ff1681518110611229576112286149d4565b5b60200260200101901515908115158152505080858560ff1681518110611252576112516149d4565b5b602002602001018181525050505050808061126c90614ad5565b9150506111a7565b5090919293565b600c81565b61271081565b600b81565b600a81565b6060600260088111156112a6576112a5613ec0565b5b8360088111156112b9576112b8613ec0565b5b036113305760018260ff1614806112d3575060028260ff16145b806112e1575060038260ff16145b611320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131790614c45565b60405180910390fd5b61132982611e0d565b9050611409565b6001600881111561134457611343613ec0565b5b83600881111561135757611356613ec0565b5b036113ce5760018260ff1614806113715750600d8260ff16145b8061137f575060198260ff16145b6113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b590614cad565b60405180910390fd5b6113c782611ec9565b9050611409565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614d3b565b60405180910390fd5b92915050565b600781565b600281565b600481565b600a81565b61142b611f79565b5f8282905003611470576040517f34460f4100000000000000000000000000000000000000000000000000000000815260040161146790614da3565b60405180910390fd5b600f8282905011156114b7576040517f34460f410000000000000000000000000000000000000000000000000000000081526004016114ae90614e0b565b60405180910390fd5b5f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f806115038585611fbd565b8092508193505050611515338361219f565b5f611522868686866126cd565b905060035f81548092919061153690614a61565b91905055508060045f82825461154c9190614a2e565b925050819055505050505061155f612e46565b5050565b6002602052805f5260405f205f915090508060010154905081565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600381565b600681565b60605f8060025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01805480602002602001604051908101604052809291908181526020015f905b828210156117ab578382905f5260205f2090600302016040518060600160405290815f820154815260200160018201805480602002602001604051908101604052809291908181526020015f905b82821015611778578382905f5260205f2090600402016040518060800160405290815f82015f9054906101000a900460ff1660088111156116c5576116c4613ec0565b5b60088111156116d7576116d6613ec0565b5b81526020016001820180548060200260200160405190810160405280929190818152602001828054801561174c57602002820191905f5260205f20905f905b82829054906101000a900460ff1660ff16815260200190600101906020825f010492830192600103820291508084116117165790505b505050505081526020016002820154815260200160038201548152505081526020019060010190611681565b505050508152602001600282015f9054906101000a900460ff1660ff1660ff168152505081526020019060010190611633565b5050505090505f8151905080861061181d575f67ffffffffffffffff8111156117d7576117d6614aa8565b5b60405190808252806020026020018201604052801561181057816020015b6117fd613a81565b8152602001906001900390816117f55790505b508193509350505061190a565b5f858761182a9190614a2e565b905081811115611838578190505b5f87826118459190614e29565b90508067ffffffffffffffff81111561186157611860614aa8565b5b60405190808252806020026020018201604052801561189a57816020015b611887613a81565b81526020019060019003908161187f5790505b5095505f5b818110156118fe5784818a6118b49190614a2e565b815181106118c5576118c46149d4565b5b60200260200101518782815181106118e0576118df6149d4565b5b602002602001018190525080806118f690614a61565b91505061189f565b50858395509550505050505b935093915050565b600981565b60045481565b60605f805f60ff168460ff1603611982576001612710602361193f9190614e5c565b6040518060400160405280600881526020017f53747261696768740000000000000000000000000000000000000000000000008152509190925092509250611e01565b600160ff168460ff16036119e3575f61271060026119a09190614e5c565b6040518060400160405280601281526020017f466972737420446f7a656e2028312d31322900000000000000000000000000008152509190925092509250611e01565b600260ff168460ff1603611a44575f6127106002611a019190614e5c565b6040518060400160405280601481526020017f5365636f6e6420446f7a656e202831332d3234290000000000000000000000008152509190925092509250611e01565b600360ff168460ff1603611aa5575f6127106002611a629190614e5c565b6040518060400160405280601381526020017f546869726420446f7a656e202832352d333629000000000000000000000000008152509190925092509250611e01565b600460ff168460ff1603611b06575f6127106002611ac39190614e5c565b6040518060400160405280600c81526020017f466972737420436f6c756d6e00000000000000000000000000000000000000008152509190925092509250611e01565b600560ff168460ff1603611b67575f6127106002611b249190614e5c565b6040518060400160405280600d81526020017f5365636f6e6420436f6c756d6e000000000000000000000000000000000000008152509190925092509250611e01565b600660ff168460ff1603611bc8575f6127106002611b859190614e5c565b6040518060400160405280600c81526020017f546869726420436f6c756d6e00000000000000000000000000000000000000008152509190925092509250611e01565b600760ff168460ff1603611c1d575f6127106040518060400160405280600381526020017f52656400000000000000000000000000000000000000000000000000000000008152509190925092509250611e01565b600860ff168460ff1603611c72575f6127106040518060400160405280600581526020017f426c61636b0000000000000000000000000000000000000000000000000000008152509190925092509250611e01565b600960ff168460ff1603611cc7575f6127106040518060400160405280600481526020017f4576656e000000000000000000000000000000000000000000000000000000008152509190925092509250611e01565b600a60ff168460ff1603611d1c575f6127106040518060400160405280600381526020017f4f646400000000000000000000000000000000000000000000000000000000008152509190925092509250611e01565b600b60ff168460ff1603611d71575f6127106040518060400160405280600a81526020017f4c6f772028312d313829000000000000000000000000000000000000000000008152509190925092509250611e01565b600c60ff168460ff1603611dc6575f6127106040518060400160405280600c81526020017f48696768202831392d33362900000000000000000000000000000000000000008152509190925092509250611e01565b6040517f34460f41000000000000000000000000000000000000000000000000000000008152600401611df890614ee7565b60405180910390fd5b9193909250565b602481565b60605f600c67ffffffffffffffff811115611e2b57611e2a614aa8565b5b604051908082528060200260200182016040528015611e595781602001602082028036833780820191505090505b5090505f5b600c8160ff161015611ebf57600381611e779190614b31565b84611e829190614afd565b828260ff1681518110611e9857611e976149d4565b5b602002602001019060ff16908160ff16815250508080611eb790614ad5565b915050611e5e565b5080915050919050565b60605f600c67ffffffffffffffff811115611ee757611ee6614aa8565b5b604051908082528060200260200182016040528015611f155781602001602082028036833780820191505090505b5090505f5b600c8160ff161015611f6f578084611f329190614afd565b828260ff1681518110611f4857611f476149d4565b5b602002602001019060ff16908160ff16815250508080611f6790614ad5565b915050611f1a565b5080915050919050565b60025f5403611fb4576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f81905550565b5f805f5b84849050811015612197575f858583818110611fe057611fdf6149d4565b5b905060600201604001350361202a576040517f34460f4100000000000000000000000000000000000000000000000000000000815260040161202190614f4f565b60405180910390fd5b69152d02c7e14af6800000858583818110612048576120476149d4565b5b905060600201604001351115612093576040517f34460f4100000000000000000000000000000000000000000000000000000000815260040161208a90614fb7565b60405180910390fd5b8484828181106120a6576120a56149d4565b5b90506060020160400135836120bb9190614a2e565b92505f6120df8686848181106120d4576120d36149d4565b5b905060600201612e4f565b5090505f6120ec82613384565b90505f61271082898987818110612106576121056149d4565b5b9050606002016040013561211a9190614e5c565b6121249190615002565b905080856121329190614a2e565b94506969e10de76676d0800000861115612181576040517f34460f410000000000000000000000000000000000000000000000000000000081526004016121789061507c565b60405180910390fd5b505050808061218f90614a61565b915050611fc1565b509250929050565b8060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016121fa91906150a9565b602060405180830381865afa158015612215573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223991906150d6565b1015612316578060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b815260040161229a91906150a9565b602060405180830381865afa1580156122b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d991906150d6565b6040517f5f504d2000000000000000000000000000000000000000000000000000000000815260040161230d929190615101565b60405180910390fd5b8060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff1660e01b8152600401612373929190615128565b602060405180830381865afa15801561238e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123b291906150d6565b1015612491578060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff1660e01b8152600401612415929190615128565b602060405180830381865afa158015612430573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061245491906150d6565b6040517f2a1b2dd8000000000000000000000000000000000000000000000000000000008152600401612488929190615101565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166391d148547f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848306040518363ffffffff1660e01b815260040161250d92919061514f565b602060405180830381865afa158015612528573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254c91906151a0565b6125ad577f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8486040517fb3eebf6e0000000000000000000000000000000000000000000000000000000081526004016125a49190613d83565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166391d148547f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6306040518363ffffffff1660e01b815260040161262992919061514f565b602060405180830381865afa158015612644573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266891906151a0565b6126c9577f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66040517fb3eebf6e0000000000000000000000000000000000000000000000000000000081526004016126c09190613d83565b60405180910390fd5b5050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33846040518363ffffffff1660e01b815260040161272a9291906151cb565b5f604051808303815f87803b158015612741575f80fd5b505af1925050508015612752575060015b6127955733826040517f016f84a100000000000000000000000000000000000000000000000000000000815260040161278c9291906151cb565b60405180910390fd5b8160055f8282546127a69190614a2e565b925050819055505f6127b6613506565b90505f8686905067ffffffffffffffff8111156127d6576127d5614aa8565b5b60405190808252806020026020018201604052801561280f57816020015b6127fc613aa3565b8152602001906001900390816127f45790505b5090505f5b87879050811015612950575f806128428a8a85818110612837576128366149d4565b5b905060600201612e4f565b915091505f61286f82848d8d8881811061285f5761285e6149d4565b5b9050606002016040013589613558565b905086818861287e9190614a2e565b10156128bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b69061523c565b60405180910390fd5b80876128cb9190614a2e565b965060405180608001604052808460088111156128eb576128ea613ec0565b5b81526020018381526020018c8c87818110612909576129086149d4565b5b9050606002016040013581526020018281525085858151811061292f5761292e6149d4565b5b6020026020010181905250505050808061294890614a61565b915050612814565b50600a855f018054905010612bef575f5b6001865f01805490506129749190614e29565b811015612a2a57855f0160018261298b9190614a2e565b8154811061299c5761299b6149d4565b5b905f5260205f209060030201865f0182815481106129bd576129bc6149d4565b5b905f5260205f2090600302015f820154815f015560018201816001019080546129e7929190613ada565b50600282015f9054906101000a900460ff16816002015f6101000a81548160ff021916908360ff1602179055509050508080612a2290614a61565b915050612961565b5042855f016001875f0180549050612a429190614e29565b81548110612a5357612a526149d4565b5b905f5260205f2090600302015f018190555081855f016001875f0180549050612a7c9190614e29565b81548110612a8d57612a8c6149d4565b5b905f5260205f2090600302016002015f6101000a81548160ff021916908360ff160217905550845f016001865f0180549050612ac99190614e29565b81548110612ada57612ad96149d4565b5b905f5260205f2090600302016001015f612af49190613b92565b5f5b8151811015612be957855f016001875f0180549050612b159190614e29565b81548110612b2657612b256149d4565b5b905f5260205f209060030201600101828281518110612b4857612b476149d4565b5b6020026020010151908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f015f6101000a81548160ff02191690836008811115612b9e57612b9d613ec0565b5b02179055506020820151816001019080519060200190612bbf929190613bb3565b50604082015181600201556060820151816003015550508080612be190614a61565b915050612af6565b50612d6c565b845f0160018160018154018082558091505003905f5260205f209050505f6001865f0180549050612c209190614e29565b905042865f018281548110612c3857612c376149d4565b5b905f5260205f2090600302015f018190555082865f018281548110612c6057612c5f6149d4565b5b905f5260205f2090600302016002015f6101000a81548160ff021916908360ff1602179055505f5b8251811015612d6957865f018281548110612ca657612ca56149d4565b5b905f5260205f209060030201600101838281518110612cc857612cc76149d4565b5b6020026020010151908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f015f6101000a81548160ff02191690836008811115612d1e57612d1d613ec0565b5b02179055506020820151816001019080519060200190612d3f929190613bb3565b50604082015181600201556060820151816003015550508080612d6190614a61565b915050612c88565b50505b5f831115612e3c5760015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933856040518363ffffffff1660e01b8152600401612dd09291906151cb565b5f604051808303815f87803b158015612de7575f80fd5b505af1925050508015612df8575060015b612e3b5733836040517f5c0b206f000000000000000000000000000000000000000000000000000000008152600401612e329291906151cb565b60405180910390fd5b5b5050949350505050565b60015f81905550565b5f60605f60ff16835f016020810190612e689190614179565b60ff1603612f5a57602460ff16836020016020810190612e889190614179565b60ff161115612ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec3906152a4565b60405180910390fd5b600167ffffffffffffffff811115612ee757612ee6614aa8565b5b604051908082528060200260200182016040528015612f155781602001602082028036833780820191505090505b509050826020016020810190612f2b9190614179565b815f81518110612f3e57612f3d6149d4565b5b602002602001019060ff16908160ff16815250505f915061337f565b600160ff16835f016020810190612f719190614179565b60ff1603612f8e576001612f856001611ec9565b9150915061337f565b600260ff16835f016020810190612fa59190614179565b60ff1603612fc2576001612fb9600d611ec9565b9150915061337f565b600360ff16835f016020810190612fd99190614179565b60ff1603612ff6576001612fed6019611ec9565b9150915061337f565b600460ff16835f01602081019061300d9190614179565b60ff160361302a5760026130216001611e0d565b9150915061337f565b600560ff16835f0160208101906130419190614179565b60ff160361305e5760026130556002611e0d565b9150915061337f565b600660ff16835f0160208101906130759190614179565b60ff16036130925760026130896003611e0d565b9150915061337f565b600760ff16835f0160208101906130a99190614179565b60ff16036131055760035f67ffffffffffffffff8111156130cd576130cc614aa8565b5b6040519080825280602002602001820160405280156130fb5781602001602082028036833780820191505090505b509150915061337f565b600860ff16835f01602081019061311c9190614179565b60ff16036131785760045f67ffffffffffffffff8111156131405761313f614aa8565b5b60405190808252806020026020018201604052801561316e5781602001602082028036833780820191505090505b509150915061337f565b600960ff16835f01602081019061318f9190614179565b60ff16036131eb5760055f67ffffffffffffffff8111156131b3576131b2614aa8565b5b6040519080825280602002602001820160405280156131e15781602001602082028036833780820191505090505b509150915061337f565b600a60ff16835f0160208101906132029190614179565b60ff160361325e5760065f67ffffffffffffffff81111561322657613225614aa8565b5b6040519080825280602002602001820160405280156132545781602001602082028036833780820191505090505b509150915061337f565b600b60ff16835f0160208101906132759190614179565b60ff16036132d15760075f67ffffffffffffffff81111561329957613298614aa8565b5b6040519080825280602002602001820160405280156132c75781602001602082028036833780820191505090505b509150915061337f565b600c60ff16835f0160208101906132e89190614179565b60ff16036133445760085f67ffffffffffffffff81111561330c5761330b614aa8565b5b60405190808252806020026020018201604052801561333a5781602001602082028036833780820191505090505b509150915061337f565b6040517f34460f4100000000000000000000000000000000000000000000000000000000815260040161337690614ee7565b60405180910390fd5b915091565b5f80600881111561339857613397613ec0565b5b8260088111156133ab576133aa613ec0565b5b036133c65761271060236133bf9190614e5c565b9050613501565b600160088111156133da576133d9613ec0565b5b8260088111156133ed576133ec613ec0565b5b036134085761271060026134019190614e5c565b9050613501565b6002600881111561341c5761341b613ec0565b5b82600881111561342f5761342e613ec0565b5b0361344a5761271060026134439190614e5c565b9050613501565b6003600881111561345e5761345d613ec0565b5b82600881111561347157613470613ec0565b5b101580156134a3575060088081111561348d5761348c613ec0565b5b8260088111156134a05761349f613ec0565b5b11155b156134b2576127109050613501565b8160088111156134c5576134c4613ec0565b5b6040517f6a3592470000000000000000000000000000000000000000000000000000000081526004016134f89190613db4565b60405180910390fd5b919050565b5f600160246135159190614afd565b60ff164244336003546040516020016135319493929190615327565b604051602081830303815290604052805190602001205f1c6135539190615374565b905090565b5f808303613568575f90506136aa565b69152d02c7e14af68000008311156135b5576040517f34460f410000000000000000000000000000000000000000000000000000000081526004016135ac906153ee565b60405180910390fd5b6135c08585846136b2565b156136a6575f6135cf85613384565b90505f8103613613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360a90615456565b60405180910390fd5b5f61271082866136239190614e5c565b61362d9190615002565b90505f858261363c9190614a2e565b90506a0e79c4e6a3023e8180000081111561369b57806a0e79c4e6a3023e818000006040517f21e510be000000000000000000000000000000000000000000000000000000008152600401613692929190615101565b60405180910390fd5b8093505050506136aa565b5f90505b949350505050565b5f602460ff168260ff1611156136ca575f9050613948565b5f8260ff1603613737575f60088111156136e7576136e6613ec0565b5b8360088111156136fa576136f9613ec0565b5b148015613708575060018451145b801561373057505f845f81518110613723576137226149d4565b5b602002602001015160ff16145b9050613948565b6003600881111561374b5761374a613ec0565b5b83600881111561375e5761375d613ec0565b5b036137735761376c8261394f565b9050613948565b6004600881111561378757613786613ec0565b5b83600881111561379a57613799613ec0565b5b036137bf576137a88261394f565b1580156137b857505f8260ff1614155b9050613948565b600560088111156137d3576137d2613ec0565b5b8360088111156137e6576137e5613ec0565b5b03613813575f6002836137f99190615474565b60ff1614801561380c57505f8260ff1614155b9050613948565b6006600881111561382757613826613ec0565b5b83600881111561383a57613839613ec0565b5b0361385957600160028361384e9190615474565b60ff16149050613948565b6007600881111561386d5761386c613ec0565b5b8360088111156138805761387f613ec0565b5b036138a45760018260ff161015801561389d575060128260ff1611155b9050613948565b6008808111156138b7576138b6613ec0565b5b8360088111156138ca576138c9613ec0565b5b036138ee5760138260ff16101580156138e7575060248260ff1611155b9050613948565b5f5b84518160ff161015613943578260ff16858260ff1681518110613916576139156149d4565b5b602002602001015160ff1603613930576001915050613948565b808061393b90614ad5565b9150506138f0565b505f90505b9392505050565b5f808260ff1603613962575f9050613a7c565b5f604051806102400160405280600160ff168152602001600360ff168152602001600560ff168152602001600760ff168152602001600960ff168152602001600c60ff168152602001600e60ff168152602001601060ff168152602001601260ff168152602001601360ff168152602001601560ff168152602001601760ff168152602001601960ff168152602001601b60ff168152602001601e60ff168152602001602060ff168152602001602260ff168152602001602460ff1681525090505f5b60128160ff161015613a76578360ff16828260ff1660128110613a4b57613a4a6149d4565b5b602002015160ff1603613a6357600192505050613a7c565b8080613a6e90614ad5565b915050613a25565b505f9150505b919050565b60405180606001604052805f8152602001606081526020015f60ff1681525090565b60405180608001604052805f6008811115613ac157613ac0613ec0565b5b8152602001606081526020015f81526020015f81525090565b828054828255905f5260205f20906004028101928215613b81575f5260205f209160040282015b82811115613b805782825f82015f9054906101000a900460ff16815f015f6101000a81548160ff02191690836008811115613b3f57613b3e613ec0565b5b02179055506001820181600101908054613b5a929190613c55565b506002820154816002015560038201548160030155505091600401919060040190613b01565b5b509050613b8e9190613cb1565b5090565b5080545f8255600402905f5260205f2090810190613bb09190613cb1565b50565b828054828255905f5260205f2090601f01602090048101928215613c44579160200282015f5b83821115613c1657835183826101000a81548160ff021916908360ff16021790555092602001926001016020815f01049283019260010302613bd9565b8015613c425782816101000a81549060ff02191690556001016020815f01049283019260010302613c16565b505b509050613c519190613cf7565b5090565b828054828255905f5260205f2090601f01602090048101928215613ca0575f5260205f2091601f016020900482015b82811115613c9f578254825591600101919060010190613c84565b5b509050613cad9190613cf7565b5090565b5b80821115613cf3575f8082015f6101000a81549060ff0219169055600182015f613cdc9190613d12565b600282015f9055600382015f905550600401613cb2565b5090565b5b80821115613d0e575f815f905550600101613cf8565b5090565b5080545f8255601f0160209004905f5260205f2090810190613d349190613cf7565b50565b5f60ff82169050919050565b613d4c81613d37565b82525050565b5f602082019050613d655f830184613d43565b92915050565b5f819050919050565b613d7d81613d6b565b82525050565b5f602082019050613d965f830184613d74565b92915050565b5f819050919050565b613dae81613d9c565b82525050565b5f602082019050613dc75f830184613da5565b92915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613dfe82613dd5565b9050919050565b613e0e81613df4565b8114613e18575f80fd5b50565b5f81359050613e2981613e05565b92915050565b613e3881613d9c565b8114613e42575f80fd5b50565b5f81359050613e5381613e2f565b92915050565b5f8060408385031215613e6f57613e6e613dcd565b5b5f613e7c85828601613e1b565b9250506020613e8d85828601613e45565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60098110613efe57613efd613ec0565b5b50565b5f819050613f0e82613eed565b919050565b5f613f1d82613f01565b9050919050565b613f2d81613f13565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613f6581613d37565b82525050565b5f613f768383613f5c565b60208301905092915050565b5f602082019050919050565b5f613f9882613f33565b613fa28185613f3d565b9350613fad83613f4d565b805f5b83811015613fdd578151613fc48882613f6b565b9750613fcf83613f82565b925050600181019050613fb0565b5085935050505092915050565b613ff381613d9c565b82525050565b5f608083015f83015161400e5f860182613f24565b50602083015184820360208601526140268282613f8e565b915050604083015161403b6040860182613fea565b50606083015161404e6060860182613fea565b508091505092915050565b5f6140648383613ff9565b905092915050565b5f602082019050919050565b5f61408282613e97565b61408c8185613ea1565b93508360208202850161409e85613eb1565b805f5b858110156140d957848403895281516140ba8582614059565b94506140c58361406c565b925060208a019950506001810190506140a1565b50829750879550505050505092915050565b5f8115159050919050565b6140ff816140eb565b82525050565b5f6080820190506141185f830187613da5565b818103602083015261412a8186614078565b90506141396040830185613d43565b61414660608301846140f6565b95945050505050565b61415881613d37565b8114614162575f80fd5b50565b5f813590506141738161414f565b92915050565b5f6020828403121561418e5761418d613dcd565b5b5f61419b84828501614165565b91505092915050565b5f82825260208201905092915050565b5f6141be82613f33565b6141c881856141a4565b93506141d383613f4d565b805f5b838110156142035781516141ea8882613f6b565b97506141f583613f82565b9250506001810190506141d6565b5085935050505092915050565b5f6020820190508181035f83015261422881846141b4565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015614290578082015181840152602081019050614275565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6142b582614259565b6142bf8185614263565b93506142cf818560208601614273565b6142d88161429b565b840191505092915050565b5f6142ee83836142ab565b905092915050565b5f602082019050919050565b5f61430c82614230565b614316818561423a565b9350836020820285016143288561424a565b805f5b85811015614363578484038952815161434485826142e3565b945061434f836142f6565b925060208a0199505060018101905061432b565b50829750879550505050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6143a7816140eb565b82525050565b5f6143b8838361439e565b60208301905092915050565b5f602082019050919050565b5f6143da82614375565b6143e4818561437f565b93506143ef8361438f565b805f5b8381101561441f57815161440688826143ad565b9750614411836143c4565b9250506001810190506143f2565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f6144608383613fea565b60208301905092915050565b5f602082019050919050565b5f6144828261442c565b61448c8185614436565b935061449783614446565b805f5b838110156144c75781516144ae8882614455565b97506144b98361446c565b92505060018101905061449a565b5085935050505092915050565b5f6080820190508181035f8301526144ec81876141b4565b905081810360208301526145008186614302565b9050818103604083015261451481856143d0565b905081810360608301526145288184614478565b905095945050505050565b6009811061453f575f80fd5b50565b5f8135905061455081614533565b92915050565b5f806040838503121561456c5761456b613dcd565b5b5f61457985828601614542565b925050602061458a85828601614165565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126145b5576145b4614594565b5b8235905067ffffffffffffffff8111156145d2576145d1614598565b5b6020830191508360608202830111156145ee576145ed61459c565b5b9250929050565b5f806020838503121561460b5761460a613dcd565b5b5f83013567ffffffffffffffff81111561462857614627613dd1565b5b614634858286016145a0565b92509250509250929050565b5f6020828403121561465557614654613dcd565b5b5f61466284828501613e1b565b91505092915050565b5f819050919050565b5f61468e61468961468484613dd5565b61466b565b613dd5565b9050919050565b5f61469f82614674565b9050919050565b5f6146b082614695565b9050919050565b6146c0816146a6565b82525050565b5f6020820190506146d95f8301846146b7565b92915050565b5f805f606084860312156146f6576146f5613dcd565b5b5f61470386828701613e1b565b935050602061471486828701613e45565b925050604061472586828701613e45565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f82825260208201905092915050565b5f61477282613e97565b61477c8185614758565b93508360208202850161478e85613eb1565b805f5b858110156147c957848403895281516147aa8582614059565b94506147b58361406c565b925060208a01995050600181019050614791565b50829750879550505050505092915050565b5f606083015f8301516147f05f860182613fea565b50602083015184820360208601526148088282614768565b915050604083015161481d6040860182613f5c565b508091505092915050565b5f61483383836147db565b905092915050565b5f602082019050919050565b5f6148518261472f565b61485b8185614739565b93508360208202850161486d85614749565b805f5b858110156148a857848403895281516148898582614828565b94506148948361483b565b925060208a01995050600181019050614870565b50829750879550505050505092915050565b5f6040820190508181035f8301526148d28185614847565b90506148e16020830184613da5565b9392505050565b5f82825260208201905092915050565b5f61490282614259565b61490c81856148e8565b935061491c818560208601614273565b6149258161429b565b840191505092915050565b5f6060820190508181035f83015261494881866148f8565b905061495760208301856140f6565b6149646040830184613da5565b949350505050565b7f496e76616c69642062657420696e6465780000000000000000000000000000005f82015250565b5f6149a06011836148e8565b91506149ab8261496c565b602082019050919050565b5f6020820190508181035f8301526149cd81614994565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614a3882613d9c565b9150614a4383613d9c565b9250828201905080821115614a5b57614a5a614a01565b5b92915050565b5f614a6b82613d9c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a9d57614a9c614a01565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f614adf82613d37565b915060ff8203614af257614af1614a01565b5b600182019050919050565b5f614b0782613d37565b9150614b1283613d37565b9250828201905060ff811115614b2b57614b2a614a01565b5b92915050565b5f614b3b82613d37565b9150614b4683613d37565b9250828202614b5481613d37565b9150808214614b6657614b65614a01565b5b5092915050565b7f496e76616c696420626574207479706520494420666f72206e756d62657220675f8201527f656e65726174696f6e0000000000000000000000000000000000000000000000602082015250565b5f614bc76029836148e8565b9150614bd282614b6d565b604082019050919050565b5f6020820190508181035f830152614bf481614bbb565b9050919050565b7f496e76616c696420636f6c756d6e2073746172740000000000000000000000005f82015250565b5f614c2f6014836148e8565b9150614c3a82614bfb565b602082019050919050565b5f6020820190508181035f830152614c5c81614c23565b9050919050565b7f496e76616c696420646f7a656e207374617274000000000000000000000000005f82015250565b5f614c976013836148e8565b9150614ca282614c63565b602082019050919050565b5f6020820190508181035f830152614cc481614c8b565b9050919050565b7f496e76616c696420626574207479706520666f72206e756d6265722067656e655f8201527f726174696f6e0000000000000000000000000000000000000000000000000000602082015250565b5f614d256026836148e8565b9150614d3082614ccb565b604082019050919050565b5f6020820190508181035f830152614d5281614d19565b9050919050565b7f4e6f20626574732070726f7669646564000000000000000000000000000000005f82015250565b5f614d8d6010836148e8565b9150614d9882614d59565b602082019050919050565b5f6020820190508181035f830152614dba81614d81565b9050919050565b7f546f6f206d616e792062657473000000000000000000000000000000000000005f82015250565b5f614df5600d836148e8565b9150614e0082614dc1565b602082019050919050565b5f6020820190508181035f830152614e2281614de9565b9050919050565b5f614e3382613d9c565b9150614e3e83613d9c565b9250828203905081811115614e5657614e55614a01565b5b92915050565b5f614e6682613d9c565b9150614e7183613d9c565b9250828202614e7f81613d9c565b91508282048414831517614e9657614e95614a01565b5b5092915050565b7f496e76616c6964206265742074797065204944000000000000000000000000005f82015250565b5f614ed16013836148e8565b9150614edc82614e9d565b602082019050919050565b5f6020820190508181035f830152614efe81614ec5565b9050919050565b7f496e76616c69642062657420616d6f756e7400000000000000000000000000005f82015250565b5f614f396012836148e8565b9150614f4482614f05565b602082019050919050565b5f6020820190508181035f830152614f6681614f2d565b9050919050565b7f53696e676c652062657420616d6f756e7420746f6f206c6172676500000000005f82015250565b5f614fa1601b836148e8565b9150614fac82614f6d565b602082019050919050565b5f6020820190508181035f830152614fce81614f95565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61500c82613d9c565b915061501783613d9c565b92508261502757615026614fd5565b5b828204905092915050565b7f546f74616c2062657420616d6f756e7420746f6f206c617267650000000000005f82015250565b5f615066601a836148e8565b915061507182615032565b602082019050919050565b5f6020820190508181035f8301526150938161505a565b9050919050565b6150a381613df4565b82525050565b5f6020820190506150bc5f83018461509a565b92915050565b5f815190506150d081613e2f565b92915050565b5f602082840312156150eb576150ea613dcd565b5b5f6150f8848285016150c2565b91505092915050565b5f6040820190506151145f830185613da5565b6151216020830184613da5565b9392505050565b5f60408201905061513b5f83018561509a565b615148602083018461509a565b9392505050565b5f6040820190506151625f830185613d74565b61516f602083018461509a565b9392505050565b61517f816140eb565b8114615189575f80fd5b50565b5f8151905061519a81615176565b92915050565b5f602082840312156151b5576151b4613dcd565b5b5f6151c28482850161518c565b91505092915050565b5f6040820190506151de5f83018561509a565b6151eb6020830184613da5565b9392505050565b7f5061796f7574206f766572666c6f7700000000000000000000000000000000005f82015250565b5f615226600f836148e8565b9150615231826151f2565b602082019050919050565b5f6020820190508181035f8301526152538161521a565b9050919050565b7f496e76616c6964206e756d62657220666f7220737472616967687420626574005f82015250565b5f61528e601f836148e8565b91506152998261525a565b602082019050919050565b5f6020820190508181035f8301526152bb81615282565b9050919050565b5f819050919050565b6152dc6152d782613d9c565b6152c2565b82525050565b5f8160601b9050919050565b5f6152f8826152e2565b9050919050565b5f615309826152ee565b9050919050565b61532161531c82613df4565b6152ff565b82525050565b5f61533282876152cb565b60208201915061534282866152cb565b6020820191506153528285615310565b60148201915061536282846152cb565b60208201915081905095945050505050565b5f61537e82613d9c565b915061538983613d9c565b92508261539957615398614fd5565b5b828206905092915050565b7f42657420616d6f756e742065786365656473206d6178696d756d0000000000005f82015250565b5f6153d8601a836148e8565b91506153e3826153a4565b602082019050919050565b5f6020820190508181035f830152615405816153cc565b9050919050565b7f496e76616c6964206d756c7469706c69657200000000000000000000000000005f82015250565b5f6154406012836148e8565b915061544b8261540c565b602082019050919050565b5f6020820190508181035f83015261546d81615434565b9050919050565b5f61547e82613d37565b915061548983613d37565b92508261549957615498614fd5565b5b82820690509291505056fea264697066735822122003d2503576067090bc2d25e52f640a7ddf89b993f0443fa5c4d7322b050eebf864736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000678adf7955d8f6dcaa9e2fcc1c5ba70bccc464e6
-----Decoded View---------------
Arg [0] : _gamaTokenAddress (address): 0x678adF7955d8f6dCaa9e2fcC1C5BA70bCcC464E6
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000678adf7955d8f6dcaa9e2fcc1c5ba70bccc464e6
Deployed Bytecode Sourcemap
5427:24437:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7427:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7261:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6106:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5780:63;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27186:687;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;5689:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7019:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6974:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5881:65;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27937:1924;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6333:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6256:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25603:693;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;7592:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5533:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7551:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7510;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21142:551;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7387:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7078:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7198;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5583:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7834:974;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6201:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6037:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6007:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7138:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7324:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26351:767;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;7469:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6294:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22049:1517;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;5489:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7427:35;7461:1;7427:35;:::o;7261:43::-;7303:1;7261:43;:::o;6106:62::-;6144:24;6106:62;:::o;5780:63::-;5827:16;5780:63;:::o;27186:687::-;27276:17;27304:30;27345:18;27374:10;27422:8;:16;27431:6;27422:16;;;;;;;;;;;;;;;:27;;:34;;;;27411:8;:45;27403:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;27499:14;27516:8;:16;27525:6;27516:16;;;;;;;;;;;;;;;:27;;27544:8;27516:37;;;;;;;;:::i;:::-;;;;;;;;;;;;27499:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27574:19;27613:9;27608:106;27632:3;:8;;;:15;27628:1;:19;27608:106;;;27684:3;:8;;;27693:1;27684:11;;;;;;;;:::i;:::-;;;;;;;;:18;;;27669:33;;;;;:::i;:::-;;;27649:3;;;;;:::i;:::-;;;;27608:106;;;;27756:3;:13;;;27784:3;:8;;;27807:3;:17;;;27853:1;27839:11;:15;27734:131;;;;;;;;;;27186:687;;;;;;;:::o;5689:57::-;5730:16;5689:57;:::o;7019:41::-;7059:1;7019:41;:::o;6974:38::-;7011:1;6974:38;:::o;5881:65::-;5927:19;5881:65;:::o;27937:1924::-;28012:22;7011:1;28051:25;;:9;:25;;;28047:1807;;28115:2;28103:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28093:25;;28146:7;28141:81;28164:2;28159:1;:7;;;28141:81;;28205:1;28192:7;28200:1;28192:10;;;;;;;;;;:::i;:::-;;;;;;;:14;;;;;;;;;;;28168:3;;;;;:::i;:::-;;;;28141:81;;;;28047:1807;;;7419:1;28252:20;;:9;:20;;;28248:1606;;28311:2;28299:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28289:25;;28329:27;:147;;;;;;;;28378:1;28329:147;;;;;;28381:1;28329:147;;;;;;28384:1;28329:147;;;;;;28387:1;28329:147;;;;;;28390:1;28329:147;;;;;;28393:2;28329:147;;;;;;28397:2;28329:147;;;;;;28401:2;28329:147;;;;;;28405:2;28329:147;;;;;;28427:2;28329:147;;;;;;28431:2;28329:147;;;;;;28435:2;28329:147;;;;;;28439:2;28329:147;;;;;;28443:2;28329:147;;;;;;28447:2;28329:147;;;;;;28451:2;28329:147;;;;;;28455:2;28329:147;;;;;;28459:2;28329:147;;;;;;;28496:7;28491:92;28513:2;28509:1;:6;;;28491:92;;;28554:10;28565:1;28554:13;;;;;;;;;:::i;:::-;;;;;;28541:7;28549:1;28541:10;;;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;28517:3;;;;;:::i;:::-;;;;28491:92;;;;28274:320;28248:1606;;;7461:1;28613:22;;:9;:22;;;28609:1245;;28674:2;28662:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28652:25;;28692:29;:149;;;;;;;;28743:1;28692:149;;;;;;28746:1;28692:149;;;;;;28749:1;28692:149;;;;;;28752:1;28692:149;;;;;;28755:2;28692:149;;;;;;28759:2;28692:149;;;;;;28763:2;28692:149;;;;;;28767:2;28692:149;;;;;;28771:2;28692:149;;;;;;28792:2;28692:149;;;;;;28796:2;28692:149;;;;;;28800:2;28692:149;;;;;;28804:2;28692:149;;;;;;28808:2;28692:149;;;;;;28812:2;28692:149;;;;;;28816:2;28692:149;;;;;;28820:2;28692:149;;;;;;28824:2;28692:149;;;;;;;28861:7;28856:94;28878:2;28874:1;:6;;;28856:94;;;28919:12;28932:1;28919:15;;;;;;;;;:::i;:::-;;;;;;28906:7;28914:1;28906:10;;;;;;;;;;:::i;:::-;;;;;;;:28;;;;;;;;;;;28882:3;;;;;:::i;:::-;;;;28856:94;;;;28637:324;28609:1245;;;7502:1;28980:21;;:9;:21;;;28976:878;;29040:2;29028:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29018:25;;29063:7;29058:90;29080:2;29076:1;:6;;;29058:90;;;29131:1;29126;29122;:5;;;;:::i;:::-;29121:11;;;;:::i;:::-;29108:7;29116:1;29108:10;;;;;;;;;;:::i;:::-;;;;;;;:24;;;;;;;;;;;29084:3;;;;;:::i;:::-;;;;29058:90;;;;28976:878;;;7542:2;29178:20;;:9;:20;;;29174:680;;29237:2;29225:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29215:25;;29260:7;29255:90;29277:2;29273:1;:6;;;29255:90;;;29328:1;29323;29319;:5;;;;:::i;:::-;29318:11;;;;:::i;:::-;29305:7;29313:1;29305:10;;;;;;;;;;:::i;:::-;;;;;;;:24;;;;;;;;;;;29281:3;;;;;:::i;:::-;;;;29255:90;;;;29174:680;;;7583:2;29375:20;;:9;:20;;;29371:483;;29434:2;29422:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29412:25;;29457:7;29452:84;29474:2;29470:1;:6;;;29452:84;;;29519:1;29515;:5;;;;:::i;:::-;29502:7;29510:1;29502:10;;;;;;;;;;:::i;:::-;;;;;;;:18;;;;;;;;;;;29478:3;;;;;:::i;:::-;;;;29452:84;;;;29371:483;;;7625:2;29566:21;;:9;:21;;;29562:292;;29626:2;29614:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29604:25;;29649:7;29644:85;29666:2;29662:1;:6;;;29644:85;;;29711:2;29707:1;:6;;;;:::i;:::-;29694:7;29702:1;29694:10;;;;;;;;;;:::i;:::-;;;;;;;:19;;;;;;;;;;;29670:3;;;;;:::i;:::-;;;;29644:85;;;;29562:292;;;29777:65;;;;;;;;;;:::i;:::-;;;;;;;;29562:292;29371:483;29174:680;28976:878;28609:1245;28248:1606;28047:1807;27937:1924;;;:::o;6333:33::-;;;;:::o;6256:31::-;;;;:::o;25603:693::-;25662:25;25698:21;25730:29;25770:34;25848:2;25836:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25823:28;;25883:2;25870:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25862:24;;25926:2;25915:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25897:32;;25974:2;25960:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25940:37;;25995:7;25990:299;26012:2;26008:1;:6;;;25990:299;;;26037:18;26057:19;26078:18;26100:17;26115:1;26100:14;:17::i;:::-;26036:81;;;;;;26148:1;26132:10;26143:1;26132:13;;;;;;;;;;:::i;:::-;;;;;;;:17;;;;;;;;;;;26175:4;26164:5;26170:1;26164:8;;;;;;;;;;:::i;:::-;;;;;;;:15;;;;26215:14;26194:15;26210:1;26194:18;;;;;;;;;;:::i;:::-;;;;;;;:35;;;;;;;;;;;26267:10;26244:17;26262:1;26244:20;;;;;;;;;;:::i;:::-;;;;;;;:33;;;;;26021:268;;;26016:3;;;;;:::i;:::-;;;;25990:299;;;;25603:693;;;;:::o;7592:35::-;7625:2;7592:35;:::o;5533:43::-;5571:5;5533:43;:::o;7551:34::-;7583:2;7551:34;:::o;7510:::-;7542:2;7510:34;:::o;21142:551::-;21223:14;21265;21254:25;;;;;;;;:::i;:::-;;:7;:25;;;;;;;;:::i;:::-;;;21250:436;;21313:1;21304:5;:10;;;:24;;;;21327:1;21318:5;:10;;;21304:24;:38;;;;21341:1;21332:5;:10;;;21304:38;21296:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;21389:24;21407:5;21389:17;:24::i;:::-;21382:31;;;;21250:436;21446:13;21435:24;;;;;;;;:::i;:::-;;:7;:24;;;;;;;;:::i;:::-;;;21431:255;;21493:1;21484:5;:10;;;:25;;;;21507:2;21498:5;:11;;;21484:25;:40;;;;21522:2;21513:5;:11;;;21484:40;21476:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;21570:23;21587:5;21570:16;:23::i;:::-;21563:30;;;;21431:255;21626:48;;;;;;;;;;:::i;:::-;;;;;;;;21142:551;;;;;:::o;7387:33::-;7419:1;7387:33;:::o;7078:42::-;7119:1;7078:42;:::o;7198:::-;7239:1;7198:42;:::o;5583:45::-;5626:2;5583:45;:::o;7834:974::-;2589:21;:19;:21::i;:::-;7978:1:::1;7956:11;;:18;;:23:::0;7952:76:::1;;7988:40;;;;;;;;;;:::i;:::-;;;;;;;;7952:76;5680:2;8043:11;;:18;;:38;8039:88;;;8090:37;;;;;;;;;;:::i;:::-;;;;;;;;8039:88;8186:25;8214:8;:20;8223:10;8214:20;;;;;;;;;;;;;;;8186:48;;8245:19;8275:25:::0;8431:40:::1;8459:11;;8431:27;:40::i;:::-;8396:75;;;;;;;;8528:52;8556:10;8568:11;8528:27;:52::i;:::-;8625:19;8647:44;8660:11;;8673:4;8679:11;8647:12;:44::i;:::-;8625:66;;8739:16;;:18;;;;;;;;;:::i;:::-;;;;;;8789:11;8768:17;;:32;;;;;;;:::i;:::-;;;;;;;;7909:899;;;;2633:20:::0;:18;:20::i;:::-;7834:974;;:::o;6201:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;6037:62::-;6075:24;6037:62;:::o;6007:23::-;;;;;;;;;;;;;:::o;7138:41::-;7178:1;7138:41;:::o;7324:42::-;7365:1;7324:42;:::o;26351:767::-;26492:17;26520:13;26552:20;26575:8;:16;26584:6;26575:16;;;;;;;;;;;;;;;:27;;26552:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26613:17;26633:7;:14;26613:34;;26682:9;26672:6;:19;26668:84;;26726:1;26716:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;26730:9;26708:32;;;;;;;;26668:84;26772:11;26795:5;26786:6;:14;;;;:::i;:::-;26772:28;;26821:9;26815:3;:15;26811:63;;;26853:9;26847:15;;26811:63;26894:12;26915:6;26909:3;:12;;;;:::i;:::-;26894:27;;26949:4;26939:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;26932:22;;26980:9;26975:91;26999:4;26995:1;:8;26975:91;;;27035:7;27052:1;27043:6;:10;;;;:::i;:::-;27035:19;;;;;;;;:::i;:::-;;;;;;;;27025:4;27030:1;27025:7;;;;;;;;:::i;:::-;;;;;;;:29;;;;27005:3;;;;;:::i;:::-;;;;26975:91;;;;27094:4;27100:9;27086:24;;;;;;;;26351:767;;;;;;;:::o;7469:34::-;7502:1;7469:34;:::o;6294:32::-;;;;:::o;22049:1517::-;22121:18;22150:19;22180:24;7011:1;22227:25;;:9;:25;;;22223:88;;22288:4;5571:5;22294:2;:16;;;;:::i;:::-;22268:43;;;;;;;;;;;;;;;;;;;;;;;;;;;22223:88;7059:1;22326:28;;:9;:28;;;22322:101;;22400:5;5571;22407:1;:15;;;;:::i;:::-;22370:53;;;;;;;;;;;;;;;;;;;;;;;;;;;22322:101;7119:1;22438:29;;:9;:29;;;22434:103;;22514:5;5571;22521:1;:15;;;;:::i;:::-;22482:55;;;;;;;;;;;;;;;;;;;;;;;;;;;22434:103;7178:1;22552:28;;:9;:28;;;22548:101;;22626:5;5571;22633:1;:15;;;;:::i;:::-;22595:54;;;;;;;;;;;;;;;;;;;;;;;;;;;22548:101;7239:1;22664:29;;:9;:29;;;22660:95;;22732:5;5571;22739:1;:15;;;;:::i;:::-;22708:47;;;;;;;;;;;;;;;;;;;;;;;;;;;22660:95;7303:1;22770:30;;:9;:30;;;22766:98;;22841:5;5571;22848:1;:15;;;;:::i;:::-;22816:48;;;;;;;;;;;;;;;;;;;;;;;;;;;22766:98;7365:1;22879:29;;:9;:29;;;22875:95;;22947:5;5571;22954:1;:15;;;;:::i;:::-;22923:47;;;;;;;;;;;;;;;;;;;;;;;;;;;22875:95;7419:1;22985:20;;:9;:20;;;22981:73;;23035:5;5571;23020:34;;;;;;;;;;;;;;;;;;;;;;;;;;;22981:73;7461:1;23069:22;;:9;:22;;;23065:77;;23123:5;5571;23106:36;;;;;;;;;;;;;;;;;;;;;;;;;;;23065:77;7502:1;23157:21;;:9;:21;;;23153:75;;23209:5;5571;23193:35;;;;;;;;;;;;;;;;;;;;;;;;;;;23153:75;7542:2;23243:20;;:9;:20;;;23239:73;;23293:5;5571;23278:34;;;;;;;;;;;;;;;;;;;;;;;;;;;23239:73;7583:2;23327:20;;:9;:20;;;23323:80;;23384:5;5571;23362:41;;;;;;;;;;;;;;;;;;;;;;;;;;;23323:80;7625:2;23418:21;;:9;:21;;;23414:83;;23478:5;5571;23454:43;;;;;;;;;;;;;;;;;;;;;;;;;;;23414:83;23515:43;;;;;;;;;;:::i;:::-;;;;;;;;22049:1517;;;;;;:::o;5489:37::-;5524:2;5489:37;:::o;20489:270::-;20557:14;20584:22;20621:2;20609:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20584:40;;20640:7;20635:92;20657:2;20653:1;:6;;;20635:92;;;20713:1;20709;:5;;;;:::i;:::-;20694:11;:21;;;;:::i;:::-;20681:7;20689:1;20681:10;;;;;;;;;;:::i;:::-;;;;;;;:34;;;;;;;;;;;20661:3;;;;;:::i;:::-;;;;20635:92;;;;20744:7;20737:14;;;20489:270;;;:::o;20816:261::-;20882:14;20909:22;20946:2;20934:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20909:40;;20965:7;20960:85;20982:2;20978:1;:6;;;20960:85;;;21032:1;21019:10;:14;;;;:::i;:::-;21006:7;21014:1;21006:10;;;;;;;;;;:::i;:::-;;;;;;;:27;;;;;;;;;;;20986:3;;;;;:::i;:::-;;;;20960:85;;;;21062:7;21055:14;;;20816:261;;;:::o;2669:315::-;1967:1;2798:7;;:18;2794:88;;2840:30;;;;;;;;;;;;;;2794:88;1967:1;2959:7;:17;;;;2669:315::o;8816:1086::-;8903:19;8924:25;8967:9;8962:933;8986:4;;:11;;8982:1;:15;8962:933;;;9094:1;9076:4;;9081:1;9076:7;;;;;;;:::i;:::-;;;;;;;:14;;;:19;9072:74;;9104:42;;;;;;;;;;:::i;:::-;;;;;;;;9072:74;5730:16;9165:4;;9170:1;9165:7;;;;;;;:::i;:::-;;;;;;;:14;;;:31;9161:95;;;9205:51;;;;;;;;;;:::i;:::-;;;;;;;;9161:95;9300:4;;9305:1;9300:7;;;;;;;:::i;:::-;;;;;;;:14;;;9285:29;;;;;:::i;:::-;;;9405:15;9425:27;9444:4;;9449:1;9444:7;;;;;;;:::i;:::-;;;;;;;9425:18;:27::i;:::-;9404:48;;;9467:18;9488:28;9508:7;9488:19;:28::i;:::-;9467:49;;9531:23;5571:5;9575:10;9558:4;;9563:1;9558:7;;;;;;;:::i;:::-;;;;;;;:14;;;:27;;;;:::i;:::-;9557:43;;;;:::i;:::-;9531:69;;9650:15;9629:36;;;;;:::i;:::-;;;5827:16;9790:11;:34;9786:97;;;9833:50;;;;;;;;;;:::i;:::-;;;;;;;;9786:97;9004:891;;;8999:3;;;;;:::i;:::-;;;;8962:933;;;;8816:1086;;;;;:::o;9910:697::-;10042:11;10012:9;;;;;;;;;;;:19;;;10032:6;10012:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;10008:146;;;10101:11;10114:9;;;;;;;;;;;:19;;;10134:6;10114:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10077:65;;;;;;;;;;;;:::i;:::-;;;;;;;;10008:146;10215:11;10170:9;;;;;;;;;;;:19;;;10190:6;10206:4;10170:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;10166:174;;;10272:11;10285:9;;;;;;;;;;;:19;;;10305:6;10321:4;10285:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10250:78;;;;;;;;;;;;:::i;:::-;;;;;;;;10166:174;10357:9;;;;;;;;;;;:17;;;6144:24;10396:4;10357:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10352:118;;6144:24;10426:32;;;;;;;;;;;:::i;:::-;;;;;;;;10352:118;10487:9;;;;;;;;;;;:17;;;6075:24;10526:4;10487:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10482:118;;6075:24;10556:32;;;;;;;;;;;:::i;:::-;;;;;;;;10482:118;9910:697;;:::o;10615:3117::-;10730:19;10796:9;;;;;;;;;;;:14;;;10811:10;10823:11;10796:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10792:132;;10888:10;10900:11;10877:35;;;;;;;;;;;;:::i;:::-;;;;;;;;10792:132;10998:11;10976:18;;:33;;;;;;;:::i;:::-;;;;;;;;11096:26;11125:23;:21;:23::i;:::-;11096:52;;11225:30;11275:4;;:11;;11258:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;11225:62;;11313:9;11308:774;11332:4;;:11;;11328:1;:15;11308:774;;;11427:15;11444:22;11470:27;11489:4;;11494:1;11489:7;;;;;;;:::i;:::-;;;;;;;11470:18;:27::i;:::-;11426:71;;;;11526:14;11543:155;11578:7;11604;11630:4;;11635:1;11630:7;;;;;;;:::i;:::-;;;;;;;:14;;;11663:20;11543:16;:155::i;:::-;11526:172;;11742:11;11733:6;11719:11;:20;;;;:::i;:::-;:34;11715:65;;;11755:25;;;;;;;;;;:::i;:::-;;;;;;;;11715:65;11810:6;11795:21;;;;;:::i;:::-;;;11899:171;;;;;;;;11938:7;11899:171;;;;;;;;:::i;:::-;;;;;;11973:7;11899:171;;;;12007:4;;12012:1;12007:7;;;;;;;:::i;:::-;;;;;;;:14;;;11899:171;;;;12048:6;11899:171;;;11883:10;11894:1;11883:13;;;;;;;;:::i;:::-;;;;;;;:187;;;;11350:732;;;11345:3;;;;;:::i;:::-;;;;11308:774;;;;5626:2;12138:4;:15;;:22;;;;:42;12134:1309;;12258:9;12253:135;12302:1;12277:4;:15;;:22;;;;:26;;;;:::i;:::-;12273:1;:30;12253:135;;;12350:4;:15;;12370:1;12366;:5;;;;:::i;:::-;12350:22;;;;;;;;:::i;:::-;;;;;;;;;;;;12329:4;:15;;12345:1;12329:18;;;;;;;;:::i;:::-;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12305:3;;;;;:::i;:::-;;;;12253:135;;;;12498:15;12442:4;:15;;12483:1;12458:4;:15;;:22;;;;:26;;;;:::i;:::-;12442:43;;;;;;;;:::i;:::-;;;;;;;;;;;;:53;;:71;;;;12588:20;12528:4;:15;;12569:1;12544:4;:15;;:22;;;;:26;;;;:::i;:::-;12528:43;;;;;;;;:::i;:::-;;;;;;;;;;;;:57;;;:80;;;;;;;;;;;;;;;;;;12688:4;:15;;12729:1;12704:4;:15;;:22;;;;:26;;;;:::i;:::-;12688:43;;;;;;;;:::i;:::-;;;;;;;;;;;;:48;;;12681:55;;;;:::i;:::-;12756:9;12751:151;12775:10;:17;12771:1;:21;12751:151;;;12818:4;:15;;12859:1;12834:4;:15;;:22;;;;:26;;;;:::i;:::-;12818:43;;;;;;;;:::i;:::-;;;;;;;;;;;;:48;;12872:10;12883:1;12872:13;;;;;;;;:::i;:::-;;;;;;;;12818:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;12794:3;;;;;:::i;:::-;;;;12751:151;;;;12134:1309;;;12985:4;:15;;:22;;;;;;;;;;;;;;;;;;;;;;;13022:16;13066:1;13041:4;:15;;:22;;;;:26;;;;:::i;:::-;13022:45;;13134:15;13096:4;:15;;13112:8;13096:25;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;:53;;;;13206:20;13164:4;:15;;13180:8;13164:25;;;;;;;;:::i;:::-;;;;;;;;;;;;:39;;;:62;;;;;;;;;;;;;;;;;;13304:9;13299:133;13323:10;:17;13319:1;:21;13299:133;;;13366:4;:15;;13382:8;13366:25;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;13402:10;13413:1;13402:13;;;;;;;;:::i;:::-;;;;;;;;13366:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;13342:3;;;;;:::i;:::-;;;;13299:133;;;;12919:524;12134:1309;13513:1;13499:11;:15;13495:191;;;13535:9;;;;;;;;;;;:14;;;13550:10;13562:11;13535:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13531:144;;13635:10;13647:11;13624:35;;;;;;;;;;;;:::i;:::-;;;;;;;;13531:144;13495:191;13706:18;;10615:3117;;;;;;:::o;2992:212::-;1924:1;3175:7;:21;;;;2992:212::o;23655:1893::-;23740:15;23766:22;7011:1;23811:29;;:3;:13;;;;;;;;;;:::i;:::-;:29;;;23807:1663;;5524:2;23865:24;;:3;:10;;;;;;;;;;:::i;:::-;:24;;;;23857:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23962:1;23950:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23940:24;;23992:3;:10;;;;;;;;;;:::i;:::-;23979:7;23987:1;23979:10;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;24025:16;24017:34;;;;23807:1663;7059:1;24082:32;;:3;:13;;;;;;;;;;:::i;:::-;:32;;;24078:1392;;24139:13;24154:19;24171:1;24154:16;:19::i;:::-;24131:43;;;;;;24078:1392;7119:1;24205:33;;:3;:13;;;;;;;;;;:::i;:::-;:33;;;24201:1269;;24263:13;24278:20;24295:2;24278:16;:20::i;:::-;24255:44;;;;;;24201:1269;7178:1;24330:32;;:3;:13;;;;;;;;;;:::i;:::-;:32;;;24326:1144;;24387:13;24402:20;24419:2;24402:16;:20::i;:::-;24379:44;;;;;;24326:1144;7239:1;24454:33;;:3;:13;;;;;;;;;;:::i;:::-;:33;;;24450:1020;;24512:14;24528:20;24546:1;24528:17;:20::i;:::-;24504:45;;;;;;24450:1020;7303:1;24580:34;;:3;:13;;;;;;;;;;:::i;:::-;:34;;;24576:894;;24639:14;24655:20;24673:1;24655:17;:20::i;:::-;24631:45;;;;;;24576:894;7365:1;24707:33;;:3;:13;;;;;;;;;;:::i;:::-;:33;;;24703:767;;24765:14;24781:20;24799:1;24781:17;:20::i;:::-;24757:45;;;;;;24703:767;7419:1;24833:24;;:3;:13;;;;;;;;;;:::i;:::-;:24;;;24829:641;;24882:11;24907:1;24895:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24874:36;;;;;;24829:641;7461:1;24941:26;;:3;:13;;;;;;;;;;:::i;:::-;:26;;;24937:533;;24992:13;25019:1;25007:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24984:38;;;;;;24937:533;7502:1;25053:25;;:3;:13;;;;;;;;;;:::i;:::-;:25;;;25049:421;;25103:12;25129:1;25117:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25095:37;;;;;;25049:421;7542:2;25163:24;;:3;:13;;;;;;;;;;:::i;:::-;:24;;;25159:311;;25212:11;25237:1;25225:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25204:36;;;;;;25159:311;7583:2;25271:24;;:3;:13;;;;;;;;;;:::i;:::-;:24;;;25267:203;;25320:11;25345:1;25333:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25312:36;;;;;;25267:203;7625:2;25379:25;;:3;:13;;;;;;;;;;:::i;:::-;:25;;;25375:95;;25429:12;25455:1;25443:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25421:37;;;;;;25375:95;25497:43;;;;;;;;;;:::i;:::-;;;;;;;;23655:1893;;;;:::o;16069:696::-;16138:7;16205:16;16194:27;;;;;;;;:::i;:::-;;:7;:27;;;;;;;;:::i;:::-;;;16190:56;;5571:5;16230:2;:16;;;;:::i;:::-;16223:23;;;;16190:56;16319:13;16308:24;;;;;;;;:::i;:::-;;:7;:24;;;;;;;;:::i;:::-;;;16304:52;;5571:5;16341:1;:15;;;;:::i;:::-;16334:22;;;;16304:52;16431:14;16420:25;;;;;;;;:::i;:::-;;:7;:25;;;;;;;;:::i;:::-;;;16416:53;;5571:5;16454:1;:15;;;;:::i;:::-;16447:22;;;;16416:53;16543:11;16532:22;;;;;;;;:::i;:::-;;:7;:22;;;;;;;;:::i;:::-;;;;:49;;;;;16569:12;16558:23;;;;;;;;:::i;:::-;;:7;:23;;;;;;;;:::i;:::-;;;;16532:49;16528:180;;;5571:5;16598:18;;;;16528:180;16748:7;16740:16;;;;;;;;:::i;:::-;;16725:32;;;;;;;;;;;:::i;:::-;;;;;;;;16069:696;;;;:::o;21709:278::-;21764:5;21976:1;5524:2;21963:14;;;;:::i;:::-;21795:183;;21844:15;21874:16;21905:10;21930:16;;21813:144;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21803:155;;;;;;21795:164;;:183;;;;:::i;:::-;21782:197;;21709:278;:::o;13740:907::-;13870:7;13907:1;13894:9;:14;13890:28;;13917:1;13910:8;;;;13890:28;5730:16;13933:9;:26;13929:89;;;13968:50;;;;;;;;;;:::i;:::-;;;;;;;;13929:89;14043:47;14057:7;14066;14075:14;14043:13;:47::i;:::-;14039:582;;;14107:18;14128:28;14148:7;14128:19;:28::i;:::-;14107:49;;14189:1;14175:10;:15;14171:49;;14192:28;;;;;;;;;;:::i;:::-;;;;;;;;14171:49;14249:16;5571:5;14281:10;14269:9;:22;;;;:::i;:::-;14268:38;;;;:::i;:::-;14249:57;;14321:19;14354:9;14343:8;:20;;;;:::i;:::-;14321:42;;5927:19;14435:11;:33;14431:132;;;14514:11;5927:19;14496:51;;;;;;;;;;;;:::i;:::-;;;;;;;;14431:132;14598:11;14591:18;;;;;;;14039:582;14638:1;14631:8;;13740:907;;;;;;;:::o;14655:1000::-;14763:4;5524:2;14784:27;;:14;:27;;;14780:45;;;14820:5;14813:12;;;;14780:45;14868:1;14850:14;:19;;;14846:130;;14905:16;14894:27;;;;;;;;:::i;:::-;;:7;:27;;;;;;;;:::i;:::-;;;:50;;;;;14943:1;14925:7;:14;:19;14894:50;:69;;;;;14962:1;14948:7;14956:1;14948:10;;;;;;;;:::i;:::-;;;;;;;;:15;;;14894:69;14886:78;;;;14846:130;15011:11;15000:22;;;;;;;;:::i;:::-;;:7;:22;;;;;;;;:::i;:::-;;;14996:57;;15031:22;15038:14;15031:6;:22::i;:::-;15024:29;;;;14996:57;15079:13;15068:24;;;;;;;;:::i;:::-;;:7;:24;;;;;;;;:::i;:::-;;;15064:83;;15102:22;15109:14;15102:6;:22::i;:::-;15101:23;:46;;;;;15146:1;15128:14;:19;;;;15101:46;15094:53;;;;15064:83;15173:12;15162:23;;;;;;;;:::i;:::-;;:7;:23;;;;;;;;:::i;:::-;;;15158:82;;15216:1;15211;15194:14;:18;;;;:::i;:::-;:23;;;:46;;;;;15239:1;15221:14;:19;;;;15194:46;15187:53;;;;15158:82;15266:11;15255:22;;;;;;;;:::i;:::-;;:7;:22;;;;;;;;:::i;:::-;;;15251:58;;15308:1;15303;15286:14;:18;;;;:::i;:::-;:23;;;15279:30;;;;15251:58;15335:11;15324:22;;;;;;;;:::i;:::-;;:7;:22;;;;;;;;:::i;:::-;;;15320:78;;15373:1;15355:14;:19;;;;:43;;;;;15396:2;15378:14;:20;;;;15355:43;15348:50;;;;15320:78;15424:12;15413:23;;;;;;;;:::i;:::-;;:7;:23;;;;;;;;:::i;:::-;;;15409:80;;15463:2;15445:14;:20;;;;:44;;;;;15487:2;15469:14;:20;;;;15445:44;15438:51;;;;15409:80;15515:7;15510:115;15532:7;:14;15528:1;:18;;;15510:115;;;15586:14;15572:28;;:7;15580:1;15572:10;;;;;;;;;;:::i;:::-;;;;;;;;:28;;;15568:45;;15609:4;15602:11;;;;;15568:45;15548:3;;;;;:::i;:::-;;;;15510:115;;;;15642:5;15635:12;;14655:1000;;;;;;:::o;15663:398::-;15715:4;15746:1;15736:6;:11;;;15732:29;;15756:5;15749:12;;;;15732:29;15772:27;:135;;;;;;;;15817:1;15772:135;;;;;;15820:1;15772:135;;;;;;15823:1;15772:135;;;;;;15826:1;15772:135;;;;;;15829:1;15772:135;;;;;;15832:2;15772:135;;;;;;15836:2;15772:135;;;;;;15840:2;15772:135;;;;;;15844:2;15772:135;;;;;;15862:2;15772:135;;;;;;15866:2;15772:135;;;;;;15870:2;15772:135;;;;;;15874:2;15772:135;;;;;;15878:2;15772:135;;;;;;15882:2;15772:135;;;;;;15886:2;15772:135;;;;;;15890:2;15772:135;;;;;;15894:2;15772:135;;;;;;;15923:7;15918:113;15940:17;15936:1;:21;;;15918:113;;;16000:6;15983:23;;:10;15994:1;15983:13;;;;;;;;;:::i;:::-;;;;;;:23;;;15979:40;;16015:4;16008:11;;;;;;15979:40;15959:3;;;;;:::i;:::-;;;;15918:113;;;;16048:5;16041:12;;;15663:398;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;7:86:1:-;42:7;82:4;75:5;71:16;60:27;;7:86;;;:::o;99:112::-;182:22;198:5;182:22;:::i;:::-;177:3;170:35;99:112;;:::o;217:214::-;306:4;344:2;333:9;329:18;321:26;;357:67;421:1;410:9;406:17;397:6;357:67;:::i;:::-;217:214;;;;:::o;437:77::-;474:7;503:5;492:16;;437:77;;;:::o;520:118::-;607:24;625:5;607:24;:::i;:::-;602:3;595:37;520:118;;:::o;644:222::-;737:4;775:2;764:9;760:18;752:26;;788:71;856:1;845:9;841:17;832:6;788:71;:::i;:::-;644:222;;;;:::o;872:77::-;909:7;938:5;927:16;;872:77;;;:::o;955:118::-;1042:24;1060:5;1042:24;:::i;:::-;1037:3;1030:37;955:118;;:::o;1079:222::-;1172:4;1210:2;1199:9;1195:18;1187:26;;1223:71;1291:1;1280:9;1276:17;1267:6;1223:71;:::i;:::-;1079:222;;;;:::o;1388:117::-;1497:1;1494;1487:12;1511:117;1620:1;1617;1610:12;1634:126;1671:7;1711:42;1704:5;1700:54;1689:65;;1634:126;;;:::o;1766:96::-;1803:7;1832:24;1850:5;1832:24;:::i;:::-;1821:35;;1766:96;;;:::o;1868:122::-;1941:24;1959:5;1941:24;:::i;:::-;1934:5;1931:35;1921:63;;1980:1;1977;1970:12;1921:63;1868:122;:::o;1996:139::-;2042:5;2080:6;2067:20;2058:29;;2096:33;2123:5;2096:33;:::i;:::-;1996:139;;;;:::o;2141:122::-;2214:24;2232:5;2214:24;:::i;:::-;2207:5;2204:35;2194:63;;2253:1;2250;2243:12;2194:63;2141:122;:::o;2269:139::-;2315:5;2353:6;2340:20;2331:29;;2369:33;2396:5;2369:33;:::i;:::-;2269:139;;;;:::o;2414:474::-;2482:6;2490;2539:2;2527:9;2518:7;2514:23;2510:32;2507:119;;;2545:79;;:::i;:::-;2507:119;2665:1;2690:53;2735:7;2726:6;2715:9;2711:22;2690:53;:::i;:::-;2680:63;;2636:117;2792:2;2818:53;2863:7;2854:6;2843:9;2839:22;2818:53;:::i;:::-;2808:63;;2763:118;2414:474;;;;;:::o;2894:141::-;2988:6;3022:5;3016:12;3006:22;;2894:141;;;:::o;3041:211::-;3167:11;3201:6;3196:3;3189:19;3241:4;3236:3;3232:14;3217:29;;3041:211;;;;:::o;3258:159::-;3352:4;3375:3;3367:11;;3405:4;3400:3;3396:14;3388:22;;3258:159;;;:::o;3423:180::-;3471:77;3468:1;3461:88;3568:4;3565:1;3558:15;3592:4;3589:1;3582:15;3609:116;3693:1;3686:5;3683:12;3673:46;;3699:18;;:::i;:::-;3673:46;3609:116;:::o;3731:133::-;3779:7;3808:5;3797:16;;3814:44;3852:5;3814:44;:::i;:::-;3731:133;;;:::o;3870:::-;3929:9;3962:35;3991:5;3962:35;:::i;:::-;3949:48;;3870:133;;;:::o;4009:139::-;4095:46;4135:5;4095:46;:::i;:::-;4090:3;4083:59;4009:139;;:::o;4154:112::-;4219:6;4253:5;4247:12;4237:22;;4154:112;;;:::o;4272:172::-;4359:11;4393:6;4388:3;4381:19;4433:4;4428:3;4424:14;4409:29;;4272:172;;;;:::o;4450:130::-;4515:4;4538:3;4530:11;;4568:4;4563:3;4559:14;4551:22;;4450:130;;;:::o;4586:102::-;4659:22;4675:5;4659:22;:::i;:::-;4654:3;4647:35;4586:102;;:::o;4694:171::-;4759:10;4780:42;4818:3;4810:6;4780:42;:::i;:::-;4854:4;4849:3;4845:14;4831:28;;4694:171;;;;:::o;4871:111::-;4939:4;4971;4966:3;4962:14;4954:22;;4871:111;;;:::o;5014:696::-;5119:3;5148:52;5194:5;5148:52;:::i;:::-;5216:74;5283:6;5278:3;5216:74;:::i;:::-;5209:81;;5314:54;5362:5;5314:54;:::i;:::-;5391:7;5422:1;5407:278;5432:6;5429:1;5426:13;5407:278;;;5508:6;5502:13;5535:59;5590:3;5575:13;5535:59;:::i;:::-;5528:66;;5617:58;5668:6;5617:58;:::i;:::-;5607:68;;5467:218;5454:1;5451;5447:9;5442:14;;5407:278;;;5411:14;5701:3;5694:10;;5124:586;;;5014:696;;;;:::o;5716:108::-;5793:24;5811:5;5793:24;:::i;:::-;5788:3;5781:37;5716:108;;:::o;5876:993::-;5989:3;6025:4;6020:3;6016:14;6115:4;6108:5;6104:16;6098:23;6134:72;6200:4;6195:3;6191:14;6177:12;6134:72;:::i;:::-;6040:176;6301:4;6294:5;6290:16;6284:23;6354:3;6348:4;6344:14;6337:4;6332:3;6328:14;6321:38;6380:99;6474:4;6460:12;6380:99;:::i;:::-;6372:107;;6226:264;6574:4;6567:5;6563:16;6557:23;6593:63;6650:4;6645:3;6641:14;6627:12;6593:63;:::i;:::-;6500:166;6750:4;6743:5;6739:16;6733:23;6769:63;6826:4;6821:3;6817:14;6803:12;6769:63;:::i;:::-;6676:166;6859:4;6852:11;;5994:875;5876:993;;;;:::o;6875:264::-;6998:10;7033:100;7129:3;7121:6;7033:100;:::i;:::-;7019:114;;6875:264;;;;:::o;7145:140::-;7242:4;7274;7269:3;7265:14;7257:22;;7145:140;;;:::o;7341:1127::-;7514:3;7543:81;7618:5;7543:81;:::i;:::-;7640:113;7746:6;7741:3;7640:113;:::i;:::-;7633:120;;7779:3;7824:4;7816:6;7812:17;7807:3;7803:27;7854:83;7931:5;7854:83;:::i;:::-;7960:7;7991:1;7976:447;8001:6;7998:1;7995:13;7976:447;;;8072:9;8066:4;8062:20;8057:3;8050:33;8123:6;8117:13;8151:118;8264:4;8249:13;8151:118;:::i;:::-;8143:126;;8292:87;8372:6;8292:87;:::i;:::-;8282:97;;8408:4;8403:3;8399:14;8392:21;;8036:387;8023:1;8020;8016:9;8011:14;;7976:447;;;7980:14;8439:4;8432:11;;8459:3;8452:10;;7519:949;;;;;7341:1127;;;;:::o;8474:90::-;8508:7;8551:5;8544:13;8537:21;8526:32;;8474:90;;;:::o;8570:109::-;8651:21;8666:5;8651:21;:::i;:::-;8646:3;8639:34;8570:109;;:::o;8685:792::-;8956:4;8994:3;8983:9;8979:19;8971:27;;9008:71;9076:1;9065:9;9061:17;9052:6;9008:71;:::i;:::-;9126:9;9120:4;9116:20;9111:2;9100:9;9096:18;9089:48;9154:162;9311:4;9302:6;9154:162;:::i;:::-;9146:170;;9326:68;9390:2;9379:9;9375:18;9366:6;9326:68;:::i;:::-;9404:66;9466:2;9455:9;9451:18;9442:6;9404:66;:::i;:::-;8685:792;;;;;;;:::o;9483:118::-;9554:22;9570:5;9554:22;:::i;:::-;9547:5;9544:33;9534:61;;9591:1;9588;9581:12;9534:61;9483:118;:::o;9607:135::-;9651:5;9689:6;9676:20;9667:29;;9705:31;9730:5;9705:31;:::i;:::-;9607:135;;;;:::o;9748:325::-;9805:6;9854:2;9842:9;9833:7;9829:23;9825:32;9822:119;;;9860:79;;:::i;:::-;9822:119;9980:1;10005:51;10048:7;10039:6;10028:9;10024:22;10005:51;:::i;:::-;9995:61;;9951:115;9748:325;;;;:::o;10079:182::-;10176:11;10210:6;10205:3;10198:19;10250:4;10245:3;10241:14;10226:29;;10079:182;;;;:::o;10293:716::-;10408:3;10437:52;10483:5;10437:52;:::i;:::-;10505:84;10582:6;10577:3;10505:84;:::i;:::-;10498:91;;10613:54;10661:5;10613:54;:::i;:::-;10690:7;10721:1;10706:278;10731:6;10728:1;10725:13;10706:278;;;10807:6;10801:13;10834:59;10889:3;10874:13;10834:59;:::i;:::-;10827:66;;10916:58;10967:6;10916:58;:::i;:::-;10906:68;;10766:218;10753:1;10750;10746:9;10741:14;;10706:278;;;10710:14;11000:3;10993:10;;10413:596;;;10293:716;;;;:::o;11015:365::-;11154:4;11192:2;11181:9;11177:18;11169:26;;11241:9;11235:4;11231:20;11227:1;11216:9;11212:17;11205:47;11269:104;11368:4;11359:6;11269:104;:::i;:::-;11261:112;;11015:365;;;;:::o;11386:124::-;11463:6;11497:5;11491:12;11481:22;;11386:124;;;:::o;11516:194::-;11625:11;11659:6;11654:3;11647:19;11699:4;11694:3;11690:14;11675:29;;11516:194;;;;:::o;11716:142::-;11793:4;11816:3;11808:11;;11846:4;11841:3;11837:14;11829:22;;11716:142;;;:::o;11864:99::-;11916:6;11950:5;11944:12;11934:22;;11864:99;;;:::o;11969:159::-;12043:11;12077:6;12072:3;12065:19;12117:4;12112:3;12108:14;12093:29;;11969:159;;;;:::o;12134:246::-;12215:1;12225:113;12239:6;12236:1;12233:13;12225:113;;;12324:1;12319:3;12315:11;12309:18;12305:1;12300:3;12296:11;12289:39;12261:2;12258:1;12254:10;12249:15;;12225:113;;;12372:1;12363:6;12358:3;12354:16;12347:27;12196:184;12134:246;;;:::o;12386:102::-;12427:6;12478:2;12474:7;12469:2;12462:5;12458:14;12454:28;12444:38;;12386:102;;;:::o;12494:357::-;12572:3;12600:39;12633:5;12600:39;:::i;:::-;12655:61;12709:6;12704:3;12655:61;:::i;:::-;12648:68;;12725:65;12783:6;12778:3;12771:4;12764:5;12760:16;12725:65;:::i;:::-;12815:29;12837:6;12815:29;:::i;:::-;12810:3;12806:39;12799:46;;12576:275;12494:357;;;;:::o;12857:196::-;12946:10;12981:66;13043:3;13035:6;12981:66;:::i;:::-;12967:80;;12857:196;;;;:::o;13059:123::-;13139:4;13171;13166:3;13162:14;13154:22;;13059:123;;;:::o;13216:991::-;13355:3;13384:64;13442:5;13384:64;:::i;:::-;13464:96;13553:6;13548:3;13464:96;:::i;:::-;13457:103;;13586:3;13631:4;13623:6;13619:17;13614:3;13610:27;13661:66;13721:5;13661:66;:::i;:::-;13750:7;13781:1;13766:396;13791:6;13788:1;13785:13;13766:396;;;13862:9;13856:4;13852:20;13847:3;13840:33;13913:6;13907:13;13941:84;14020:4;14005:13;13941:84;:::i;:::-;13933:92;;14048:70;14111:6;14048:70;:::i;:::-;14038:80;;14147:4;14142:3;14138:14;14131:21;;13826:336;13813:1;13810;13806:9;13801:14;;13766:396;;;13770:14;14178:4;14171:11;;14198:3;14191:10;;13360:847;;;;;13216:991;;;;:::o;14213:111::-;14277:6;14311:5;14305:12;14295:22;;14213:111;;;:::o;14330:181::-;14426:11;14460:6;14455:3;14448:19;14500:4;14495:3;14491:14;14476:29;;14330:181;;;;:::o;14517:129::-;14581:4;14604:3;14596:11;;14634:4;14629:3;14625:14;14617:22;;14517:129;;;:::o;14652:99::-;14723:21;14738:5;14723:21;:::i;:::-;14718:3;14711:34;14652:99;;:::o;14757:167::-;14820:10;14841:40;14877:3;14869:6;14841:40;:::i;:::-;14913:4;14908:3;14904:14;14890:28;;14757:167;;;;:::o;14930:110::-;14997:4;15029;15024:3;15020:14;15012:22;;14930:110;;;:::o;15070:708::-;15183:3;15212:51;15257:5;15212:51;:::i;:::-;15279:83;15355:6;15350:3;15279:83;:::i;:::-;15272:90;;15386:53;15433:5;15386:53;:::i;:::-;15462:7;15493:1;15478:275;15503:6;15500:1;15497:13;15478:275;;;15579:6;15573:13;15606:57;15659:3;15644:13;15606:57;:::i;:::-;15599:64;;15686:57;15736:6;15686:57;:::i;:::-;15676:67;;15538:215;15525:1;15522;15518:9;15513:14;;15478:275;;;15482:14;15769:3;15762:10;;15188:590;;;15070:708;;;;:::o;15784:114::-;15851:6;15885:5;15879:12;15869:22;;15784:114;;;:::o;15904:184::-;16003:11;16037:6;16032:3;16025:19;16077:4;16072:3;16068:14;16053:29;;15904:184;;;;:::o;16094:132::-;16161:4;16184:3;16176:11;;16214:4;16209:3;16205:14;16197:22;;16094:132;;;:::o;16232:179::-;16301:10;16322:46;16364:3;16356:6;16322:46;:::i;:::-;16400:4;16395:3;16391:14;16377:28;;16232:179;;;;:::o;16417:113::-;16487:4;16519;16514:3;16510:14;16502:22;;16417:113;;;:::o;16566:732::-;16685:3;16714:54;16762:5;16714:54;:::i;:::-;16784:86;16863:6;16858:3;16784:86;:::i;:::-;16777:93;;16894:56;16944:5;16894:56;:::i;:::-;16973:7;17004:1;16989:284;17014:6;17011:1;17008:13;16989:284;;;17090:6;17084:13;17117:63;17176:3;17161:13;17117:63;:::i;:::-;17110:70;;17203:60;17256:6;17203:60;:::i;:::-;17193:70;;17049:224;17036:1;17033;17029:9;17024:14;;16989:284;;;16993:14;17289:3;17282:10;;16690:608;;;16566:732;;;;:::o;17304:1177::-;17691:4;17729:3;17718:9;17714:19;17706:27;;17779:9;17773:4;17769:20;17765:1;17754:9;17750:17;17743:47;17807:104;17906:4;17897:6;17807:104;:::i;:::-;17799:112;;17958:9;17952:4;17948:20;17943:2;17932:9;17928:18;17921:48;17986:128;18109:4;18100:6;17986:128;:::i;:::-;17978:136;;18161:9;18155:4;18151:20;18146:2;18135:9;18131:18;18124:48;18189:102;18286:4;18277:6;18189:102;:::i;:::-;18181:110;;18338:9;18332:4;18328:20;18323:2;18312:9;18308:18;18301:48;18366:108;18469:4;18460:6;18366:108;:::i;:::-;18358:116;;17304:1177;;;;;;;:::o;18487:110::-;18571:1;18564:5;18561:12;18551:40;;18587:1;18584;18577:12;18551:40;18487:110;:::o;18603:161::-;18660:5;18698:6;18685:20;18676:29;;18714:44;18752:5;18714:44;:::i;:::-;18603:161;;;;:::o;18770:492::-;18847:6;18855;18904:2;18892:9;18883:7;18879:23;18875:32;18872:119;;;18910:79;;:::i;:::-;18872:119;19030:1;19055:64;19111:7;19102:6;19091:9;19087:22;19055:64;:::i;:::-;19045:74;;19001:128;19168:2;19194:51;19237:7;19228:6;19217:9;19213:22;19194:51;:::i;:::-;19184:61;;19139:116;18770:492;;;;;:::o;19268:117::-;19377:1;19374;19367:12;19391:117;19500:1;19497;19490:12;19514:117;19623:1;19620;19613:12;19664:597;19766:8;19776:6;19826:3;19819:4;19811:6;19807:17;19803:27;19793:122;;19834:79;;:::i;:::-;19793:122;19947:6;19934:20;19924:30;;19977:18;19969:6;19966:30;19963:117;;;19999:79;;:::i;:::-;19963:117;20113:4;20105:6;20101:17;20089:29;;20167:3;20159:4;20151:6;20147:17;20137:8;20133:32;20130:41;20127:128;;;20174:79;;:::i;:::-;20127:128;19664:597;;;;;:::o;20267:617::-;20382:6;20390;20439:2;20427:9;20418:7;20414:23;20410:32;20407:119;;;20445:79;;:::i;:::-;20407:119;20593:1;20582:9;20578:17;20565:31;20623:18;20615:6;20612:30;20609:117;;;20645:79;;:::i;:::-;20609:117;20758:109;20859:7;20850:6;20839:9;20835:22;20758:109;:::i;:::-;20740:127;;;;20536:341;20267:617;;;;;:::o;20890:329::-;20949:6;20998:2;20986:9;20977:7;20973:23;20969:32;20966:119;;;21004:79;;:::i;:::-;20966:119;21124:1;21149:53;21194:7;21185:6;21174:9;21170:22;21149:53;:::i;:::-;21139:63;;21095:117;20890:329;;;;:::o;21225:60::-;21253:3;21274:5;21267:12;;21225:60;;;:::o;21291:142::-;21341:9;21374:53;21392:34;21401:24;21419:5;21401:24;:::i;:::-;21392:34;:::i;:::-;21374:53;:::i;:::-;21361:66;;21291:142;;;:::o;21439:126::-;21489:9;21522:37;21553:5;21522:37;:::i;:::-;21509:50;;21439:126;;;:::o;21571:140::-;21635:9;21668:37;21699:5;21668:37;:::i;:::-;21655:50;;21571:140;;;:::o;21717:159::-;21818:51;21863:5;21818:51;:::i;:::-;21813:3;21806:64;21717:159;;:::o;21882:250::-;21989:4;22027:2;22016:9;22012:18;22004:26;;22040:85;22122:1;22111:9;22107:17;22098:6;22040:85;:::i;:::-;21882:250;;;;:::o;22138:619::-;22215:6;22223;22231;22280:2;22268:9;22259:7;22255:23;22251:32;22248:119;;;22286:79;;:::i;:::-;22248:119;22406:1;22431:53;22476:7;22467:6;22456:9;22452:22;22431:53;:::i;:::-;22421:63;;22377:117;22533:2;22559:53;22604:7;22595:6;22584:9;22580:22;22559:53;:::i;:::-;22549:63;;22504:118;22661:2;22687:53;22732:7;22723:6;22712:9;22708:22;22687:53;:::i;:::-;22677:63;;22632:118;22138:619;;;;;:::o;22763:134::-;22850:6;22884:5;22878:12;22868:22;;22763:134;;;:::o;22903:204::-;23022:11;23056:6;23051:3;23044:19;23096:4;23091:3;23087:14;23072:29;;22903:204;;;;:::o;23113:152::-;23200:4;23223:3;23215:11;;23253:4;23248:3;23244:14;23236:22;;23113:152;;;:::o;23271:201::-;23387:11;23421:6;23416:3;23409:19;23461:4;23456:3;23452:14;23437:29;;23271:201;;;;:::o;23528:1107::-;23691:3;23720:81;23795:5;23720:81;:::i;:::-;23817:103;23913:6;23908:3;23817:103;:::i;:::-;23810:110;;23946:3;23991:4;23983:6;23979:17;23974:3;23970:27;24021:83;24098:5;24021:83;:::i;:::-;24127:7;24158:1;24143:447;24168:6;24165:1;24162:13;24143:447;;;24239:9;24233:4;24229:20;24224:3;24217:33;24290:6;24284:13;24318:118;24431:4;24416:13;24318:118;:::i;:::-;24310:126;;24459:87;24539:6;24459:87;:::i;:::-;24449:97;;24575:4;24570:3;24566:14;24559:21;;24203:387;24190:1;24187;24183:9;24178:14;;24143:447;;;24147:14;24606:4;24599:11;;24626:3;24619:10;;23696:939;;;;;23528:1107;;;;:::o;24673:854::-;24772:3;24808:4;24803:3;24799:14;24900:4;24893:5;24889:16;24883:23;24919:63;24976:4;24971:3;24967:14;24953:12;24919:63;:::i;:::-;24823:169;25074:4;25067:5;25063:16;25057:23;25127:3;25121:4;25117:14;25110:4;25105:3;25101:14;25094:38;25153:157;25305:4;25291:12;25153:157;:::i;:::-;25145:165;;25002:319;25412:4;25405:5;25401:16;25395:23;25431:59;25484:4;25479:3;25475:14;25461:12;25431:59;:::i;:::-;25331:169;25517:4;25510:11;;24777:750;24673:854;;;;:::o;25533:236::-;25642:10;25677:86;25759:3;25751:6;25677:86;:::i;:::-;25663:100;;25533:236;;;;:::o;25775:133::-;25865:4;25897;25892:3;25888:14;25880:22;;25775:133;;;:::o;25950:1071::-;26109:3;26138:74;26206:5;26138:74;:::i;:::-;26228:106;26327:6;26322:3;26228:106;:::i;:::-;26221:113;;26360:3;26405:4;26397:6;26393:17;26388:3;26384:27;26435:76;26505:5;26435:76;:::i;:::-;26534:7;26565:1;26550:426;26575:6;26572:1;26569:13;26550:426;;;26646:9;26640:4;26636:20;26631:3;26624:33;26697:6;26691:13;26725:104;26824:4;26809:13;26725:104;:::i;:::-;26717:112;;26852:80;26925:6;26852:80;:::i;:::-;26842:90;;26961:4;26956:3;26952:14;26945:21;;26610:366;26597:1;26594;26590:9;26585:14;;26550:426;;;26554:14;26992:4;26985:11;;27012:3;27005:10;;26114:907;;;;;25950:1071;;;;:::o;27027:563::-;27238:4;27276:2;27265:9;27261:18;27253:26;;27325:9;27319:4;27315:20;27311:1;27300:9;27296:17;27289:47;27353:148;27496:4;27487:6;27353:148;:::i;:::-;27345:156;;27511:72;27579:2;27568:9;27564:18;27555:6;27511:72;:::i;:::-;27027:563;;;;;:::o;27596:169::-;27680:11;27714:6;27709:3;27702:19;27754:4;27749:3;27745:14;27730:29;;27596:169;;;;:::o;27771:377::-;27859:3;27887:39;27920:5;27887:39;:::i;:::-;27942:71;28006:6;28001:3;27942:71;:::i;:::-;27935:78;;28022:65;28080:6;28075:3;28068:4;28061:5;28057:16;28022:65;:::i;:::-;28112:29;28134:6;28112:29;:::i;:::-;28107:3;28103:39;28096:46;;27863:285;27771:377;;;;:::o;28154:521::-;28317:4;28355:2;28344:9;28340:18;28332:26;;28404:9;28398:4;28394:20;28390:1;28379:9;28375:17;28368:47;28432:78;28505:4;28496:6;28432:78;:::i;:::-;28424:86;;28520:66;28582:2;28571:9;28567:18;28558:6;28520:66;:::i;:::-;28596:72;28664:2;28653:9;28649:18;28640:6;28596:72;:::i;:::-;28154:521;;;;;;:::o;28681:167::-;28821:19;28817:1;28809:6;28805:14;28798:43;28681:167;:::o;28854:366::-;28996:3;29017:67;29081:2;29076:3;29017:67;:::i;:::-;29010:74;;29093:93;29182:3;29093:93;:::i;:::-;29211:2;29206:3;29202:12;29195:19;;28854:366;;;:::o;29226:419::-;29392:4;29430:2;29419:9;29415:18;29407:26;;29479:9;29473:4;29469:20;29465:1;29454:9;29450:17;29443:47;29507:131;29633:4;29507:131;:::i;:::-;29499:139;;29226:419;;;:::o;29651:180::-;29699:77;29696:1;29689:88;29796:4;29793:1;29786:15;29820:4;29817:1;29810:15;29837:180;29885:77;29882:1;29875:88;29982:4;29979:1;29972:15;30006:4;30003:1;29996:15;30023:191;30063:3;30082:20;30100:1;30082:20;:::i;:::-;30077:25;;30116:20;30134:1;30116:20;:::i;:::-;30111:25;;30159:1;30156;30152:9;30145:16;;30180:3;30177:1;30174:10;30171:36;;;30187:18;;:::i;:::-;30171:36;30023:191;;;;:::o;30220:233::-;30259:3;30282:24;30300:5;30282:24;:::i;:::-;30273:33;;30328:66;30321:5;30318:77;30315:103;;30398:18;;:::i;:::-;30315:103;30445:1;30438:5;30434:13;30427:20;;30220:233;;;:::o;30459:180::-;30507:77;30504:1;30497:88;30604:4;30601:1;30594:15;30628:4;30625:1;30618:15;30645:167;30682:3;30705:22;30721:5;30705:22;:::i;:::-;30696:31;;30749:4;30742:5;30739:15;30736:41;;30757:18;;:::i;:::-;30736:41;30804:1;30797:5;30793:13;30786:20;;30645:167;;;:::o;30818:188::-;30856:3;30875:18;30891:1;30875:18;:::i;:::-;30870:23;;30907:18;30923:1;30907:18;:::i;:::-;30902:23;;30948:1;30945;30941:9;30934:16;;30971:4;30966:3;30963:13;30960:39;;;30979:18;;:::i;:::-;30960:39;30818:188;;;;:::o;31012:271::-;31050:7;31073:18;31089:1;31073:18;:::i;:::-;31068:23;;31105:18;31121:1;31105:18;:::i;:::-;31100:23;;31158:1;31155;31151:9;31180:28;31196:11;31180:28;:::i;:::-;31169:39;;31240:11;31231:7;31228:24;31218:58;;31256:18;;:::i;:::-;31218:58;31058:225;31012:271;;;;:::o;31289:228::-;31429:34;31425:1;31417:6;31413:14;31406:58;31498:11;31493:2;31485:6;31481:15;31474:36;31289:228;:::o;31523:366::-;31665:3;31686:67;31750:2;31745:3;31686:67;:::i;:::-;31679:74;;31762:93;31851:3;31762:93;:::i;:::-;31880:2;31875:3;31871:12;31864:19;;31523:366;;;:::o;31895:419::-;32061:4;32099:2;32088:9;32084:18;32076:26;;32148:9;32142:4;32138:20;32134:1;32123:9;32119:17;32112:47;32176:131;32302:4;32176:131;:::i;:::-;32168:139;;31895:419;;;:::o;32320:170::-;32460:22;32456:1;32448:6;32444:14;32437:46;32320:170;:::o;32496:366::-;32638:3;32659:67;32723:2;32718:3;32659:67;:::i;:::-;32652:74;;32735:93;32824:3;32735:93;:::i;:::-;32853:2;32848:3;32844:12;32837:19;;32496:366;;;:::o;32868:419::-;33034:4;33072:2;33061:9;33057:18;33049:26;;33121:9;33115:4;33111:20;33107:1;33096:9;33092:17;33085:47;33149:131;33275:4;33149:131;:::i;:::-;33141:139;;32868:419;;;:::o;33293:169::-;33433:21;33429:1;33421:6;33417:14;33410:45;33293:169;:::o;33468:366::-;33610:3;33631:67;33695:2;33690:3;33631:67;:::i;:::-;33624:74;;33707:93;33796:3;33707:93;:::i;:::-;33825:2;33820:3;33816:12;33809:19;;33468:366;;;:::o;33840:419::-;34006:4;34044:2;34033:9;34029:18;34021:26;;34093:9;34087:4;34083:20;34079:1;34068:9;34064:17;34057:47;34121:131;34247:4;34121:131;:::i;:::-;34113:139;;33840:419;;;:::o;34265:225::-;34405:34;34401:1;34393:6;34389:14;34382:58;34474:8;34469:2;34461:6;34457:15;34450:33;34265:225;:::o;34496:366::-;34638:3;34659:67;34723:2;34718:3;34659:67;:::i;:::-;34652:74;;34735:93;34824:3;34735:93;:::i;:::-;34853:2;34848:3;34844:12;34837:19;;34496:366;;;:::o;34868:419::-;35034:4;35072:2;35061:9;35057:18;35049:26;;35121:9;35115:4;35111:20;35107:1;35096:9;35092:17;35085:47;35149:131;35275:4;35149:131;:::i;:::-;35141:139;;34868:419;;;:::o;35293:166::-;35433:18;35429:1;35421:6;35417:14;35410:42;35293:166;:::o;35465:366::-;35607:3;35628:67;35692:2;35687:3;35628:67;:::i;:::-;35621:74;;35704:93;35793:3;35704:93;:::i;:::-;35822:2;35817:3;35813:12;35806:19;;35465:366;;;:::o;35837:419::-;36003:4;36041:2;36030:9;36026:18;36018:26;;36090:9;36084:4;36080:20;36076:1;36065:9;36061:17;36054:47;36118:131;36244:4;36118:131;:::i;:::-;36110:139;;35837:419;;;:::o;36262:163::-;36402:15;36398:1;36390:6;36386:14;36379:39;36262:163;:::o;36431:366::-;36573:3;36594:67;36658:2;36653:3;36594:67;:::i;:::-;36587:74;;36670:93;36759:3;36670:93;:::i;:::-;36788:2;36783:3;36779:12;36772:19;;36431:366;;;:::o;36803:419::-;36969:4;37007:2;36996:9;36992:18;36984:26;;37056:9;37050:4;37046:20;37042:1;37031:9;37027:17;37020:47;37084:131;37210:4;37084:131;:::i;:::-;37076:139;;36803:419;;;:::o;37228:194::-;37268:4;37288:20;37306:1;37288:20;:::i;:::-;37283:25;;37322:20;37340:1;37322:20;:::i;:::-;37317:25;;37366:1;37363;37359:9;37351:17;;37390:1;37384:4;37381:11;37378:37;;;37395:18;;:::i;:::-;37378:37;37228:194;;;;:::o;37428:410::-;37468:7;37491:20;37509:1;37491:20;:::i;:::-;37486:25;;37525:20;37543:1;37525:20;:::i;:::-;37520:25;;37580:1;37577;37573:9;37602:30;37620:11;37602:30;:::i;:::-;37591:41;;37781:1;37772:7;37768:15;37765:1;37762:22;37742:1;37735:9;37715:83;37692:139;;37811:18;;:::i;:::-;37692:139;37476:362;37428:410;;;;:::o;37844:169::-;37984:21;37980:1;37972:6;37968:14;37961:45;37844:169;:::o;38019:366::-;38161:3;38182:67;38246:2;38241:3;38182:67;:::i;:::-;38175:74;;38258:93;38347:3;38258:93;:::i;:::-;38376:2;38371:3;38367:12;38360:19;;38019:366;;;:::o;38391:419::-;38557:4;38595:2;38584:9;38580:18;38572:26;;38644:9;38638:4;38634:20;38630:1;38619:9;38615:17;38608:47;38672:131;38798:4;38672:131;:::i;:::-;38664:139;;38391:419;;;:::o;38816:168::-;38956:20;38952:1;38944:6;38940:14;38933:44;38816:168;:::o;38990:366::-;39132:3;39153:67;39217:2;39212:3;39153:67;:::i;:::-;39146:74;;39229:93;39318:3;39229:93;:::i;:::-;39347:2;39342:3;39338:12;39331:19;;38990:366;;;:::o;39362:419::-;39528:4;39566:2;39555:9;39551:18;39543:26;;39615:9;39609:4;39605:20;39601:1;39590:9;39586:17;39579:47;39643:131;39769:4;39643:131;:::i;:::-;39635:139;;39362:419;;;:::o;39787:177::-;39927:29;39923:1;39915:6;39911:14;39904:53;39787:177;:::o;39970:366::-;40112:3;40133:67;40197:2;40192:3;40133:67;:::i;:::-;40126:74;;40209:93;40298:3;40209:93;:::i;:::-;40327:2;40322:3;40318:12;40311:19;;39970:366;;;:::o;40342:419::-;40508:4;40546:2;40535:9;40531:18;40523:26;;40595:9;40589:4;40585:20;40581:1;40570:9;40566:17;40559:47;40623:131;40749:4;40623:131;:::i;:::-;40615:139;;40342:419;;;:::o;40767:180::-;40815:77;40812:1;40805:88;40912:4;40909:1;40902:15;40936:4;40933:1;40926:15;40953:185;40993:1;41010:20;41028:1;41010:20;:::i;:::-;41005:25;;41044:20;41062:1;41044:20;:::i;:::-;41039:25;;41083:1;41073:35;;41088:18;;:::i;:::-;41073:35;41130:1;41127;41123:9;41118:14;;40953:185;;;;:::o;41144:176::-;41284:28;41280:1;41272:6;41268:14;41261:52;41144:176;:::o;41326:366::-;41468:3;41489:67;41553:2;41548:3;41489:67;:::i;:::-;41482:74;;41565:93;41654:3;41565:93;:::i;:::-;41683:2;41678:3;41674:12;41667:19;;41326:366;;;:::o;41698:419::-;41864:4;41902:2;41891:9;41887:18;41879:26;;41951:9;41945:4;41941:20;41937:1;41926:9;41922:17;41915:47;41979:131;42105:4;41979:131;:::i;:::-;41971:139;;41698:419;;;:::o;42123:118::-;42210:24;42228:5;42210:24;:::i;:::-;42205:3;42198:37;42123:118;;:::o;42247:222::-;42340:4;42378:2;42367:9;42363:18;42355:26;;42391:71;42459:1;42448:9;42444:17;42435:6;42391:71;:::i;:::-;42247:222;;;;:::o;42475:143::-;42532:5;42563:6;42557:13;42548:22;;42579:33;42606:5;42579:33;:::i;:::-;42475:143;;;;:::o;42624:351::-;42694:6;42743:2;42731:9;42722:7;42718:23;42714:32;42711:119;;;42749:79;;:::i;:::-;42711:119;42869:1;42894:64;42950:7;42941:6;42930:9;42926:22;42894:64;:::i;:::-;42884:74;;42840:128;42624:351;;;;:::o;42981:332::-;43102:4;43140:2;43129:9;43125:18;43117:26;;43153:71;43221:1;43210:9;43206:17;43197:6;43153:71;:::i;:::-;43234:72;43302:2;43291:9;43287:18;43278:6;43234:72;:::i;:::-;42981:332;;;;;:::o;43319:::-;43440:4;43478:2;43467:9;43463:18;43455:26;;43491:71;43559:1;43548:9;43544:17;43535:6;43491:71;:::i;:::-;43572:72;43640:2;43629:9;43625:18;43616:6;43572:72;:::i;:::-;43319:332;;;;;:::o;43657:::-;43778:4;43816:2;43805:9;43801:18;43793:26;;43829:71;43897:1;43886:9;43882:17;43873:6;43829:71;:::i;:::-;43910:72;43978:2;43967:9;43963:18;43954:6;43910:72;:::i;:::-;43657:332;;;;;:::o;43995:116::-;44065:21;44080:5;44065:21;:::i;:::-;44058:5;44055:32;44045:60;;44101:1;44098;44091:12;44045:60;43995:116;:::o;44117:137::-;44171:5;44202:6;44196:13;44187:22;;44218:30;44242:5;44218:30;:::i;:::-;44117:137;;;;:::o;44260:345::-;44327:6;44376:2;44364:9;44355:7;44351:23;44347:32;44344:119;;;44382:79;;:::i;:::-;44344:119;44502:1;44527:61;44580:7;44571:6;44560:9;44556:22;44527:61;:::i;:::-;44517:71;;44473:125;44260:345;;;;:::o;44611:332::-;44732:4;44770:2;44759:9;44755:18;44747:26;;44783:71;44851:1;44840:9;44836:17;44827:6;44783:71;:::i;:::-;44864:72;44932:2;44921:9;44917:18;44908:6;44864:72;:::i;:::-;44611:332;;;;;:::o;44949:165::-;45089:17;45085:1;45077:6;45073:14;45066:41;44949:165;:::o;45120:366::-;45262:3;45283:67;45347:2;45342:3;45283:67;:::i;:::-;45276:74;;45359:93;45448:3;45359:93;:::i;:::-;45477:2;45472:3;45468:12;45461:19;;45120:366;;;:::o;45492:419::-;45658:4;45696:2;45685:9;45681:18;45673:26;;45745:9;45739:4;45735:20;45731:1;45720:9;45716:17;45709:47;45773:131;45899:4;45773:131;:::i;:::-;45765:139;;45492:419;;;:::o;45917:181::-;46057:33;46053:1;46045:6;46041:14;46034:57;45917:181;:::o;46104:366::-;46246:3;46267:67;46331:2;46326:3;46267:67;:::i;:::-;46260:74;;46343:93;46432:3;46343:93;:::i;:::-;46461:2;46456:3;46452:12;46445:19;;46104:366;;;:::o;46476:419::-;46642:4;46680:2;46669:9;46665:18;46657:26;;46729:9;46723:4;46719:20;46715:1;46704:9;46700:17;46693:47;46757:131;46883:4;46757:131;:::i;:::-;46749:139;;46476:419;;;:::o;46901:79::-;46940:7;46969:5;46958:16;;46901:79;;;:::o;46986:157::-;47091:45;47111:24;47129:5;47111:24;:::i;:::-;47091:45;:::i;:::-;47086:3;47079:58;46986:157;;:::o;47149:94::-;47182:8;47230:5;47226:2;47222:14;47201:35;;47149:94;;;:::o;47249:::-;47288:7;47317:20;47331:5;47317:20;:::i;:::-;47306:31;;47249:94;;;:::o;47349:100::-;47388:7;47417:26;47437:5;47417:26;:::i;:::-;47406:37;;47349:100;;;:::o;47455:157::-;47560:45;47580:24;47598:5;47580:24;:::i;:::-;47560:45;:::i;:::-;47555:3;47548:58;47455:157;;:::o;47618:679::-;47814:3;47829:75;47900:3;47891:6;47829:75;:::i;:::-;47929:2;47924:3;47920:12;47913:19;;47942:75;48013:3;48004:6;47942:75;:::i;:::-;48042:2;48037:3;48033:12;48026:19;;48055:75;48126:3;48117:6;48055:75;:::i;:::-;48155:2;48150:3;48146:12;48139:19;;48168:75;48239:3;48230:6;48168:75;:::i;:::-;48268:2;48263:3;48259:12;48252:19;;48288:3;48281:10;;47618:679;;;;;;;:::o;48303:176::-;48335:1;48352:20;48370:1;48352:20;:::i;:::-;48347:25;;48386:20;48404:1;48386:20;:::i;:::-;48381:25;;48425:1;48415:35;;48430:18;;:::i;:::-;48415:35;48471:1;48468;48464:9;48459:14;;48303:176;;;;:::o;48485:::-;48625:28;48621:1;48613:6;48609:14;48602:52;48485:176;:::o;48667:366::-;48809:3;48830:67;48894:2;48889:3;48830:67;:::i;:::-;48823:74;;48906:93;48995:3;48906:93;:::i;:::-;49024:2;49019:3;49015:12;49008:19;;48667:366;;;:::o;49039:419::-;49205:4;49243:2;49232:9;49228:18;49220:26;;49292:9;49286:4;49282:20;49278:1;49267:9;49263:17;49256:47;49320:131;49446:4;49320:131;:::i;:::-;49312:139;;49039:419;;;:::o;49464:168::-;49604:20;49600:1;49592:6;49588:14;49581:44;49464:168;:::o;49638:366::-;49780:3;49801:67;49865:2;49860:3;49801:67;:::i;:::-;49794:74;;49877:93;49966:3;49877:93;:::i;:::-;49995:2;49990:3;49986:12;49979:19;;49638:366;;;:::o;50010:419::-;50176:4;50214:2;50203:9;50199:18;50191:26;;50263:9;50257:4;50253:20;50249:1;50238:9;50234:17;50227:47;50291:131;50417:4;50291:131;:::i;:::-;50283:139;;50010:419;;;:::o;50435:170::-;50465:1;50482:18;50498:1;50482:18;:::i;:::-;50477:23;;50514:18;50530:1;50514:18;:::i;:::-;50509:23;;50551:1;50541:35;;50556:18;;:::i;:::-;50541:35;50597:1;50594;50590:9;50585:14;;50435:170;;;;:::o
Swarm Source
ipfs://03d2503576067090bc2d25e52f640a7ddf89b993f0443fa5c4d7322b050eebf8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
[ 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.