Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,792 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Post Prices | 12506542 | 1173 days ago | IN | 0 ETH | 0.0117038 | ||||
Post Prices | 12506522 | 1173 days ago | IN | 0 ETH | 0.01216692 | ||||
Post Prices | 11657365 | 1304 days ago | IN | 0 ETH | 0.015326 | ||||
Post Prices | 11651338 | 1305 days ago | IN | 0 ETH | 0.01696006 | ||||
Post Prices | 11638802 | 1307 days ago | IN | 0 ETH | 0.02019295 | ||||
Post Prices | 11630195 | 1308 days ago | IN | 0 ETH | 0.01935468 | ||||
Post Prices | 11338810 | 1353 days ago | IN | 0 ETH | 0.00910997 | ||||
Post Prices | 11235838 | 1369 days ago | IN | 0 ETH | 0.00586155 | ||||
Post Prices | 11203070 | 1374 days ago | IN | 0 ETH | 0.01260576 | ||||
Post Prices | 11170806 | 1379 days ago | IN | 0 ETH | 0.00644682 | ||||
Post Prices | 11170776 | 1379 days ago | IN | 0 ETH | 0.00951687 | ||||
Post Prices | 11170616 | 1379 days ago | IN | 0 ETH | 0.012 | ||||
Post Prices | 11170595 | 1379 days ago | IN | 0 ETH | 0.00419695 | ||||
Post Prices | 11031363 | 1400 days ago | IN | 0 ETH | 0.00379509 | ||||
Post Prices | 11031222 | 1400 days ago | IN | 0 ETH | 0.03213793 | ||||
Post Prices | 11015603 | 1402 days ago | IN | 0 ETH | 0.01587408 | ||||
Post Prices | 11015171 | 1402 days ago | IN | 0 ETH | 0.00738504 | ||||
Post Prices | 11014406 | 1403 days ago | IN | 0 ETH | 0.00541569 | ||||
Post Prices | 11013644 | 1403 days ago | IN | 0 ETH | 0.00895143 | ||||
Post Prices | 11012079 | 1403 days ago | IN | 0 ETH | 0.00378809 | ||||
Post Prices | 11011681 | 1403 days ago | IN | 0 ETH | 0.03375529 | ||||
Post Prices | 11010199 | 1403 days ago | IN | 0 ETH | 0.00721374 | ||||
Post Prices | 11009668 | 1403 days ago | IN | 0 ETH | 0.01083139 | ||||
Post Prices | 11008612 | 1404 days ago | IN | 0 ETH | 0.00492336 | ||||
Post Prices | 11007784 | 1404 days ago | IN | 0 ETH | 0.0056612 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
UniswapAnchoredView
Compiler Version
v0.6.10+commit.00c0fcaf
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-08-03 */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.6.10; pragma experimental ABIEncoderV2; /** * @title The Open Oracle Data Base Contract * @author Compound Labs, Inc. */ contract OpenOracleData { /** * @notice The event emitted when a source writes to its storage */ //event Write(address indexed source, <Key> indexed key, string kind, uint64 timestamp, <Value> value); /** * @notice Write a bunch of signed datum to the authenticated storage mapping * @param message The payload containing the timestamp, and (key, value) pairs * @param signature The cryptographic signature of the message payload, authorizing the source to write * @return The keys that were written */ //function put(bytes calldata message, bytes calldata signature) external returns (<Key> memory); /** * @notice Read a single key with a pre-defined type signature from an authenticated source * @param source The verifiable author of the data * @param key The selector for the value to return * @return The claimed Unix timestamp for the data and the encoded value (defaults to (0, 0x)) */ //function get(address source, <Key> key) external view returns (uint, <Value>); /** * @notice Recovers the source address which signed a message * @dev Comparing to a claimed address would add nothing, * as the caller could simply perform the recover and claim that address. * @param message The data that was presumably signed * @param signature The fingerprint of the data + private key * @return The source address which signed the message, presumably */ function source(bytes memory message, bytes memory signature) public pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = abi.decode(signature, (bytes32, bytes32, uint8)); bytes32 hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(message))); return ecrecover(hash, v, r, s); } } /** * @title The Open Oracle Price Data Contract * @notice Values stored in this contract should represent a USD price with 6 decimals precision * @author Compound Labs, Inc. */ contract OpenOraclePriceData is OpenOracleData { ///@notice The event emitted when a source writes to its storage event Write(address indexed source, string key, uint64 timestamp, uint64 value); ///@notice The event emitted when the timestamp on a price is invalid and it is not written to storage event NotWritten(uint64 priorTimestamp, uint256 messageTimestamp, uint256 blockTimestamp); ///@notice The fundamental unit of storage for a reporter source struct Datum { uint64 timestamp; uint64 value; } /** * @dev The most recent authenticated data from all sources. * This is private because dynamic mapping keys preclude auto-generated getters. */ mapping(address => mapping(string => Datum)) private data; /** * @notice Write a bunch of signed datum to the authenticated storage mapping * @param message The payload containing the timestamp, and (key, value) pairs * @param signature The cryptographic signature of the message payload, authorizing the source to write * @return The keys that were written */ function put(bytes calldata message, bytes calldata signature) external returns (string memory) { (address source, uint64 timestamp, string memory key, uint64 value) = decodeMessage(message, signature); return putInternal(source, timestamp, key, value); } function putInternal(address source, uint64 timestamp, string memory key, uint64 value) internal returns (string memory) { // Only update if newer than stored, according to source Datum storage prior = data[source][key]; if (timestamp > prior.timestamp && timestamp < block.timestamp + 60 minutes && source != address(0)) { data[source][key] = Datum(timestamp, value); emit Write(source, key, timestamp, value); } else { emit NotWritten(prior.timestamp, timestamp, block.timestamp); } return key; } function decodeMessage(bytes calldata message, bytes calldata signature) internal pure returns (address, uint64, string memory, uint64) { // Recover the source address address source = source(message, signature); // Decode the message and check the kind (string memory kind, uint64 timestamp, string memory key, uint64 value) = abi.decode(message, (string, uint64, string, uint64)); require(keccak256(abi.encodePacked(kind)) == keccak256(abi.encodePacked("prices")), "Kind of data must be 'prices'"); return (source, timestamp, key, value); } /** * @notice Read a single key from an authenticated source * @param source The verifiable author of the data * @param key The selector for the value to return * @return The claimed Unix timestamp for the data and the price value (defaults to (0, 0)) */ function get(address source, string calldata key) external view returns (uint64, uint64) { Datum storage datum = data[source][key]; return (datum.timestamp, datum.value); } /** * @notice Read only the value for a single key from an authenticated source * @param source The verifiable author of the data * @param key The selector for the value to return * @return The price value (defaults to 0) */ function getPrice(address source, string calldata key) external view returns (uint64) { return data[source][key].value; } } interface CErc20 { function underlying() external view returns (address); } contract UniswapConfig { /// @dev Describe how to interpret the fixedPrice in the TokenConfig. enum PriceSource { FIXED_ETH, /// implies the fixedPrice is a constant multiple of the ETH price (which varies) FIXED_USD, /// implies the fixedPrice is a constant multiple of the USD price (which is 1) REPORTER /// implies the price is set by the reporter } /// @dev Describe how the USD price should be determined for an asset. /// There should be 1 TokenConfig object for each supported asset, passed in the constructor. struct TokenConfig { address cToken; address underlying; bytes32 symbolHash; uint256 baseUnit; PriceSource priceSource; uint256 fixedPrice; address uniswapMarket; bool isUniswapReversed; } /// @notice The max number of tokens this contract is hardcoded to support /// @dev Do not change this variable without updating all the fields throughout the contract. uint public constant maxTokens = 30; /// @notice The number of tokens this contract actually supports uint public immutable numTokens; address internal immutable cToken00; address internal immutable cToken01; address internal immutable cToken02; address internal immutable cToken03; address internal immutable cToken04; address internal immutable cToken05; address internal immutable cToken06; address internal immutable cToken07; address internal immutable cToken08; address internal immutable cToken09; address internal immutable cToken10; address internal immutable cToken11; address internal immutable cToken12; address internal immutable cToken13; address internal immutable cToken14; address internal immutable cToken15; address internal immutable cToken16; address internal immutable cToken17; address internal immutable cToken18; address internal immutable cToken19; address internal immutable cToken20; address internal immutable cToken21; address internal immutable cToken22; address internal immutable cToken23; address internal immutable cToken24; address internal immutable cToken25; address internal immutable cToken26; address internal immutable cToken27; address internal immutable cToken28; address internal immutable cToken29; address internal immutable underlying00; address internal immutable underlying01; address internal immutable underlying02; address internal immutable underlying03; address internal immutable underlying04; address internal immutable underlying05; address internal immutable underlying06; address internal immutable underlying07; address internal immutable underlying08; address internal immutable underlying09; address internal immutable underlying10; address internal immutable underlying11; address internal immutable underlying12; address internal immutable underlying13; address internal immutable underlying14; address internal immutable underlying15; address internal immutable underlying16; address internal immutable underlying17; address internal immutable underlying18; address internal immutable underlying19; address internal immutable underlying20; address internal immutable underlying21; address internal immutable underlying22; address internal immutable underlying23; address internal immutable underlying24; address internal immutable underlying25; address internal immutable underlying26; address internal immutable underlying27; address internal immutable underlying28; address internal immutable underlying29; bytes32 internal immutable symbolHash00; bytes32 internal immutable symbolHash01; bytes32 internal immutable symbolHash02; bytes32 internal immutable symbolHash03; bytes32 internal immutable symbolHash04; bytes32 internal immutable symbolHash05; bytes32 internal immutable symbolHash06; bytes32 internal immutable symbolHash07; bytes32 internal immutable symbolHash08; bytes32 internal immutable symbolHash09; bytes32 internal immutable symbolHash10; bytes32 internal immutable symbolHash11; bytes32 internal immutable symbolHash12; bytes32 internal immutable symbolHash13; bytes32 internal immutable symbolHash14; bytes32 internal immutable symbolHash15; bytes32 internal immutable symbolHash16; bytes32 internal immutable symbolHash17; bytes32 internal immutable symbolHash18; bytes32 internal immutable symbolHash19; bytes32 internal immutable symbolHash20; bytes32 internal immutable symbolHash21; bytes32 internal immutable symbolHash22; bytes32 internal immutable symbolHash23; bytes32 internal immutable symbolHash24; bytes32 internal immutable symbolHash25; bytes32 internal immutable symbolHash26; bytes32 internal immutable symbolHash27; bytes32 internal immutable symbolHash28; bytes32 internal immutable symbolHash29; uint256 internal immutable baseUnit00; uint256 internal immutable baseUnit01; uint256 internal immutable baseUnit02; uint256 internal immutable baseUnit03; uint256 internal immutable baseUnit04; uint256 internal immutable baseUnit05; uint256 internal immutable baseUnit06; uint256 internal immutable baseUnit07; uint256 internal immutable baseUnit08; uint256 internal immutable baseUnit09; uint256 internal immutable baseUnit10; uint256 internal immutable baseUnit11; uint256 internal immutable baseUnit12; uint256 internal immutable baseUnit13; uint256 internal immutable baseUnit14; uint256 internal immutable baseUnit15; uint256 internal immutable baseUnit16; uint256 internal immutable baseUnit17; uint256 internal immutable baseUnit18; uint256 internal immutable baseUnit19; uint256 internal immutable baseUnit20; uint256 internal immutable baseUnit21; uint256 internal immutable baseUnit22; uint256 internal immutable baseUnit23; uint256 internal immutable baseUnit24; uint256 internal immutable baseUnit25; uint256 internal immutable baseUnit26; uint256 internal immutable baseUnit27; uint256 internal immutable baseUnit28; uint256 internal immutable baseUnit29; PriceSource internal immutable priceSource00; PriceSource internal immutable priceSource01; PriceSource internal immutable priceSource02; PriceSource internal immutable priceSource03; PriceSource internal immutable priceSource04; PriceSource internal immutable priceSource05; PriceSource internal immutable priceSource06; PriceSource internal immutable priceSource07; PriceSource internal immutable priceSource08; PriceSource internal immutable priceSource09; PriceSource internal immutable priceSource10; PriceSource internal immutable priceSource11; PriceSource internal immutable priceSource12; PriceSource internal immutable priceSource13; PriceSource internal immutable priceSource14; PriceSource internal immutable priceSource15; PriceSource internal immutable priceSource16; PriceSource internal immutable priceSource17; PriceSource internal immutable priceSource18; PriceSource internal immutable priceSource19; PriceSource internal immutable priceSource20; PriceSource internal immutable priceSource21; PriceSource internal immutable priceSource22; PriceSource internal immutable priceSource23; PriceSource internal immutable priceSource24; PriceSource internal immutable priceSource25; PriceSource internal immutable priceSource26; PriceSource internal immutable priceSource27; PriceSource internal immutable priceSource28; PriceSource internal immutable priceSource29; uint256 internal immutable fixedPrice00; uint256 internal immutable fixedPrice01; uint256 internal immutable fixedPrice02; uint256 internal immutable fixedPrice03; uint256 internal immutable fixedPrice04; uint256 internal immutable fixedPrice05; uint256 internal immutable fixedPrice06; uint256 internal immutable fixedPrice07; uint256 internal immutable fixedPrice08; uint256 internal immutable fixedPrice09; uint256 internal immutable fixedPrice10; uint256 internal immutable fixedPrice11; uint256 internal immutable fixedPrice12; uint256 internal immutable fixedPrice13; uint256 internal immutable fixedPrice14; uint256 internal immutable fixedPrice15; uint256 internal immutable fixedPrice16; uint256 internal immutable fixedPrice17; uint256 internal immutable fixedPrice18; uint256 internal immutable fixedPrice19; uint256 internal immutable fixedPrice20; uint256 internal immutable fixedPrice21; uint256 internal immutable fixedPrice22; uint256 internal immutable fixedPrice23; uint256 internal immutable fixedPrice24; uint256 internal immutable fixedPrice25; uint256 internal immutable fixedPrice26; uint256 internal immutable fixedPrice27; uint256 internal immutable fixedPrice28; uint256 internal immutable fixedPrice29; address internal immutable uniswapMarket00; address internal immutable uniswapMarket01; address internal immutable uniswapMarket02; address internal immutable uniswapMarket03; address internal immutable uniswapMarket04; address internal immutable uniswapMarket05; address internal immutable uniswapMarket06; address internal immutable uniswapMarket07; address internal immutable uniswapMarket08; address internal immutable uniswapMarket09; address internal immutable uniswapMarket10; address internal immutable uniswapMarket11; address internal immutable uniswapMarket12; address internal immutable uniswapMarket13; address internal immutable uniswapMarket14; address internal immutable uniswapMarket15; address internal immutable uniswapMarket16; address internal immutable uniswapMarket17; address internal immutable uniswapMarket18; address internal immutable uniswapMarket19; address internal immutable uniswapMarket20; address internal immutable uniswapMarket21; address internal immutable uniswapMarket22; address internal immutable uniswapMarket23; address internal immutable uniswapMarket24; address internal immutable uniswapMarket25; address internal immutable uniswapMarket26; address internal immutable uniswapMarket27; address internal immutable uniswapMarket28; address internal immutable uniswapMarket29; bool internal immutable isUniswapReversed00; bool internal immutable isUniswapReversed01; bool internal immutable isUniswapReversed02; bool internal immutable isUniswapReversed03; bool internal immutable isUniswapReversed04; bool internal immutable isUniswapReversed05; bool internal immutable isUniswapReversed06; bool internal immutable isUniswapReversed07; bool internal immutable isUniswapReversed08; bool internal immutable isUniswapReversed09; bool internal immutable isUniswapReversed10; bool internal immutable isUniswapReversed11; bool internal immutable isUniswapReversed12; bool internal immutable isUniswapReversed13; bool internal immutable isUniswapReversed14; bool internal immutable isUniswapReversed15; bool internal immutable isUniswapReversed16; bool internal immutable isUniswapReversed17; bool internal immutable isUniswapReversed18; bool internal immutable isUniswapReversed19; bool internal immutable isUniswapReversed20; bool internal immutable isUniswapReversed21; bool internal immutable isUniswapReversed22; bool internal immutable isUniswapReversed23; bool internal immutable isUniswapReversed24; bool internal immutable isUniswapReversed25; bool internal immutable isUniswapReversed26; bool internal immutable isUniswapReversed27; bool internal immutable isUniswapReversed28; bool internal immutable isUniswapReversed29; /** * @notice Construct an immutable store of configs into the contract data * @param configs The configs for the supported assets */ constructor(TokenConfig[] memory configs) public { require(configs.length <= maxTokens, "too many configs"); numTokens = configs.length; cToken00 = get(configs, 0).cToken; cToken01 = get(configs, 1).cToken; cToken02 = get(configs, 2).cToken; cToken03 = get(configs, 3).cToken; cToken04 = get(configs, 4).cToken; cToken05 = get(configs, 5).cToken; cToken06 = get(configs, 6).cToken; cToken07 = get(configs, 7).cToken; cToken08 = get(configs, 8).cToken; cToken09 = get(configs, 9).cToken; cToken10 = get(configs, 10).cToken; cToken11 = get(configs, 11).cToken; cToken12 = get(configs, 12).cToken; cToken13 = get(configs, 13).cToken; cToken14 = get(configs, 14).cToken; cToken15 = get(configs, 15).cToken; cToken16 = get(configs, 16).cToken; cToken17 = get(configs, 17).cToken; cToken18 = get(configs, 18).cToken; cToken19 = get(configs, 19).cToken; cToken20 = get(configs, 20).cToken; cToken21 = get(configs, 21).cToken; cToken22 = get(configs, 22).cToken; cToken23 = get(configs, 23).cToken; cToken24 = get(configs, 24).cToken; cToken25 = get(configs, 25).cToken; cToken26 = get(configs, 26).cToken; cToken27 = get(configs, 27).cToken; cToken28 = get(configs, 28).cToken; cToken29 = get(configs, 29).cToken; underlying00 = get(configs, 0).underlying; underlying01 = get(configs, 1).underlying; underlying02 = get(configs, 2).underlying; underlying03 = get(configs, 3).underlying; underlying04 = get(configs, 4).underlying; underlying05 = get(configs, 5).underlying; underlying06 = get(configs, 6).underlying; underlying07 = get(configs, 7).underlying; underlying08 = get(configs, 8).underlying; underlying09 = get(configs, 9).underlying; underlying10 = get(configs, 10).underlying; underlying11 = get(configs, 11).underlying; underlying12 = get(configs, 12).underlying; underlying13 = get(configs, 13).underlying; underlying14 = get(configs, 14).underlying; underlying15 = get(configs, 15).underlying; underlying16 = get(configs, 16).underlying; underlying17 = get(configs, 17).underlying; underlying18 = get(configs, 18).underlying; underlying19 = get(configs, 19).underlying; underlying20 = get(configs, 20).underlying; underlying21 = get(configs, 21).underlying; underlying22 = get(configs, 22).underlying; underlying23 = get(configs, 23).underlying; underlying24 = get(configs, 24).underlying; underlying25 = get(configs, 25).underlying; underlying26 = get(configs, 26).underlying; underlying27 = get(configs, 27).underlying; underlying28 = get(configs, 28).underlying; underlying29 = get(configs, 29).underlying; symbolHash00 = get(configs, 0).symbolHash; symbolHash01 = get(configs, 1).symbolHash; symbolHash02 = get(configs, 2).symbolHash; symbolHash03 = get(configs, 3).symbolHash; symbolHash04 = get(configs, 4).symbolHash; symbolHash05 = get(configs, 5).symbolHash; symbolHash06 = get(configs, 6).symbolHash; symbolHash07 = get(configs, 7).symbolHash; symbolHash08 = get(configs, 8).symbolHash; symbolHash09 = get(configs, 9).symbolHash; symbolHash10 = get(configs, 10).symbolHash; symbolHash11 = get(configs, 11).symbolHash; symbolHash12 = get(configs, 12).symbolHash; symbolHash13 = get(configs, 13).symbolHash; symbolHash14 = get(configs, 14).symbolHash; symbolHash15 = get(configs, 15).symbolHash; symbolHash16 = get(configs, 16).symbolHash; symbolHash17 = get(configs, 17).symbolHash; symbolHash18 = get(configs, 18).symbolHash; symbolHash19 = get(configs, 19).symbolHash; symbolHash20 = get(configs, 20).symbolHash; symbolHash21 = get(configs, 21).symbolHash; symbolHash22 = get(configs, 22).symbolHash; symbolHash23 = get(configs, 23).symbolHash; symbolHash24 = get(configs, 24).symbolHash; symbolHash25 = get(configs, 25).symbolHash; symbolHash26 = get(configs, 26).symbolHash; symbolHash27 = get(configs, 27).symbolHash; symbolHash28 = get(configs, 28).symbolHash; symbolHash29 = get(configs, 29).symbolHash; baseUnit00 = get(configs, 0).baseUnit; baseUnit01 = get(configs, 1).baseUnit; baseUnit02 = get(configs, 2).baseUnit; baseUnit03 = get(configs, 3).baseUnit; baseUnit04 = get(configs, 4).baseUnit; baseUnit05 = get(configs, 5).baseUnit; baseUnit06 = get(configs, 6).baseUnit; baseUnit07 = get(configs, 7).baseUnit; baseUnit08 = get(configs, 8).baseUnit; baseUnit09 = get(configs, 9).baseUnit; baseUnit10 = get(configs, 10).baseUnit; baseUnit11 = get(configs, 11).baseUnit; baseUnit12 = get(configs, 12).baseUnit; baseUnit13 = get(configs, 13).baseUnit; baseUnit14 = get(configs, 14).baseUnit; baseUnit15 = get(configs, 15).baseUnit; baseUnit16 = get(configs, 16).baseUnit; baseUnit17 = get(configs, 17).baseUnit; baseUnit18 = get(configs, 18).baseUnit; baseUnit19 = get(configs, 19).baseUnit; baseUnit20 = get(configs, 20).baseUnit; baseUnit21 = get(configs, 21).baseUnit; baseUnit22 = get(configs, 22).baseUnit; baseUnit23 = get(configs, 23).baseUnit; baseUnit24 = get(configs, 24).baseUnit; baseUnit25 = get(configs, 25).baseUnit; baseUnit26 = get(configs, 26).baseUnit; baseUnit27 = get(configs, 27).baseUnit; baseUnit28 = get(configs, 28).baseUnit; baseUnit29 = get(configs, 29).baseUnit; priceSource00 = get(configs, 0).priceSource; priceSource01 = get(configs, 1).priceSource; priceSource02 = get(configs, 2).priceSource; priceSource03 = get(configs, 3).priceSource; priceSource04 = get(configs, 4).priceSource; priceSource05 = get(configs, 5).priceSource; priceSource06 = get(configs, 6).priceSource; priceSource07 = get(configs, 7).priceSource; priceSource08 = get(configs, 8).priceSource; priceSource09 = get(configs, 9).priceSource; priceSource10 = get(configs, 10).priceSource; priceSource11 = get(configs, 11).priceSource; priceSource12 = get(configs, 12).priceSource; priceSource13 = get(configs, 13).priceSource; priceSource14 = get(configs, 14).priceSource; priceSource15 = get(configs, 15).priceSource; priceSource16 = get(configs, 16).priceSource; priceSource17 = get(configs, 17).priceSource; priceSource18 = get(configs, 18).priceSource; priceSource19 = get(configs, 19).priceSource; priceSource20 = get(configs, 20).priceSource; priceSource21 = get(configs, 21).priceSource; priceSource22 = get(configs, 22).priceSource; priceSource23 = get(configs, 23).priceSource; priceSource24 = get(configs, 24).priceSource; priceSource25 = get(configs, 25).priceSource; priceSource26 = get(configs, 26).priceSource; priceSource27 = get(configs, 27).priceSource; priceSource28 = get(configs, 28).priceSource; priceSource29 = get(configs, 29).priceSource; fixedPrice00 = get(configs, 0).fixedPrice; fixedPrice01 = get(configs, 1).fixedPrice; fixedPrice02 = get(configs, 2).fixedPrice; fixedPrice03 = get(configs, 3).fixedPrice; fixedPrice04 = get(configs, 4).fixedPrice; fixedPrice05 = get(configs, 5).fixedPrice; fixedPrice06 = get(configs, 6).fixedPrice; fixedPrice07 = get(configs, 7).fixedPrice; fixedPrice08 = get(configs, 8).fixedPrice; fixedPrice09 = get(configs, 9).fixedPrice; fixedPrice10 = get(configs, 10).fixedPrice; fixedPrice11 = get(configs, 11).fixedPrice; fixedPrice12 = get(configs, 12).fixedPrice; fixedPrice13 = get(configs, 13).fixedPrice; fixedPrice14 = get(configs, 14).fixedPrice; fixedPrice15 = get(configs, 15).fixedPrice; fixedPrice16 = get(configs, 16).fixedPrice; fixedPrice17 = get(configs, 17).fixedPrice; fixedPrice18 = get(configs, 18).fixedPrice; fixedPrice19 = get(configs, 19).fixedPrice; fixedPrice20 = get(configs, 20).fixedPrice; fixedPrice21 = get(configs, 21).fixedPrice; fixedPrice22 = get(configs, 22).fixedPrice; fixedPrice23 = get(configs, 23).fixedPrice; fixedPrice24 = get(configs, 24).fixedPrice; fixedPrice25 = get(configs, 25).fixedPrice; fixedPrice26 = get(configs, 26).fixedPrice; fixedPrice27 = get(configs, 27).fixedPrice; fixedPrice28 = get(configs, 28).fixedPrice; fixedPrice29 = get(configs, 29).fixedPrice; uniswapMarket00 = get(configs, 0).uniswapMarket; uniswapMarket01 = get(configs, 1).uniswapMarket; uniswapMarket02 = get(configs, 2).uniswapMarket; uniswapMarket03 = get(configs, 3).uniswapMarket; uniswapMarket04 = get(configs, 4).uniswapMarket; uniswapMarket05 = get(configs, 5).uniswapMarket; uniswapMarket06 = get(configs, 6).uniswapMarket; uniswapMarket07 = get(configs, 7).uniswapMarket; uniswapMarket08 = get(configs, 8).uniswapMarket; uniswapMarket09 = get(configs, 9).uniswapMarket; uniswapMarket10 = get(configs, 10).uniswapMarket; uniswapMarket11 = get(configs, 11).uniswapMarket; uniswapMarket12 = get(configs, 12).uniswapMarket; uniswapMarket13 = get(configs, 13).uniswapMarket; uniswapMarket14 = get(configs, 14).uniswapMarket; uniswapMarket15 = get(configs, 15).uniswapMarket; uniswapMarket16 = get(configs, 16).uniswapMarket; uniswapMarket17 = get(configs, 17).uniswapMarket; uniswapMarket18 = get(configs, 18).uniswapMarket; uniswapMarket19 = get(configs, 19).uniswapMarket; uniswapMarket20 = get(configs, 20).uniswapMarket; uniswapMarket21 = get(configs, 21).uniswapMarket; uniswapMarket22 = get(configs, 22).uniswapMarket; uniswapMarket23 = get(configs, 23).uniswapMarket; uniswapMarket24 = get(configs, 24).uniswapMarket; uniswapMarket25 = get(configs, 25).uniswapMarket; uniswapMarket26 = get(configs, 26).uniswapMarket; uniswapMarket27 = get(configs, 27).uniswapMarket; uniswapMarket28 = get(configs, 28).uniswapMarket; uniswapMarket29 = get(configs, 29).uniswapMarket; isUniswapReversed00 = get(configs, 0).isUniswapReversed; isUniswapReversed01 = get(configs, 1).isUniswapReversed; isUniswapReversed02 = get(configs, 2).isUniswapReversed; isUniswapReversed03 = get(configs, 3).isUniswapReversed; isUniswapReversed04 = get(configs, 4).isUniswapReversed; isUniswapReversed05 = get(configs, 5).isUniswapReversed; isUniswapReversed06 = get(configs, 6).isUniswapReversed; isUniswapReversed07 = get(configs, 7).isUniswapReversed; isUniswapReversed08 = get(configs, 8).isUniswapReversed; isUniswapReversed09 = get(configs, 9).isUniswapReversed; isUniswapReversed10 = get(configs, 10).isUniswapReversed; isUniswapReversed11 = get(configs, 11).isUniswapReversed; isUniswapReversed12 = get(configs, 12).isUniswapReversed; isUniswapReversed13 = get(configs, 13).isUniswapReversed; isUniswapReversed14 = get(configs, 14).isUniswapReversed; isUniswapReversed15 = get(configs, 15).isUniswapReversed; isUniswapReversed16 = get(configs, 16).isUniswapReversed; isUniswapReversed17 = get(configs, 17).isUniswapReversed; isUniswapReversed18 = get(configs, 18).isUniswapReversed; isUniswapReversed19 = get(configs, 19).isUniswapReversed; isUniswapReversed20 = get(configs, 20).isUniswapReversed; isUniswapReversed21 = get(configs, 21).isUniswapReversed; isUniswapReversed22 = get(configs, 22).isUniswapReversed; isUniswapReversed23 = get(configs, 23).isUniswapReversed; isUniswapReversed24 = get(configs, 24).isUniswapReversed; isUniswapReversed25 = get(configs, 25).isUniswapReversed; isUniswapReversed26 = get(configs, 26).isUniswapReversed; isUniswapReversed27 = get(configs, 27).isUniswapReversed; isUniswapReversed28 = get(configs, 28).isUniswapReversed; isUniswapReversed29 = get(configs, 29).isUniswapReversed; } function get(TokenConfig[] memory configs, uint i) internal pure returns (TokenConfig memory) { if (i < configs.length) return configs[i]; return TokenConfig({ cToken: address(0), underlying: address(0), symbolHash: bytes32(0), baseUnit: uint256(0), priceSource: PriceSource(0), fixedPrice: uint256(0), uniswapMarket: address(0), isUniswapReversed: false }); } function getCTokenIndex(address cToken) internal view returns (uint) { if (cToken == cToken00) return 0; if (cToken == cToken01) return 1; if (cToken == cToken02) return 2; if (cToken == cToken03) return 3; if (cToken == cToken04) return 4; if (cToken == cToken05) return 5; if (cToken == cToken06) return 6; if (cToken == cToken07) return 7; if (cToken == cToken08) return 8; if (cToken == cToken09) return 9; if (cToken == cToken10) return 10; if (cToken == cToken11) return 11; if (cToken == cToken12) return 12; if (cToken == cToken13) return 13; if (cToken == cToken14) return 14; if (cToken == cToken15) return 15; if (cToken == cToken16) return 16; if (cToken == cToken17) return 17; if (cToken == cToken18) return 18; if (cToken == cToken19) return 19; if (cToken == cToken20) return 20; if (cToken == cToken21) return 21; if (cToken == cToken22) return 22; if (cToken == cToken23) return 23; if (cToken == cToken24) return 24; if (cToken == cToken25) return 25; if (cToken == cToken26) return 26; if (cToken == cToken27) return 27; if (cToken == cToken28) return 28; if (cToken == cToken29) return 29; return uint(-1); } function getUnderlyingIndex(address underlying) internal view returns (uint) { if (underlying == underlying00) return 0; if (underlying == underlying01) return 1; if (underlying == underlying02) return 2; if (underlying == underlying03) return 3; if (underlying == underlying04) return 4; if (underlying == underlying05) return 5; if (underlying == underlying06) return 6; if (underlying == underlying07) return 7; if (underlying == underlying08) return 8; if (underlying == underlying09) return 9; if (underlying == underlying10) return 10; if (underlying == underlying11) return 11; if (underlying == underlying12) return 12; if (underlying == underlying13) return 13; if (underlying == underlying14) return 14; if (underlying == underlying15) return 15; if (underlying == underlying16) return 16; if (underlying == underlying17) return 17; if (underlying == underlying18) return 18; if (underlying == underlying19) return 19; if (underlying == underlying20) return 20; if (underlying == underlying21) return 21; if (underlying == underlying22) return 22; if (underlying == underlying23) return 23; if (underlying == underlying24) return 24; if (underlying == underlying25) return 25; if (underlying == underlying26) return 26; if (underlying == underlying27) return 27; if (underlying == underlying28) return 28; if (underlying == underlying29) return 29; return uint(-1); } function getSymbolHashIndex(bytes32 symbolHash) internal view returns (uint) { if (symbolHash == symbolHash00) return 0; if (symbolHash == symbolHash01) return 1; if (symbolHash == symbolHash02) return 2; if (symbolHash == symbolHash03) return 3; if (symbolHash == symbolHash04) return 4; if (symbolHash == symbolHash05) return 5; if (symbolHash == symbolHash06) return 6; if (symbolHash == symbolHash07) return 7; if (symbolHash == symbolHash08) return 8; if (symbolHash == symbolHash09) return 9; if (symbolHash == symbolHash10) return 10; if (symbolHash == symbolHash11) return 11; if (symbolHash == symbolHash12) return 12; if (symbolHash == symbolHash13) return 13; if (symbolHash == symbolHash14) return 14; if (symbolHash == symbolHash15) return 15; if (symbolHash == symbolHash16) return 16; if (symbolHash == symbolHash17) return 17; if (symbolHash == symbolHash18) return 18; if (symbolHash == symbolHash19) return 19; if (symbolHash == symbolHash20) return 20; if (symbolHash == symbolHash21) return 21; if (symbolHash == symbolHash22) return 22; if (symbolHash == symbolHash23) return 23; if (symbolHash == symbolHash24) return 24; if (symbolHash == symbolHash25) return 25; if (symbolHash == symbolHash26) return 26; if (symbolHash == symbolHash27) return 27; if (symbolHash == symbolHash28) return 28; if (symbolHash == symbolHash29) return 29; return uint(-1); } /** * @notice Get the i-th config, according to the order they were passed in originally * @param i The index of the config to get * @return The config object */ function getTokenConfig(uint i) public view returns (TokenConfig memory) { require(i < numTokens, "token config not found"); if (i == 0) return TokenConfig({cToken: cToken00, underlying: underlying00, symbolHash: symbolHash00, baseUnit: baseUnit00, priceSource: priceSource00, fixedPrice: fixedPrice00, uniswapMarket: uniswapMarket00, isUniswapReversed: isUniswapReversed00}); if (i == 1) return TokenConfig({cToken: cToken01, underlying: underlying01, symbolHash: symbolHash01, baseUnit: baseUnit01, priceSource: priceSource01, fixedPrice: fixedPrice01, uniswapMarket: uniswapMarket01, isUniswapReversed: isUniswapReversed01}); if (i == 2) return TokenConfig({cToken: cToken02, underlying: underlying02, symbolHash: symbolHash02, baseUnit: baseUnit02, priceSource: priceSource02, fixedPrice: fixedPrice02, uniswapMarket: uniswapMarket02, isUniswapReversed: isUniswapReversed02}); if (i == 3) return TokenConfig({cToken: cToken03, underlying: underlying03, symbolHash: symbolHash03, baseUnit: baseUnit03, priceSource: priceSource03, fixedPrice: fixedPrice03, uniswapMarket: uniswapMarket03, isUniswapReversed: isUniswapReversed03}); if (i == 4) return TokenConfig({cToken: cToken04, underlying: underlying04, symbolHash: symbolHash04, baseUnit: baseUnit04, priceSource: priceSource04, fixedPrice: fixedPrice04, uniswapMarket: uniswapMarket04, isUniswapReversed: isUniswapReversed04}); if (i == 5) return TokenConfig({cToken: cToken05, underlying: underlying05, symbolHash: symbolHash05, baseUnit: baseUnit05, priceSource: priceSource05, fixedPrice: fixedPrice05, uniswapMarket: uniswapMarket05, isUniswapReversed: isUniswapReversed05}); if (i == 6) return TokenConfig({cToken: cToken06, underlying: underlying06, symbolHash: symbolHash06, baseUnit: baseUnit06, priceSource: priceSource06, fixedPrice: fixedPrice06, uniswapMarket: uniswapMarket06, isUniswapReversed: isUniswapReversed06}); if (i == 7) return TokenConfig({cToken: cToken07, underlying: underlying07, symbolHash: symbolHash07, baseUnit: baseUnit07, priceSource: priceSource07, fixedPrice: fixedPrice07, uniswapMarket: uniswapMarket07, isUniswapReversed: isUniswapReversed07}); if (i == 8) return TokenConfig({cToken: cToken08, underlying: underlying08, symbolHash: symbolHash08, baseUnit: baseUnit08, priceSource: priceSource08, fixedPrice: fixedPrice08, uniswapMarket: uniswapMarket08, isUniswapReversed: isUniswapReversed08}); if (i == 9) return TokenConfig({cToken: cToken09, underlying: underlying09, symbolHash: symbolHash09, baseUnit: baseUnit09, priceSource: priceSource09, fixedPrice: fixedPrice09, uniswapMarket: uniswapMarket09, isUniswapReversed: isUniswapReversed09}); if (i == 10) return TokenConfig({cToken: cToken10, underlying: underlying10, symbolHash: symbolHash10, baseUnit: baseUnit10, priceSource: priceSource10, fixedPrice: fixedPrice10, uniswapMarket: uniswapMarket10, isUniswapReversed: isUniswapReversed10}); if (i == 11) return TokenConfig({cToken: cToken11, underlying: underlying11, symbolHash: symbolHash11, baseUnit: baseUnit11, priceSource: priceSource11, fixedPrice: fixedPrice11, uniswapMarket: uniswapMarket11, isUniswapReversed: isUniswapReversed11}); if (i == 12) return TokenConfig({cToken: cToken12, underlying: underlying12, symbolHash: symbolHash12, baseUnit: baseUnit12, priceSource: priceSource12, fixedPrice: fixedPrice12, uniswapMarket: uniswapMarket12, isUniswapReversed: isUniswapReversed12}); if (i == 13) return TokenConfig({cToken: cToken13, underlying: underlying13, symbolHash: symbolHash13, baseUnit: baseUnit13, priceSource: priceSource13, fixedPrice: fixedPrice13, uniswapMarket: uniswapMarket13, isUniswapReversed: isUniswapReversed13}); if (i == 14) return TokenConfig({cToken: cToken14, underlying: underlying14, symbolHash: symbolHash14, baseUnit: baseUnit14, priceSource: priceSource14, fixedPrice: fixedPrice14, uniswapMarket: uniswapMarket14, isUniswapReversed: isUniswapReversed14}); if (i == 15) return TokenConfig({cToken: cToken15, underlying: underlying15, symbolHash: symbolHash15, baseUnit: baseUnit15, priceSource: priceSource15, fixedPrice: fixedPrice15, uniswapMarket: uniswapMarket15, isUniswapReversed: isUniswapReversed15}); if (i == 16) return TokenConfig({cToken: cToken16, underlying: underlying16, symbolHash: symbolHash16, baseUnit: baseUnit16, priceSource: priceSource16, fixedPrice: fixedPrice16, uniswapMarket: uniswapMarket16, isUniswapReversed: isUniswapReversed16}); if (i == 17) return TokenConfig({cToken: cToken17, underlying: underlying17, symbolHash: symbolHash17, baseUnit: baseUnit17, priceSource: priceSource17, fixedPrice: fixedPrice17, uniswapMarket: uniswapMarket17, isUniswapReversed: isUniswapReversed17}); if (i == 18) return TokenConfig({cToken: cToken18, underlying: underlying18, symbolHash: symbolHash18, baseUnit: baseUnit18, priceSource: priceSource18, fixedPrice: fixedPrice18, uniswapMarket: uniswapMarket18, isUniswapReversed: isUniswapReversed18}); if (i == 19) return TokenConfig({cToken: cToken19, underlying: underlying19, symbolHash: symbolHash19, baseUnit: baseUnit19, priceSource: priceSource19, fixedPrice: fixedPrice19, uniswapMarket: uniswapMarket19, isUniswapReversed: isUniswapReversed19}); if (i == 20) return TokenConfig({cToken: cToken20, underlying: underlying20, symbolHash: symbolHash20, baseUnit: baseUnit20, priceSource: priceSource20, fixedPrice: fixedPrice20, uniswapMarket: uniswapMarket20, isUniswapReversed: isUniswapReversed20}); if (i == 21) return TokenConfig({cToken: cToken21, underlying: underlying21, symbolHash: symbolHash21, baseUnit: baseUnit21, priceSource: priceSource21, fixedPrice: fixedPrice21, uniswapMarket: uniswapMarket21, isUniswapReversed: isUniswapReversed21}); if (i == 22) return TokenConfig({cToken: cToken22, underlying: underlying22, symbolHash: symbolHash22, baseUnit: baseUnit22, priceSource: priceSource22, fixedPrice: fixedPrice22, uniswapMarket: uniswapMarket22, isUniswapReversed: isUniswapReversed22}); if (i == 23) return TokenConfig({cToken: cToken23, underlying: underlying23, symbolHash: symbolHash23, baseUnit: baseUnit23, priceSource: priceSource23, fixedPrice: fixedPrice23, uniswapMarket: uniswapMarket23, isUniswapReversed: isUniswapReversed23}); if (i == 24) return TokenConfig({cToken: cToken24, underlying: underlying24, symbolHash: symbolHash24, baseUnit: baseUnit24, priceSource: priceSource24, fixedPrice: fixedPrice24, uniswapMarket: uniswapMarket24, isUniswapReversed: isUniswapReversed24}); if (i == 25) return TokenConfig({cToken: cToken25, underlying: underlying25, symbolHash: symbolHash25, baseUnit: baseUnit25, priceSource: priceSource25, fixedPrice: fixedPrice25, uniswapMarket: uniswapMarket25, isUniswapReversed: isUniswapReversed25}); if (i == 26) return TokenConfig({cToken: cToken26, underlying: underlying26, symbolHash: symbolHash26, baseUnit: baseUnit26, priceSource: priceSource26, fixedPrice: fixedPrice26, uniswapMarket: uniswapMarket26, isUniswapReversed: isUniswapReversed26}); if (i == 27) return TokenConfig({cToken: cToken27, underlying: underlying27, symbolHash: symbolHash27, baseUnit: baseUnit27, priceSource: priceSource27, fixedPrice: fixedPrice27, uniswapMarket: uniswapMarket27, isUniswapReversed: isUniswapReversed27}); if (i == 28) return TokenConfig({cToken: cToken28, underlying: underlying28, symbolHash: symbolHash28, baseUnit: baseUnit28, priceSource: priceSource28, fixedPrice: fixedPrice28, uniswapMarket: uniswapMarket28, isUniswapReversed: isUniswapReversed28}); if (i == 29) return TokenConfig({cToken: cToken29, underlying: underlying29, symbolHash: symbolHash29, baseUnit: baseUnit29, priceSource: priceSource29, fixedPrice: fixedPrice29, uniswapMarket: uniswapMarket29, isUniswapReversed: isUniswapReversed29}); } /** * @notice Get the config for symbol * @param symbol The symbol of the config to get * @return The config object */ function getTokenConfigBySymbol(string memory symbol) public view returns (TokenConfig memory) { return getTokenConfigBySymbolHash(keccak256(abi.encodePacked(symbol))); } /** * @notice Get the config for the symbolHash * @param symbolHash The keccack256 of the symbol of the config to get * @return The config object */ function getTokenConfigBySymbolHash(bytes32 symbolHash) public view returns (TokenConfig memory) { uint index = getSymbolHashIndex(symbolHash); if (index != uint(-1)) { return getTokenConfig(index); } revert("token config not found"); } /** * @notice Get the config for the cToken * @dev If a config for the cToken is not found, falls back to searching for the underlying. * @param cToken The address of the cToken of the config to get * @return The config object */ function getTokenConfigByCToken(address cToken) public view returns (TokenConfig memory) { uint index = getCTokenIndex(cToken); if (index != uint(-1)) { return getTokenConfig(index); } return getTokenConfigByUnderlying(CErc20(cToken).underlying()); } /** * @notice Get the config for an underlying asset * @param underlying The address of the underlying asset of the config to get * @return The config object */ function getTokenConfigByUnderlying(address underlying) public view returns (TokenConfig memory) { uint index = getUnderlyingIndex(underlying); if (index != uint(-1)) { return getTokenConfig(index); } revert("token config not found"); } } // Based on code from https://github.com/Uniswap/uniswap-v2-periphery // a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format)) library FixedPoint { // range: [0, 2**112 - 1] // resolution: 1 / 2**112 struct uq112x112 { uint224 _x; } // returns a uq112x112 which represents the ratio of the numerator to the denominator // equivalent to encode(numerator).div(denominator) function fraction(uint112 numerator, uint112 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, "FixedPoint: DIV_BY_ZERO"); return uq112x112((uint224(numerator) << 112) / denominator); } // decode a uq112x112 into a uint with 18 decimals of precision function decode112with18(uq112x112 memory self) internal pure returns (uint) { // we only have 256 - 224 = 32 bits to spare, so scaling up by ~60 bits is dangerous // instead, get close to: // (x * 1e18) >> 112 // without risk of overflowing, e.g.: // (x) / 2 ** (112 - lg(1e18)) return uint(self._x) / 5192296858534827; } } // library with helper methods for oracles that are concerned with computing average prices library UniswapV2OracleLibrary { using FixedPoint for *; // helper function that returns the current block timestamp within the range of uint32, i.e. [0, 2**32 - 1] function currentBlockTimestamp() internal view returns (uint32) { return uint32(block.timestamp % 2 ** 32); } // produces the cumulative price using counterfactuals to save gas and avoid a call to sync. function currentCumulativePrices( address pair ) internal view returns (uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp) { blockTimestamp = currentBlockTimestamp(); price0Cumulative = IUniswapV2Pair(pair).price0CumulativeLast(); price1Cumulative = IUniswapV2Pair(pair).price1CumulativeLast(); // if time has elapsed since the last update on the pair, mock the accumulated price values (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) = IUniswapV2Pair(pair).getReserves(); if (blockTimestampLast != blockTimestamp) { // subtraction overflow is desired uint32 timeElapsed = blockTimestamp - blockTimestampLast; // addition overflow is desired // counterfactual price0Cumulative += uint(FixedPoint.fraction(reserve1, reserve0)._x) * timeElapsed; // counterfactual price1Cumulative += uint(FixedPoint.fraction(reserve0, reserve1)._x) * timeElapsed; } } } interface IUniswapV2Pair { function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); } struct Observation { uint timestamp; uint acc; } contract UniswapAnchoredView is UniswapConfig { using FixedPoint for *; /// @notice The Open Oracle Price Data contract OpenOraclePriceData public immutable priceData; /// @notice The number of wei in 1 ETH uint public constant ethBaseUnit = 1e18; /// @notice A common scaling factor to maintain precision uint public constant expScale = 1e18; /// @notice The Open Oracle Reporter address public immutable reporter; /// @notice The highest ratio of the new price to the anchor price that will still trigger the price to be updated uint public immutable upperBoundAnchorRatio; /// @notice The lowest ratio of the new price to the anchor price that will still trigger the price to be updated uint public immutable lowerBoundAnchorRatio; /// @notice The minimum amount of time in seconds required for the old uniswap price accumulator to be replaced uint public immutable anchorPeriod; /// @notice Official prices by symbol hash mapping(bytes32 => uint) public prices; /// @notice Circuit breaker for using anchor price oracle directly, ignoring reporter bool public reporterInvalidated; /// @notice The old observation for each symbolHash mapping(bytes32 => Observation) public oldObservations; /// @notice The new observation for each symbolHash mapping(bytes32 => Observation) public newObservations; /// @notice The event emitted when new prices are posted but the stored price is not updated due to the anchor event PriceGuarded(string symbol, uint reporter, uint anchor); /// @notice The event emitted when the stored price is updated event PriceUpdated(string symbol, uint price); /// @notice The event emitted when anchor price is updated event AnchorPriceUpdated(string symbol, uint anchorPrice, uint oldTimestamp, uint newTimestamp); /// @notice The event emitted when the uniswap window changes event UniswapWindowUpdated(bytes32 indexed symbolHash, uint oldTimestamp, uint newTimestamp, uint oldPrice, uint newPrice); /// @notice The event emitted when reporter invalidates itself event ReporterInvalidated(address reporter); bytes32 constant ethHash = keccak256(abi.encodePacked("ETH")); bytes32 constant rotateHash = keccak256(abi.encodePacked("rotate")); /** * @notice Construct a uniswap anchored view for a set of token configurations * @dev Note that to avoid immature TWAPs, the system must run for at least a single anchorPeriod before using. * @param reporter_ The reporter whose prices are to be used * @param anchorToleranceMantissa_ The percentage tolerance that the reporter may deviate from the uniswap anchor * @param anchorPeriod_ The minimum amount of time required for the old uniswap price accumulator to be replaced * @param configs The static token configurations which define what prices are supported and how */ constructor(OpenOraclePriceData priceData_, address reporter_, uint anchorToleranceMantissa_, uint anchorPeriod_, TokenConfig[] memory configs) UniswapConfig(configs) public { priceData = priceData_; reporter = reporter_; anchorPeriod = anchorPeriod_; // Allow the tolerance to be whatever the deployer chooses, but prevent under/overflow (and prices from being 0) upperBoundAnchorRatio = anchorToleranceMantissa_ > uint(-1) - 100e16 ? uint(-1) : 100e16 + anchorToleranceMantissa_; lowerBoundAnchorRatio = anchorToleranceMantissa_ < 100e16 ? 100e16 - anchorToleranceMantissa_ : 1; for (uint i = 0; i < configs.length; i++) { TokenConfig memory config = configs[i]; require(config.baseUnit > 0, "baseUnit must be greater than zero"); address uniswapMarket = config.uniswapMarket; if (config.priceSource == PriceSource.REPORTER) { require(uniswapMarket != address(0), "reported prices must have an anchor"); bytes32 symbolHash = config.symbolHash; uint cumulativePrice = currentCumulativePrice(config); oldObservations[symbolHash].timestamp = block.timestamp; newObservations[symbolHash].timestamp = block.timestamp; oldObservations[symbolHash].acc = cumulativePrice; newObservations[symbolHash].acc = cumulativePrice; emit UniswapWindowUpdated(symbolHash, block.timestamp, block.timestamp, cumulativePrice, cumulativePrice); } else { require(uniswapMarket == address(0), "only reported prices utilize an anchor"); } } } /** * @notice Get the official price for a symbol * @param symbol The symbol to fetch the price of * @return Price denominated in USD, with 6 decimals */ function price(string memory symbol) external view returns (uint) { TokenConfig memory config = getTokenConfigBySymbol(symbol); return priceInternal(config); } function priceInternal(TokenConfig memory config) internal view returns (uint) { if (config.priceSource == PriceSource.REPORTER) return prices[config.symbolHash]; if (config.priceSource == PriceSource.FIXED_USD) return config.fixedPrice; if (config.priceSource == PriceSource.FIXED_ETH) { uint usdPerEth = prices[ethHash]; require(usdPerEth > 0, "ETH price not set, cannot convert to dollars"); return mul(usdPerEth, config.fixedPrice) / ethBaseUnit; } } /** * @notice Get the underlying price of a cToken * @dev Implements the PriceOracle interface for Compound v2. * @param cToken The cToken address for price retrieval * @return Price denominated in USD, with 18 decimals, for the given cToken address */ function getUnderlyingPrice(address cToken) external view returns (uint) { TokenConfig memory config = getTokenConfigByCToken(cToken); // Comptroller needs prices in the format: ${raw price} * 1e(36 - baseUnit) // Since the prices in this view have 6 decimals, we must scale them by 1e(36 - 6 - baseUnit) return mul(1e30, priceInternal(config)) / config.baseUnit; } /** * @notice Post open oracle reporter prices, and recalculate stored price by comparing to anchor * @dev We let anyone pay to post anything, but only prices from configured reporter will be stored in the view. * @param messages The messages to post to the oracle * @param signatures The signatures for the corresponding messages * @param symbols The symbols to compare to anchor for authoritative reading */ function postPrices(bytes[] calldata messages, bytes[] calldata signatures, string[] calldata symbols) external { require(messages.length == signatures.length, "messages and signatures must be 1:1"); // Save the prices for (uint i = 0; i < messages.length; i++) { priceData.put(messages[i], signatures[i]); } uint ethPrice = fetchEthPrice(); // Try to update the view storage for (uint i = 0; i < symbols.length; i++) { postPriceInternal(symbols[i], ethPrice); } } function postPriceInternal(string memory symbol, uint ethPrice) internal { TokenConfig memory config = getTokenConfigBySymbol(symbol); require(config.priceSource == PriceSource.REPORTER, "only reporter prices get posted"); bytes32 symbolHash = keccak256(abi.encodePacked(symbol)); uint reporterPrice = priceData.getPrice(reporter, symbol); uint anchorPrice; if (symbolHash == ethHash) { anchorPrice = ethPrice; } else { anchorPrice = fetchAnchorPrice(symbol, config, ethPrice); } if (reporterInvalidated) { prices[symbolHash] = anchorPrice; emit PriceUpdated(symbol, anchorPrice); } else if (isWithinAnchor(reporterPrice, anchorPrice)) { prices[symbolHash] = reporterPrice; emit PriceUpdated(symbol, reporterPrice); } else { emit PriceGuarded(symbol, reporterPrice, anchorPrice); } } function isWithinAnchor(uint reporterPrice, uint anchorPrice) internal view returns (bool) { if (reporterPrice > 0) { uint anchorRatio = mul(anchorPrice, 100e16) / reporterPrice; return anchorRatio <= upperBoundAnchorRatio && anchorRatio >= lowerBoundAnchorRatio; } return false; } /** * @dev Fetches the current token/eth price accumulator from uniswap. */ function currentCumulativePrice(TokenConfig memory config) internal view returns (uint) { (uint cumulativePrice0, uint cumulativePrice1,) = UniswapV2OracleLibrary.currentCumulativePrices(config.uniswapMarket); if (config.isUniswapReversed) { return cumulativePrice1; } else { return cumulativePrice0; } } /** * @dev Fetches the current eth/usd price from uniswap, with 6 decimals of precision. * Conversion factor is 1e18 for eth/usdc market, since we decode uniswap price statically with 18 decimals. */ function fetchEthPrice() internal returns (uint) { return fetchAnchorPrice("ETH", getTokenConfigBySymbolHash(ethHash), ethBaseUnit); } /** * @dev Fetches the current token/usd price from uniswap, with 6 decimals of precision. * @param conversionFactor 1e18 if seeking the ETH price, and a 6 decimal ETH-USDC price in the case of other assets */ function fetchAnchorPrice(string memory symbol, TokenConfig memory config, uint conversionFactor) internal virtual returns (uint) { (uint nowCumulativePrice, uint oldCumulativePrice, uint oldTimestamp) = pokeWindowValues(config); // This should be impossible, but better safe than sorry require(block.timestamp > oldTimestamp, "now must come after before"); uint timeElapsed = block.timestamp - oldTimestamp; // Calculate uniswap time-weighted average price // Underflow is a property of the accumulators: https://uniswap.org/audit.html#orgc9b3190 FixedPoint.uq112x112 memory priceAverage = FixedPoint.uq112x112(uint224((nowCumulativePrice - oldCumulativePrice) / timeElapsed)); uint rawUniswapPriceMantissa = priceAverage.decode112with18(); uint unscaledPriceMantissa = mul(rawUniswapPriceMantissa, conversionFactor); uint anchorPrice; // Adjust rawUniswapPrice according to the units of the non-ETH asset // In the case of ETH, we would have to scale by 1e6 / USDC_UNITS, but since baseUnit2 is 1e6 (USDC), it cancels if (config.isUniswapReversed) { // unscaledPriceMantissa * ethBaseUnit / config.baseUnit / expScale, but we simplify bc ethBaseUnit == expScale anchorPrice = unscaledPriceMantissa / config.baseUnit; } else { anchorPrice = mul(unscaledPriceMantissa, config.baseUnit) / ethBaseUnit / expScale; } emit AnchorPriceUpdated(symbol, anchorPrice, oldTimestamp, block.timestamp); return anchorPrice; } /** * @dev Get time-weighted average prices for a token at the current timestamp. * Update new and old observations of lagging window if period elapsed. */ function pokeWindowValues(TokenConfig memory config) internal returns (uint, uint, uint) { bytes32 symbolHash = config.symbolHash; uint cumulativePrice = currentCumulativePrice(config); Observation memory newObservation = newObservations[symbolHash]; // Update new and old observations if elapsed time is greater than or equal to anchor period uint timeElapsed = block.timestamp - newObservation.timestamp; if (timeElapsed >= anchorPeriod) { oldObservations[symbolHash].timestamp = newObservation.timestamp; oldObservations[symbolHash].acc = newObservation.acc; newObservations[symbolHash].timestamp = block.timestamp; newObservations[symbolHash].acc = cumulativePrice; emit UniswapWindowUpdated(config.symbolHash, newObservation.timestamp, block.timestamp, newObservation.acc, cumulativePrice); } return (cumulativePrice, oldObservations[symbolHash].acc, oldObservations[symbolHash].timestamp); } /** * @notice Invalidate the reporter, and fall back to using anchor directly in all cases * @dev Only the reporter may sign a message which allows it to invalidate itself. * To be used in cases of emergency, if the reporter thinks their key may be compromised. * @param message The data that was presumably signed * @param signature The fingerprint of the data + private key */ function invalidateReporter(bytes memory message, bytes memory signature) external { (string memory decodedMessage, ) = abi.decode(message, (string, address)); require(keccak256(abi.encodePacked(decodedMessage)) == rotateHash, "invalid message must be 'rotate'"); require(source(message, signature) == reporter, "invalidation message must come from the reporter"); reporterInvalidated = true; emit ReporterInvalidated(reporter); } /** * @notice Recovers the source address which signed a message * @dev Comparing to a claimed address would add nothing, * as the caller could simply perform the recover and claim that address. * @param message The data that was presumably signed * @param signature The fingerprint of the data + private key * @return The source address which signed the message, presumably */ function source(bytes memory message, bytes memory signature) public pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = abi.decode(signature, (bytes32, bytes32, uint8)); bytes32 hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(message))); return ecrecover(hash, v, r, s); } /// @dev Overflow proof multiplication function mul(uint a, uint b) internal pure returns (uint) { if (a == 0) return 0; uint c = a * b; require(c / a == b, "multiplication overflow"); return c; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract OpenOraclePriceData","name":"priceData_","type":"address"},{"internalType":"address","name":"reporter_","type":"address"},{"internalType":"uint256","name":"anchorToleranceMantissa_","type":"uint256"},{"internalType":"uint256","name":"anchorPeriod_","type":"uint256"},{"components":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig[]","name":"configs","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"anchorPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTimestamp","type":"uint256"}],"name":"AnchorPriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"reporter","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"anchor","type":"uint256"}],"name":"PriceGuarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"PriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"reporter","type":"address"}],"name":"ReporterInvalidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"oldTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"UniswapWindowUpdated","type":"event"},{"inputs":[],"name":"anchorPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethBaseUnit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expScale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getTokenConfig","outputs":[{"components":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"cToken","type":"address"}],"name":"getTokenConfigByCToken","outputs":[{"components":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"getTokenConfigBySymbol","outputs":[{"components":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"symbolHash","type":"bytes32"}],"name":"getTokenConfigBySymbolHash","outputs":[{"components":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getTokenConfigByUnderlying","outputs":[{"components":[{"internalType":"address","name":"cToken","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"bytes32","name":"symbolHash","type":"bytes32"},{"internalType":"uint256","name":"baseUnit","type":"uint256"},{"internalType":"enum UniswapConfig.PriceSource","name":"priceSource","type":"uint8"},{"internalType":"uint256","name":"fixedPrice","type":"uint256"},{"internalType":"address","name":"uniswapMarket","type":"address"},{"internalType":"bool","name":"isUniswapReversed","type":"bool"}],"internalType":"struct UniswapConfig.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"cToken","type":"address"}],"name":"getUnderlyingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"invalidateReporter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lowerBoundAnchorRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"newObservations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"acc","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"oldObservations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"acc","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"messages","type":"bytes[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"},{"internalType":"string[]","name":"symbols","type":"string[]"}],"name":"postPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceData","outputs":[{"internalType":"contract OpenOraclePriceData","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"prices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reporter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reporterInvalidated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"source","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"upperBoundAnchorRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
611f406040523480156200001257600080fd5b50604051620095e7380380620095e783398101604081905262000035916200280f565b80601e81511115620000645760405162461bcd60e51b81526004016200005b90620029fb565b60405180910390fd5b80516080526200007f8160006001600160e01b036200239616565b5160601b6001600160601b03191660a0526200009d81600162002396565b5160601b6001600160601b03191660c052620000bb81600262002396565b5160601b6001600160601b03191660e052620000d981600362002396565b5160601b6001600160601b03191661010052620000f881600462002396565b5160601b6001600160601b031916610120526200011781600562002396565b5160601b6001600160601b031916610140526200013681600662002396565b5160601b6001600160601b031916610160526200015581600762002396565b5160601b6001600160601b031916610180526200017481600862002396565b5160601b6001600160601b0319166101a0526200019381600962002396565b5160601b6001600160601b0319166101c052620001b281600a62002396565b5160601b6001600160601b0319166101e052620001d181600b62002396565b5160601b6001600160601b03191661020052620001f081600c62002396565b5160601b6001600160601b031916610220526200020f81600d62002396565b5160601b6001600160601b031916610240526200022e81600e62002396565b5160601b6001600160601b031916610260526200024d81600f62002396565b5160601b6001600160601b031916610280526200026c81601062002396565b5160601b6001600160601b0319166102a0526200028b81601162002396565b5160601b6001600160601b0319166102c052620002aa81601262002396565b5160601b6001600160601b0319166102e052620002c981601362002396565b5160601b6001600160601b03191661030052620002e881601462002396565b5160601b6001600160601b031916610320526200030781601562002396565b5160601b6001600160601b031916610340526200032681601662002396565b5160601b6001600160601b031916610360526200034581601762002396565b5160601b6001600160601b031916610380526200036481601862002396565b5160601b6001600160601b0319166103a0526200038381601962002396565b5160601b6001600160601b0319166103c052620003a281601a62002396565b5160601b6001600160601b0319166103e052620003c181601b62002396565b5160601b6001600160601b03191661040052620003e081601c62002396565b5160601b6001600160601b03191661042052620003ff81601d62002396565b5160601b6001600160601b031916610440526200041e81600062002396565b6020015160601b6001600160601b031916610460526200044081600162002396565b6020015160601b6001600160601b031916610480526200046281600262002396565b6020015160601b6001600160601b0319166104a0526200048481600362002396565b6020015160601b6001600160601b0319166104c052620004a681600462002396565b6020015160601b6001600160601b0319166104e052620004c881600562002396565b6020015160601b6001600160601b03191661050052620004ea81600662002396565b6020015160601b6001600160601b031916610520526200050c81600762002396565b6020015160601b6001600160601b031916610540526200052e81600862002396565b6020015160601b6001600160601b031916610560526200055081600962002396565b6020015160601b6001600160601b031916610580526200057281600a62002396565b6020015160601b6001600160601b0319166105a0526200059481600b62002396565b6020015160601b6001600160601b0319166105c052620005b681600c62002396565b6020015160601b6001600160601b0319166105e052620005d881600d62002396565b6020015160601b6001600160601b03191661060052620005fa81600e62002396565b6020015160601b6001600160601b031916610620526200061c81600f62002396565b6020015160601b6001600160601b031916610640526200063e81601062002396565b6020015160601b6001600160601b031916610660526200066081601162002396565b6020015160601b6001600160601b031916610680526200068281601262002396565b6020015160601b6001600160601b0319166106a052620006a481601362002396565b6020015160601b6001600160601b0319166106c052620006c681601462002396565b6020015160601b6001600160601b0319166106e052620006e881601562002396565b6020015160601b6001600160601b031916610700526200070a81601662002396565b6020015160601b6001600160601b031916610720526200072c81601762002396565b6020015160601b6001600160601b031916610740526200074e81601862002396565b6020015160601b6001600160601b031916610760526200077081601962002396565b6020015160601b6001600160601b031916610780526200079281601a62002396565b6020015160601b6001600160601b0319166107a052620007b481601b62002396565b6020015160601b6001600160601b0319166107c052620007d681601c62002396565b6020015160601b6001600160601b0319166107e052620007f881601d62002396565b6020015160601b6001600160601b031916610800526200081a81600062002396565b6040015161082052620008388160016001600160e01b036200239616565b6040015161084052620008568160026001600160e01b036200239616565b6040015161086052620008748160036001600160e01b036200239616565b6040015161088052620008928160046001600160e01b036200239616565b604001516108a052620008b08160056001600160e01b036200239616565b604001516108c052620008ce8160066001600160e01b036200239616565b604001516108e052620008ec8160076001600160e01b036200239616565b60400151610900526200090a8160086001600160e01b036200239616565b6040015161092052620009288160096001600160e01b036200239616565b60400151610940526200094681600a6001600160e01b036200239616565b60400151610960526200096481600b6001600160e01b036200239616565b60400151610980526200098281600c6001600160e01b036200239616565b604001516109a052620009a081600d6001600160e01b036200239616565b604001516109c052620009be81600e6001600160e01b036200239616565b604001516109e052620009dc81600f6001600160e01b036200239616565b60400151610a0052620009fa8160106001600160e01b036200239616565b60400151610a205262000a188160116001600160e01b036200239616565b60400151610a405262000a368160126001600160e01b036200239616565b60400151610a605262000a548160136001600160e01b036200239616565b60400151610a805262000a728160146001600160e01b036200239616565b60400151610aa05262000a908160156001600160e01b036200239616565b60400151610ac05262000aae8160166001600160e01b036200239616565b60400151610ae05262000acc8160176001600160e01b036200239616565b60400151610b005262000aea8160186001600160e01b036200239616565b60400151610b205262000b088160196001600160e01b036200239616565b60400151610b405262000b2681601a6001600160e01b036200239616565b60400151610b605262000b4481601b6001600160e01b036200239616565b60400151610b805262000b6281601c6001600160e01b036200239616565b60400151610ba05262000b8081601d6001600160e01b036200239616565b60400151610bc05262000b9e8160006001600160e01b036200239616565b60600151610be05262000bbc8160016001600160e01b036200239616565b60600151610c005262000bda8160026001600160e01b036200239616565b60600151610c205262000bf88160036001600160e01b036200239616565b60600151610c405262000c168160046001600160e01b036200239616565b60600151610c605262000c348160056001600160e01b036200239616565b60600151610c805262000c528160066001600160e01b036200239616565b60600151610ca05262000c708160076001600160e01b036200239616565b60600151610cc05262000c8e8160086001600160e01b036200239616565b60600151610ce05262000cac8160096001600160e01b036200239616565b60600151610d005262000cca81600a6001600160e01b036200239616565b60600151610d205262000ce881600b6001600160e01b036200239616565b60600151610d405262000d0681600c6001600160e01b036200239616565b60600151610d605262000d2481600d6001600160e01b036200239616565b60600151610d805262000d4281600e6001600160e01b036200239616565b60600151610da05262000d6081600f6001600160e01b036200239616565b60600151610dc05262000d7e8160106001600160e01b036200239616565b60600151610de05262000d9c8160116001600160e01b036200239616565b60600151610e005262000dba8160126001600160e01b036200239616565b60600151610e205262000dd88160136001600160e01b036200239616565b60600151610e405262000df68160146001600160e01b036200239616565b60600151610e605262000e148160156001600160e01b036200239616565b60600151610e805262000e328160166001600160e01b036200239616565b60600151610ea05262000e508160176001600160e01b036200239616565b60600151610ec05262000e6e8160186001600160e01b036200239616565b60600151610ee05262000e8c8160196001600160e01b036200239616565b60600151610f005262000eaa81601a6001600160e01b036200239616565b60600151610f205262000ec881601b6001600160e01b036200239616565b60600151610f405262000ee681601c6001600160e01b036200239616565b60600151610f605262000f0481601d6001600160e01b036200239616565b60600151610f805262000f228160006001600160e01b036200239616565b60800151600281111562000f3257fe5b610fa081600281111562000f4257fe5b60f81b90525062000f5e8160016001600160e01b036200239616565b60800151600281111562000f6e57fe5b610fc081600281111562000f7e57fe5b60f81b90525062000f9a8160026001600160e01b036200239616565b60800151600281111562000faa57fe5b610fe081600281111562000fba57fe5b60f81b90525062000fd68160036001600160e01b036200239616565b60800151600281111562000fe657fe5b61100081600281111562000ff657fe5b60f81b905250620010128160046001600160e01b036200239616565b6080015160028111156200102257fe5b6110208160028111156200103257fe5b60f81b9052506200104e8160056001600160e01b036200239616565b6080015160028111156200105e57fe5b6110408160028111156200106e57fe5b60f81b9052506200108a8160066001600160e01b036200239616565b6080015160028111156200109a57fe5b611060816002811115620010aa57fe5b60f81b905250620010c68160076001600160e01b036200239616565b608001516002811115620010d657fe5b611080816002811115620010e657fe5b60f81b905250620011028160086001600160e01b036200239616565b6080015160028111156200111257fe5b6110a08160028111156200112257fe5b60f81b9052506200113e8160096001600160e01b036200239616565b6080015160028111156200114e57fe5b6110c08160028111156200115e57fe5b60f81b9052506200117a81600a6001600160e01b036200239616565b6080015160028111156200118a57fe5b6110e08160028111156200119a57fe5b60f81b905250620011b681600b6001600160e01b036200239616565b608001516002811115620011c657fe5b611100816002811115620011d657fe5b60f81b905250620011f281600c6001600160e01b036200239616565b6080015160028111156200120257fe5b6111208160028111156200121257fe5b60f81b9052506200122e81600d6001600160e01b036200239616565b6080015160028111156200123e57fe5b6111408160028111156200124e57fe5b60f81b9052506200126a81600e6001600160e01b036200239616565b6080015160028111156200127a57fe5b6111608160028111156200128a57fe5b60f81b905250620012a681600f6001600160e01b036200239616565b608001516002811115620012b657fe5b611180816002811115620012c657fe5b60f81b905250620012e28160106001600160e01b036200239616565b608001516002811115620012f257fe5b6111a08160028111156200130257fe5b60f81b9052506200131e8160116001600160e01b036200239616565b6080015160028111156200132e57fe5b6111c08160028111156200133e57fe5b60f81b9052506200135a8160126001600160e01b036200239616565b6080015160028111156200136a57fe5b6111e08160028111156200137a57fe5b60f81b905250620013968160136001600160e01b036200239616565b608001516002811115620013a657fe5b611200816002811115620013b657fe5b60f81b905250620013d28160146001600160e01b036200239616565b608001516002811115620013e257fe5b611220816002811115620013f257fe5b60f81b9052506200140e8160156001600160e01b036200239616565b6080015160028111156200141e57fe5b6112408160028111156200142e57fe5b60f81b9052506200144a8160166001600160e01b036200239616565b6080015160028111156200145a57fe5b6112608160028111156200146a57fe5b60f81b905250620014868160176001600160e01b036200239616565b6080015160028111156200149657fe5b611280816002811115620014a657fe5b60f81b905250620014c28160186001600160e01b036200239616565b608001516002811115620014d257fe5b6112a0816002811115620014e257fe5b60f81b905250620014fe8160196001600160e01b036200239616565b6080015160028111156200150e57fe5b6112c08160028111156200151e57fe5b60f81b9052506200153a81601a6001600160e01b036200239616565b6080015160028111156200154a57fe5b6112e08160028111156200155a57fe5b60f81b9052506200157681601b6001600160e01b036200239616565b6080015160028111156200158657fe5b6113008160028111156200159657fe5b60f81b905250620015b281601c6001600160e01b036200239616565b608001516002811115620015c257fe5b611320816002811115620015d257fe5b60f81b905250620015ee81601d6001600160e01b036200239616565b608001516002811115620015fe57fe5b6113408160028111156200160e57fe5b60f81b9052506200162a8160006001600160e01b036200239616565b60a0015161136052620016488160016001600160e01b036200239616565b60a0015161138052620016668160026001600160e01b036200239616565b60a001516113a052620016848160036001600160e01b036200239616565b60a001516113c052620016a28160046001600160e01b036200239616565b60a001516113e052620016c08160056001600160e01b036200239616565b60a0015161140052620016de8160066001600160e01b036200239616565b60a0015161142052620016fc8160076001600160e01b036200239616565b60a00151611440526200171a8160086001600160e01b036200239616565b60a0015161146052620017388160096001600160e01b036200239616565b60a00151611480526200175681600a6001600160e01b036200239616565b60a001516114a0526200177481600b6001600160e01b036200239616565b60a001516114c0526200179281600c6001600160e01b036200239616565b60a001516114e052620017b081600d6001600160e01b036200239616565b60a0015161150052620017ce81600e6001600160e01b036200239616565b60a0015161152052620017ec81600f6001600160e01b036200239616565b60a00151611540526200180a8160106001600160e01b036200239616565b60a0015161156052620018288160116001600160e01b036200239616565b60a0015161158052620018468160126001600160e01b036200239616565b60a001516115a052620018648160136001600160e01b036200239616565b60a001516115c052620018828160146001600160e01b036200239616565b60a001516115e052620018a08160156001600160e01b036200239616565b60a0015161160052620018be8160166001600160e01b036200239616565b60a0015161162052620018dc8160176001600160e01b036200239616565b60a0015161164052620018fa8160186001600160e01b036200239616565b60a0015161166052620019188160196001600160e01b036200239616565b60a00151611680526200193681601a6001600160e01b036200239616565b60a001516116a0526200195481601b6001600160e01b036200239616565b60a001516116c0526200197281601c6001600160e01b036200239616565b60a001516116e0526200199081601d6001600160e01b036200239616565b60a0015161170052620019ae8160006001600160e01b036200239616565b60c0015160601b6001600160601b03191661172052620019d081600162002396565b60c0015160601b6001600160601b03191661174052620019f281600262002396565b60c0015160601b6001600160601b0319166117605262001a1481600362002396565b60c0015160601b6001600160601b0319166117805262001a3681600462002396565b60c0015160601b6001600160601b0319166117a05262001a5881600562002396565b60c0015160601b6001600160601b0319166117c05262001a7a81600662002396565b60c0015160601b6001600160601b0319166117e05262001a9c81600762002396565b60c0015160601b6001600160601b0319166118005262001abe81600862002396565b60c0015160601b6001600160601b0319166118205262001ae081600962002396565b60c0015160601b6001600160601b0319166118405262001b0281600a62002396565b60c0015160601b6001600160601b0319166118605262001b2481600b62002396565b60c0015160601b6001600160601b0319166118805262001b4681600c62002396565b60c0015160601b6001600160601b0319166118a05262001b6881600d62002396565b60c0015160601b6001600160601b0319166118c05262001b8a81600e62002396565b60c0015160601b6001600160601b0319166118e05262001bac81600f62002396565b60c0015160601b6001600160601b0319166119005262001bce81601062002396565b60c0015160601b6001600160601b0319166119205262001bf081601162002396565b60c0015160601b6001600160601b0319166119405262001c1281601262002396565b60c0015160601b6001600160601b0319166119605262001c3481601362002396565b60c0015160601b6001600160601b0319166119805262001c5681601462002396565b60c0015160601b6001600160601b0319166119a05262001c7881601562002396565b60c0015160601b6001600160601b0319166119c05262001c9a81601662002396565b60c0015160601b6001600160601b0319166119e05262001cbc81601762002396565b60c0015160601b6001600160601b031916611a005262001cde81601862002396565b60c0015160601b6001600160601b031916611a205262001d0081601962002396565b60c0015160601b6001600160601b031916611a405262001d2281601a62002396565b60c0015160601b6001600160601b031916611a605262001d4481601b62002396565b60c0015160601b6001600160601b031916611a805262001d6681601c62002396565b60c0015160601b6001600160601b031916611aa05262001d8881601d62002396565b60c0015160601b6001600160601b031916611ac05262001daa81600062002396565b60e00151151560f81b611ae05262001dcd8160016001600160e01b036200239616565b60e00151151560f81b611b005262001df08160026001600160e01b036200239616565b60e00151151560f81b611b205262001e138160036001600160e01b036200239616565b60e00151151560f81b611b405262001e368160046001600160e01b036200239616565b60e00151151560f81b611b605262001e598160056001600160e01b036200239616565b60e00151151560f81b611b805262001e7c8160066001600160e01b036200239616565b60e00151151560f81b611ba05262001e9f8160076001600160e01b036200239616565b60e00151151560f81b611bc05262001ec28160086001600160e01b036200239616565b60e00151151560f81b611be05262001ee58160096001600160e01b036200239616565b60e00151151560f81b611c005262001f0881600a6001600160e01b036200239616565b60e00151151560f81b611c205262001f2b81600b6001600160e01b036200239616565b60e00151151560f81b611c405262001f4e81600c6001600160e01b036200239616565b60e00151151560f81b611c605262001f7181600d6001600160e01b036200239616565b60e00151151560f81b611c805262001f9481600e6001600160e01b036200239616565b60e00151151560f81b611ca05262001fb781600f6001600160e01b036200239616565b60e00151151560f81b611cc05262001fda8160106001600160e01b036200239616565b60e00151151560f81b611ce05262001ffd8160116001600160e01b036200239616565b60e00151151560f81b611d0052620020208160126001600160e01b036200239616565b60e00151151560f81b611d2052620020438160136001600160e01b036200239616565b60e00151151560f81b611d4052620020668160146001600160e01b036200239616565b60e00151151560f81b611d6052620020898160156001600160e01b036200239616565b60e00151151560f81b611d8052620020ac8160166001600160e01b036200239616565b60e00151151560f81b611da052620020cf8160176001600160e01b036200239616565b60e00151151560f81b611dc052620020f28160186001600160e01b036200239616565b60e00151151560f81b611de052620021158160196001600160e01b036200239616565b60e00151151560f81b611e00526200213881601a6001600160e01b036200239616565b60e00151151560f81b611e20526200215b81601b6001600160e01b036200239616565b60e00151151560f81b611e40526200217e81601c6001600160e01b036200239616565b60e00151151560f81b611e6052620021a181601d6001600160e01b036200239616565b60e00151151560f81b611e8052506001600160601b0319606086811b8216611ea05285901b16611ec052611f20829052670de0b6b3a7640000198311620021f35782670de0b6b3a764000001620021f7565b6000195b611ee052670de0b6b3a76400008310620022135760016200221f565b82670de0b6b3a7640000035b611f005260005b81518110156200238a576200223a620026e2565b8282815181106200224757fe5b602002602001015190506000816060015111620022785760405162461bcd60e51b81526004016200005b9062002976565b60c08101516002826080015160028111156200229057fe5b141562002355576001600160a01b038116620022c05760405162461bcd60e51b81526004016200005b90620029b8565b60408201516000620022db846001600160e01b036200241016565b600083815260026020908152604080832042808255600390935292819020828155600193840185905592909201839055905191925083917fe37d39315e3419c0937360f1ac88f2c52ecf67e3b22b367f82047ddb4591904a91620023459181908690819062002aa2565b60405180910390a250506200237f565b6001600160a01b038116156200237f5760405162461bcd60e51b81526004016200005b9062002a5c565b505060010162002226565b50505050505062002b33565b620023a0620026e2565b8251821015620023c757828281518110620023b757fe5b602002602001015190506200240a565b506040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091525b92915050565b60008060006200242f8460c001516200245260201b620034ec1760201c565b50915091508360e0015115620024495791506200244d9050565b5090505b919050565b60008080620024696001600160e01b036200265e16565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015620024a557600080fd5b505afa158015620024ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024e091906200295d565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b1580156200251c57600080fd5b505afa15801562002531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200255791906200295d565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156200259857600080fd5b505afa158015620025ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620025d3919062002903565b9250925092508363ffffffff168163ffffffff16146200265457600081850390508063ffffffff166200261284866200266860201b620036c11760201c565b600001516001600160e01b031602870196508063ffffffff166200264285856200266860201b620036c11760201c565b516001600160e01b0316029590950194505b5050509193909250565b63ffffffff421690565b6200267262002727565b6000826001600160701b0316116200269e5760405162461bcd60e51b81526004016200005b9062002a25565b6040805160208101909152806001600160701b038416600160701b600160e01b03607087901b1681620026cd57fe5b046001600160e01b0316815250905092915050565b60408051610100810182526000808252602082018190529181018290526060810182905290608082019081526000602082018190526040820181905260609091015290565b60408051602081019091526000815290565b80516200240a8162002b04565b805180151581146200240a57600080fd5b8051600381106200240a57600080fd5b60006101008083850312156200277b578182fd5b620027868162002abd565b9150508151620027968162002b04565b81526020820151620027a88162002b04565b806020830152506040820151604082015260608201516060820152620027d2836080840162002757565b608082015260a082015160a0820152620027f08360c0840162002739565b60c0820152620028048360e0840162002746565b60e082015292915050565b600080600080600060a0868803121562002827578081fd5b8551620028348162002b04565b80955050602080870151620028498162002b04565b6040880151606089015160808a015192975090955093506001600160401b0381111562002874578283fd5b80880189601f82011262002886578384fd5b805191506200289f620028998362002ae4565b62002abd565b82815283810190828501610100808602850187018e1015620028bf578788fd5b8794505b85851015620028ef57620028d88e8362002767565b8452600194909401939286019290810190620028c3565b505080955050505050509295509295909350565b60008060006060848603121562002918578283fd5b8351620029258162002b1d565b6020850151909350620029388162002b1d565b604085015190925063ffffffff8116811462002952578182fd5b809150509250925092565b6000602082840312156200296f578081fd5b5051919050565b60208082526022908201527f62617365556e6974206d7573742062652067726561746572207468616e207a65604082015261726f60f01b606082015260800190565b60208082526023908201527f7265706f7274656420707269636573206d757374206861766520616e20616e636040820152623437b960e91b606082015260800190565b60208082526010908201526f746f6f206d616e7920636f6e6669677360801b604082015260600190565b60208082526017908201527f4669786564506f696e743a204449565f42595f5a45524f000000000000000000604082015260600190565b60208082526026908201527f6f6e6c79207265706f7274656420707269636573207574696c697a6520616e2060408201526530b731b437b960d11b606082015260800190565b93845260208401929092526040830152606082015260800190565b6040518181016001600160401b038111828210171562002adc57600080fd5b604052919050565b60006001600160401b0382111562002afa578081fd5b5060209081020190565b6001600160a01b038116811462002b1a57600080fd5b50565b6001600160701b038116811462002b1a57600080fd5b60805160a05160601c60c05160601c60e05160601c6101005160601c6101205160601c6101405160601c6101605160601c6101805160601c6101a05160601c6101c05160601c6101e05160601c6102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c05160601c6102e05160601c6103005160601c6103205160601c6103405160601c6103605160601c6103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c6104405160601c6104605160601c6104805160601c6104a05160601c6104c05160601c6104e05160601c6105005160601c6105205160601c6105405160601c6105605160601c6105805160601c6105a05160601c6105c05160601c6105e05160601c6106005160601c6106205160601c6106405160601c6106605160601c6106805160601c6106a05160601c6106c05160601c6106e05160601c6107005160601c6107205160601c6107405160601c6107605160601c6107805160601c6107a05160601c6107c05160601c6107e05160601c6108005160601c610820516108405161086051610880516108a0516108c0516108e05161090051610920516109405161096051610980516109a0516109c0516109e051610a0051610a2051610a4051610a6051610a8051610aa051610ac051610ae051610b0051610b2051610b4051610b6051610b8051610ba051610bc051610be051610c0051610c2051610c4051610c6051610c8051610ca051610cc051610ce051610d0051610d2051610d4051610d6051610d8051610da051610dc051610de051610e0051610e2051610e4051610e6051610e8051610ea051610ec051610ee051610f0051610f2051610f4051610f6051610f8051610fa05160f81c610fc05160f81c610fe05160f81c6110005160f81c6110205160f81c6110405160f81c6110605160f81c6110805160f81c6110a05160f81c6110c05160f81c6110e05160f81c6111005160f81c6111205160f81c6111405160f81c6111605160f81c6111805160f81c6111a05160f81c6111c05160f81c6111e05160f81c6112005160f81c6112205160f81c6112405160f81c6112605160f81c6112805160f81c6112a05160f81c6112c05160f81c6112e05160f81c6113005160f81c6113205160f81c6113405160f81c61136051611380516113a0516113c0516113e05161140051611420516114405161146051611480516114a0516114c0516114e05161150051611520516115405161156051611580516115a0516115c0516115e05161160051611620516116405161166051611680516116a0516116c0516116e051611700516117205160601c6117405160601c6117605160601c6117805160601c6117a05160601c6117c05160601c6117e05160601c6118005160601c6118205160601c6118405160601c6118605160601c6118805160601c6118a05160601c6118c05160601c6118e05160601c6119005160601c6119205160601c6119405160601c6119605160601c6119805160601c6119a05160601c6119c05160601c6119e05160601c611a005160601c611a205160601c611a405160601c611a605160601c611a805160601c611aa05160601c611ac05160601c611ae05160f81c611b005160f81c611b205160f81c611b405160f81c611b605160f81c611b805160f81c611ba05160f81c611bc05160f81c611be05160f81c611c005160f81c611c205160f81c611c405160f81c611c605160f81c611c805160f81c611ca05160f81c611cc05160f81c611ce05160f81c611d005160f81c611d205160f81c611d405160f81c611d605160f81c611d805160f81c611da05160f81c611dc05160f81c611de05160f81c611e005160f81c611e205160f81c611e405160f81c611e605160f81c611e805160f81c611ea05160601c611ec05160601c611ee051611f0051611f2051615d5362003894600039806132b1528061523c5250806131c252806151b5525080610359528061518a5250806102e052806130db528061316a5280614d4952508061328852806133185280614d1a52508061302c525080612eba525080612d48525080612bd6525080612a645250806128f252508061278052508061260e52508061249c52508061232a5250806121b8525080612046525080611ed4525080611d62525080611bf0525080611a7e52508061190c52508061179a5250806116285250806114b65250806113445250806111d2525080611060525080610eee525080610d7c525080610c0a525080610a985250806109265250806107b4525080610642525080612ffd525080612e8b525080612d19525080612ba7525080612a355250806128c35250806127515250806125df52508061246d5250806122fb525080612189525080612017525080611ea5525080611d33525080611bc1525080611a4f5250806118dd52508061176b5250806115f95250806114875250806113155250806111a3525080611031525080610ebf525080610d4d525080610bdb525080610a695250806108f7525080610785525080610613525080612fd7525080612e65525080612cf3525080612b81525080612a0f52508061289d52508061272b5250806125b95250806124475250806122d5525080612163525080611ff1525080611e7f525080611d0d525080611b9b525080611a295250806118b75250806117455250806115d35250806114615250806112ef52508061117d52508061100b525080610e99525080610d27525080610bb5525080610a435250806108d152508061075f5250806105ed525080612fa6525080612e34525080612cc2525080612b505250806129de52508061286c5250806126fa5250806125885250806124165250806122a4525080612132525080611fc0525080611e4e525080611cdc525080611b6a5250806119f85250806118865250806117145250806115a25250806114305250806112be52508061114c525080610fda525080610e68525080610cf6525080610b84525080610a125250806108a052508061072e5250806105bc525080612f80525080612e0e525080612c9c525080612b2a5250806129b85250806128465250806126d45250806125625250806123f052508061227e52508061210c525080611f9a525080611e28525080611cb6525080611b445250806119d25250806118605250806116ee52508061157c52508061140a525080611298525080611126525080610fb4525080610e42525080610cd0525080610b5e5250806109ec52508061087a525080610708525080610596525080612f5a5280613cb0525080612de85280613c80525080612c765280613c50525080612b045280613c205250806129925280613bf05250806128205280613bc05250806126ae5280613b9052508061253c5280613b605250806123ca5280613b305250806122585280613b005250806120e65280613ad0525080611f745280613aa0525080611e025280613a70525080611c905280613a40525080611b1e5280613a105250806119ac52806139e052508061183a52806139b05250806116c8528061398052508061155652806139505250806113e4528061392052508061127252806138f052508061110052806138c0525080610f8e5280613890525080610e1c5280613860525080610caa5280613830525080610b3852806138005250806109c652806137d052508061085452806137a05250806106e252806137705250806105705280613740525080612f2b5280614465525080612db95280614423525080612c4752806143e1525080612ad5528061439f525080612963528061435d5250806127f1528061431b52508061267f52806142d952508061250d528061429752508061239b528061425552508061222952806142135250806120b752806141d1525080611f45528061418f525080611dd3528061414d525080611c61528061410b525080611aef52806140c952508061197d528061408752508061180b528061404552508061169952806140035250806115275280613fc15250806113b55280613f7f5250806112435280613f3d5250806110d15280613efb525080610f5f5280613eb9525080610ded5280613e77525080610c7b5280613e35525080610b095280613df35250806109975280613db15250806108255280613d6f5250806106b35280613d2d5250806105415280613ceb525080612efc5280614c23525080612d8a5280614be1525080612c185280614b9f525080612aa65280614b5d5250806129345280614b1b5250806127c25280614ad95250806126505280614a975250806124de5280614a5552508061236c5280614a135250806121fa52806149d1525080612088528061498f525080611f16528061494d525080611da4528061490b525080611c3252806148c9525080611ac0528061488752508061194e52806148455250806117dc528061480352508061166a52806147c15250806114f8528061477f525080611386528061473d52508061121452806146fb5250806110a252806146b9525080610f305280614677525080610dbe5280614635525080610c4c52806145f3525080610ada52806145b1525080610968528061456f5250806107f6528061452d52508061068452806144eb52508061051252806144a95250806104c2528061319e5250615d536000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80638aba91b4116100c3578063e83157421161007c578063e831574214610282578063e9206d781461028a578063eaa1c2ca14610292578063ecc1e984146102a5578063fc57d4df146102b8578063fe2c6198146102cb5761014d565b80638aba91b4146102425780638e499bcf1461025757806392b843571461025f5780639f59963114610267578063d1b353b414610227578063e61a5fe41461027a5761014d565b8063482a619311610115578063482a6193146101d95780634da21942146101ec57806360846bc6146101ff578063651ed7881461021257806369aa3ac6146102275780638a0038881461022f5761014d565b8063010ec441146101525780631a125204146101705780632410520914610190578063276c2cba146101a557806337c0e12d146101b8575b600080fd5b61015a6102de565b6040516101679190615842565b60405180910390f35b61018361017e36600461556e565b610302565b6040516101679190615b6b565b610198610357565b6040516101679190615be6565b6101836101b3366004615624565b61037b565b6101cb6101c636600461556e565b6103b8565b604051610167929190615bef565b61015a6101e73660046155c3565b6103d1565b6101836101fa3660046154a0565b61047e565b61019861020d36600461556e565b610491565b61021a6104a3565b604051610167919061587a565b6101986104ac565b61018361023d36600461556e565b6104b8565b6102556102503660046155c3565b613057565b005b61019861319c565b6101986131c0565b6101836102753660046154a0565b6131e4565b61015a613286565b6101986132aa565b6101986132af565b6101cb6102a036600461556e565b6132d3565b6102556102b33660046154d8565b6132ec565b6101986102c63660046154a0565b613486565b6101986102d9366004615624565b6134ce565b7f000000000000000000000000000000000000000000000000000000000000000081565b61030a615346565b60006103158361373c565b9050600019811461033157610329816104b8565b915050610352565b60405162461bcd60e51b815260040161034990615982565b60405180910390fd5b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610383615346565b6103b28260405160200161039791906157d4565b60405160208183030381529060405280519060200120610302565b92915050565b6002602052600090815260409020805460019091015482565b600080600080848060200190518101906103eb9190615586565b9250925092506000868051906020012060405160200161040b91906157f0565b604051602081830303815290604052805190602001209050600181838686604051600081526020016040526040516104469493929190615885565b6020604051602081039080840390855afa158015610468573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b610486615346565b600061031583613ce7565b60006020819052908152604090205481565b60015460ff1681565b670de0b6b3a764000081565b6104c0615346565b7f000000000000000000000000000000000000000000000000000000000000000082106104ff5760405162461bcd60e51b815260040161034990615982565b8161066d576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156105e657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600114156107df576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561075857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160021415610951576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156108ca57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160031415610ac3576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115610a3c57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160041415610c35576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115610bae57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160051415610da7576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115610d2057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160061415610f19576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115610e9257fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b816007141561108b576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561100457fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600814156111fd576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561117657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b816009141561136f576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156112e857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600a14156114e1576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561145a57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600b1415611653576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156115cc57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600c14156117c5576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561173e57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600d1415611937576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156118b057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600e1415611aa9576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611a2257fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600f1415611c1b576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611b9457fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160101415611d8d576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611d0657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160111415611eff576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611e7857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160121415612071576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611fea57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601314156121e3576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561215c57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160141415612355576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156122ce57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601514156124c7576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561244057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160161415612639576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156125b257fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601714156127ab576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561272457fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b816018141561291d576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561289657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160191415612a8f576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612a0857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601a1415612c01576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612b7a57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601b1415612d73576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612cec57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601c1415612ee5576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612e5e57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601d1415610352576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612fd057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b60608280602001905181019061306d9190615692565b50905060405160200161307f90615821565b60405160208183030381529060405280519060200120816040516020016130a691906157d4565b60405160208183030381529060405280519060200120146130d95760405162461bcd60e51b815260040161034990615a70565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661310d84846103d1565b6001600160a01b0316146131335760405162461bcd60e51b8152600401610349906159b2565b6001805460ff1916811790556040517f98a13f7b181a3a1f99c871e7a3507d4a037d386d157279f978e0d555ae9fe74d9061318f907f000000000000000000000000000000000000000000000000000000000000000090615842565b60405180910390a1505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6131ec615346565b60006131f7836144a5565b9050600019811461320b57610329816104b8565b61327f836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561324757600080fd5b505afa15801561325b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101fa91906154bc565b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601e81565b7f000000000000000000000000000000000000000000000000000000000000000081565b6003602052600090815260409020805460019091015482565b84831461330b5760405162461bcd60e51b815260040161034990615af1565b60005b858110156133ff577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166338636e9a88888481811061335157fe5b90506020028101906133639190615c18565b88888681811061336f57fe5b90506020028101906133819190615c18565b6040518563ffffffff1660e01b81526004016133a094939291906158a3565b600060405180830381600087803b1580156133ba57600080fd5b505af11580156133ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133f6919081019061565f565b5060010161330e565b50600061340a614c63565b905060005b8281101561347c5761347484848381811061342657fe5b90506020028101906134389190615c5f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250614ca9915050565b60010161340f565b5050505050505050565b6000613490615346565b613499836131e4565b905080606001516134bf6c0c9f2c9cd04674edea400000006134ba84614f16565b615005565b816134c657fe5b049392505050565b60006134d8615346565b6134e18361037b565b905061327f81614f16565b60008060006134f961503f565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b15801561353457600080fd5b505afa158015613548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356c919061572b565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b1580156135a757600080fd5b505afa1580156135bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135df919061572b565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561361f57600080fd5b505afa158015613633573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061365791906156e2565b9250925092508363ffffffff168163ffffffff16146136b75780840363ffffffff811661368484866136c1565b516001600160e01b031602969096019563ffffffff81166136a585856136c1565b516001600160e01b0316029590950194505b5050509193909250565b6136c961538b565b6000826001600160701b0316116136f25760405162461bcd60e51b815260040161034990615b34565b6040805160208101909152806001600160701b0384166dffffffffffffffffffffffffffff60701b607087901b168161372757fe5b046001600160e01b0316815250905092915050565b60007f000000000000000000000000000000000000000000000000000000000000000082141561376e57506000610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561379e57506001610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156137ce57506002610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156137fe57506003610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561382e57506004610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561385e57506005610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561388e57506006610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156138be57506007610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156138ee57506008610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561391e57506009610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561394e5750600a610352565b7f000000000000000000000000000000000000000000000000000000000000000082141561397e5750600b610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156139ae5750600c610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156139de5750600d610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a0e5750600e610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a3e5750600f610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a6e57506010610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a9e57506011610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613ace57506012610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613afe57506013610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b2e57506014610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b5e57506015610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b8e57506016610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613bbe57506017610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613bee57506018610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613c1e57506019610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613c4e5750601a610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613c7e5750601b610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613cae5750601c610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613cde5750601d610352565b50600019919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613d2b57506000610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613d6d57506001610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613daf57506002610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613df157506003610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613e3357506004610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613e7557506005610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613eb757506006610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613ef957506007610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613f3b57506008610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613f7d57506009610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613fbf5750600a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140015750600b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140435750600c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140855750600d610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140c75750600e610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156141095750600f610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561414b57506010610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561418d57506011610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156141cf57506012610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561421157506013610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561425357506014610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561429557506015610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156142d757506016610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561431957506017610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561435b57506018610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561439d57506019610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156143df5750601a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156144215750601b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156144635750601c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613cde5750601d610352565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156144e957506000610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561452b57506001610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561456d57506002610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156145af57506003610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156145f157506004610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561463357506005610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561467557506006610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156146b757506007610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156146f957506008610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561473b57506009610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561477d5750600a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156147bf5750600b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148015750600c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148435750600d610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148855750600e610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148c75750600f610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561490957506010610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561494b57506011610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561498d57506012610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156149cf57506013610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a1157506014610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a5357506015610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a9557506016610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614ad757506017610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b1957506018610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b5b57506019610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b9d5750601a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614bdf5750601b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614c215750601c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613cde5750601d610352565b6000614ca46040518060400160405280600381526020016208aa8960eb1b815250614c9660405160200161039790615833565b670de0b6b3a7640000615049565b905090565b614cb1615346565b614cba8361037b565b9050600281608001516002811115614cce57fe5b14614ceb5760405162461bcd60e51b815260040161034990615a02565b600083604051602001614cfe91906157d4565b60405160208183030381529060405280519060200120905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166376977a3a7f0000000000000000000000000000000000000000000000000000000000000000876040518363ffffffff1660e01b8152600401614d86929190615856565b60206040518083038186803b158015614d9e57600080fd5b505afa158015614db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dd69190615743565b67ffffffffffffffff1690506000604051602001614df390615833565b60405160208183030381529060405280519060200120831415614e17575083614e25565b614e22868587615049565b90505b60015460ff1615614e805760008381526020819052604090819020829055517f159e83f4712ba2552e68be9d848e49bf6dd35c24f19564ffd523b6549450a2f490614e7390889084906158d5565b60405180910390a1614f0e565b614e8a8282615161565b15614ed25760008381526020819052604090819020839055517f159e83f4712ba2552e68be9d848e49bf6dd35c24f19564ffd523b6549450a2f490614e7390889085906158d5565b7f90756d4c8646a4591078abac0e4e32dfa8437921729e36d51b88b659d265bfde868383604051614f05939291906158f7565b60405180910390a15b505050505050565b6000600282608001516002811115614f2a57fe5b1415614f485750604080820151600090815260208190522054610352565b600182608001516002811115614f5a57fe5b1415614f6b575060a0810151610352565b600082608001516002811115614f7d57fe5b1415610352576000806000604051602001614f9790615833565b60405160208183030381529060405280519060200120815260200190815260200160002054905060008111614fde5760405162461bcd60e51b815260040161034990615aa5565b670de0b6b3a7640000614ff5828560a00151615005565b81614ffc57fe5b04915050610352565b600082615014575060006103b2565b8282028284828161502157fe5b041461327f5760405162461bcd60e51b81526004016103499061594b565b63ffffffff421690565b600080600080615058866151e9565b92509250925080421161507d5760405162461bcd60e51b815260040161034990615a39565b4281900361508961538b565b6040518060200160405280838688038161509f57fe5b046001600160e01b0316815250905060006150b9826152fc565b905060006150c7828a615005565b905060008a60e00151156150ea578a6060015182816150e257fe5b049050615115565b670de0b6b3a764000080615102848e60600151615005565b8161510957fe5b048161511157fe5b0490505b7ff63d078e0de851897107641e96093a59e5ddc3c25e7b85a2585e3eba9e774a7b8c82884260405161514a949392919061591c565b60405180910390a19b9a5050505050505050505050565b600082156151e05760008361517e84670de0b6b3a7640000615005565b8161518557fe5b0490507f000000000000000000000000000000000000000000000000000000000000000081111580156151d857507f00000000000000000000000000000000000000000000000000000000000000008110155b9150506103b2565b50600092915050565b60008060008084604001519050600061520186615314565b905061520b61539d565b50600082815260036020908152604091829020825180840190935280548084526001909101549183019190915242037f000000000000000000000000000000000000000000000000000000000000000081106152d7578151600085815260026020908152604080832093845581860180516001958601556003909252918290204280825593018690558a82015185519151925190937fe37d39315e3419c0937360f1ac88f2c52ecf67e3b22b367f82047ddb4591904a936152ce93928990615bfd565b60405180910390a25b5050600091825260026020526040909120600181015490549196909550909350915050565b516612725dd1d243ab6001600160e01b039091160490565b60008060006153268460c001516134ec565b50915091508360e001511561533e5791506103529050565b509050610352565b60408051610100810182526000808252602082018190529181018290526060810182905290608082019081526000602082018190526040820181905260609091015290565b60408051602081019091526000815290565b604051806040016040528060008152602001600081525090565b60008083601f8401126153c8578182fd5b50813567ffffffffffffffff8111156153df578182fd5b60208301915083602080830285010111156153f957600080fd5b9250929050565b600082601f830112615410578081fd5b813561542361541e82615c9c565b615c75565b915080825283602082850101111561543a57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112615463578081fd5b815161547161541e82615c9c565b915080825283602082850101111561548857600080fd5b615499816020840160208601615cc0565b5092915050565b6000602082840312156154b1578081fd5b813561327f81615cf0565b6000602082840312156154cd578081fd5b815161327f81615cf0565b600080600080600080606087890312156154f0578182fd5b863567ffffffffffffffff80821115615507578384fd5b6155138a838b016153b7565b9098509650602089013591508082111561552b578384fd5b6155378a838b016153b7565b9096509450604089013591508082111561554f578384fd5b5061555c89828a016153b7565b979a9699509497509295939492505050565b60006020828403121561557f578081fd5b5035919050565b60008060006060848603121561559a578283fd5b8351925060208401519150604084015160ff811681146155b8578182fd5b809150509250925092565b600080604083850312156155d5578182fd5b823567ffffffffffffffff808211156155ec578384fd5b6155f886838701615400565b9350602085013591508082111561560d578283fd5b5061561a85828601615400565b9150509250929050565b600060208284031215615635578081fd5b813567ffffffffffffffff81111561564b578182fd5b61565784828501615400565b949350505050565b600060208284031215615670578081fd5b815167ffffffffffffffff811115615686578182fd5b61565784828501615453565b600080604083850312156156a4578182fd5b825167ffffffffffffffff8111156156ba578283fd5b6156c685828601615453565b92505060208301516156d781615cf0565b809150509250929050565b6000806000606084860312156156f6578283fd5b835161570181615d08565b602085015190935061571281615d08565b604085015190925063ffffffff811681146155b8578182fd5b60006020828403121561573c578081fd5b5051919050565b600060208284031215615754578081fd5b815167ffffffffffffffff8116811461327f578182fd5b6001600160a01b03169052565b15159052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526157c0816020860160208601615cc0565b601f01601f19169290920160200192915050565b600082516157e6818460208701615cc0565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b65726f7461746560d01b815260060190565b6208aa8960eb1b815260030190565b6001600160a01b0391909116815260200190565b6001600160a01b0383168152604060208201819052600090615657908301846157a8565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000604082526158b760408301868861577e565b82810360208401526158ca81858761577e565b979650505050505050565b6000604082526158e860408301856157a8565b90508260208301529392505050565b60006060825261590a60608301866157a8565b60208301949094525060400152919050565b60006080825261592f60808301876157a8565b6020830195909552506040810192909252606090910152919050565b60208082526017908201527f6d756c7469706c69636174696f6e206f766572666c6f77000000000000000000604082015260600190565b6020808252601690820152751d1bdad95b8818dbdb999a59c81b9bdd08199bdd5b9960521b604082015260600190565b60208082526030908201527f696e76616c69646174696f6e206d657373616765206d75737420636f6d65206660408201526f3937b6903a3432903932b837b93a32b960811b606082015260800190565b6020808252601f908201527f6f6e6c79207265706f72746572207072696365732067657420706f7374656400604082015260600190565b6020808252601a908201527f6e6f77206d75737420636f6d65206166746572206265666f7265000000000000604082015260600190565b6020808252818101527f696e76616c6964206d657373616765206d7573742062652027726f7461746527604082015260600190565b6020808252602c908201527f455448207072696365206e6f74207365742c2063616e6e6f7420636f6e76657260408201526b7420746f20646f6c6c61727360a01b606082015260800190565b60208082526023908201527f6d6573736167657320616e64207369676e617475726573206d75737420626520604082015262313a3160e81b606082015260800190565b60208082526017908201527f4669786564506f696e743a204449565f42595f5a45524f000000000000000000604082015260600190565b81516001600160a01b039081168252602080840151909116908201526040808301519082015260608083015190820152608082015161010082019060038110615bb057fe5b8060808401525060a083015160a083015260c0830151615bd360c084018261576b565b5060e083015161549960e0840182615778565b90815260200190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b6000808335601e19843603018112615c2e578283fd5b8084018035925067ffffffffffffffff831115615c49578384fd5b602001925050368190038213156153f957600080fd5b6000808335601e19843603018112615c2e578182fd5b60405181810167ffffffffffffffff81118282101715615c9457600080fd5b604052919050565b600067ffffffffffffffff821115615cb2578081fd5b50601f01601f191660200190565b60005b83811015615cdb578181015183820152602001615cc3565b83811115615cea576000848401525b50505050565b6001600160a01b0381168114615d0557600080fd5b50565b6001600160701b0381168114615d0557600080fdfea26469706673582212208c2a73bb54dfe5f38570c033928b1040c23a175021e768c6af478edcf88cf76164736f6c634300060a0033000000000000000000000000c629c26dced4277419cde234012f8160a0278a79000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc00000000000000000000000000000000000000000000000002c68af0bb140000000000000000000000000000000000000000000000000000000000000000070800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed50000000000000000000000000000000000000000000000000000000000000000aaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff40000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc00000000000000000000000000000000000000000000000000000000000000010000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36430000000000000000000000006b175474e89094c44da98b954eedeac495271d0fa5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e5680000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039aa39c021dfbae8fac545936693ac917d5e7563000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48d6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa00000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f650c3d88d12db855b8bf7d11be6c55a4e07dcc9000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec78b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c11b1268c1a384e55c48c2391d8d480264a3a7f40000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599e98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e90000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d94000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db550000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6909b960dbbe7392d405429eb2b3649752b48380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3319f5d18bc0d84dd1b4825dcde5d5f7266d407000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498b8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6f348dd3b91a56d117ec0071c1e9b83c0996de40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000158079ee67fce2f58472a96584a73c7ab9ac95c10000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e86291a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee95040000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec2d2240d02a8cf63c3fa0b7d2c5a3169a3194960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a232603594dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c5320000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012c6adf3a35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888b6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab4540000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cffdded873554f362ac02f8fb1f02e5ada10516f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a7790000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2107fa5b38d9bbd2c461d6edf11b11a50f6b97400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd200e44e7f628ff17b7c7961d3f0150b75ab99038e99c1bfc32d5721c1ca23747cbc0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f49c43ae0faf37217bdcb00df478cf793edd66870000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80638aba91b4116100c3578063e83157421161007c578063e831574214610282578063e9206d781461028a578063eaa1c2ca14610292578063ecc1e984146102a5578063fc57d4df146102b8578063fe2c6198146102cb5761014d565b80638aba91b4146102425780638e499bcf1461025757806392b843571461025f5780639f59963114610267578063d1b353b414610227578063e61a5fe41461027a5761014d565b8063482a619311610115578063482a6193146101d95780634da21942146101ec57806360846bc6146101ff578063651ed7881461021257806369aa3ac6146102275780638a0038881461022f5761014d565b8063010ec441146101525780631a125204146101705780632410520914610190578063276c2cba146101a557806337c0e12d146101b8575b600080fd5b61015a6102de565b6040516101679190615842565b60405180910390f35b61018361017e36600461556e565b610302565b6040516101679190615b6b565b610198610357565b6040516101679190615be6565b6101836101b3366004615624565b61037b565b6101cb6101c636600461556e565b6103b8565b604051610167929190615bef565b61015a6101e73660046155c3565b6103d1565b6101836101fa3660046154a0565b61047e565b61019861020d36600461556e565b610491565b61021a6104a3565b604051610167919061587a565b6101986104ac565b61018361023d36600461556e565b6104b8565b6102556102503660046155c3565b613057565b005b61019861319c565b6101986131c0565b6101836102753660046154a0565b6131e4565b61015a613286565b6101986132aa565b6101986132af565b6101cb6102a036600461556e565b6132d3565b6102556102b33660046154d8565b6132ec565b6101986102c63660046154a0565b613486565b6101986102d9366004615624565b6134ce565b7f000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc81565b61030a615346565b60006103158361373c565b9050600019811461033157610329816104b8565b915050610352565b60405162461bcd60e51b815260040161034990615982565b60405180910390fd5b919050565b7f00000000000000000000000000000000000000000000000010a741a46278000081565b610383615346565b6103b28260405160200161039791906157d4565b60405160208183030381529060405280519060200120610302565b92915050565b6002602052600090815260409020805460019091015482565b600080600080848060200190518101906103eb9190615586565b9250925092506000868051906020012060405160200161040b91906157f0565b604051602081830303815290604052805190602001209050600181838686604051600081526020016040526040516104469493929190615885565b6020604051602081039080840390855afa158015610468573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b610486615346565b600061031583613ce7565b60006020819052908152604090205481565b60015460ff1681565b670de0b6b3a764000081565b6104c0615346565b7f000000000000000000000000000000000000000000000000000000000000000c82106104ff5760405162461bcd60e51b815260040161034990615982565b8161066d576040518061010001604052807f0000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed56001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017faaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff481526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f000000000000000000000000000000000000000000000000000000000000000260028111156105e657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc6001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000115158152509050610352565b81600114156107df576040518061010001604052807f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031681526020017f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b031681526020017fa5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e56881526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f0000000000000000000000000000000000000000000000000000000000000002600281111561075857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb116001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160021415610951576040518061010001604052807f00000000000000000000000039aa39c021dfbae8fac545936693ac917d5e75636001600160a01b031681526020017f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b031681526020017fd6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa81526020017f00000000000000000000000000000000000000000000000000000000000f424081526020017f000000000000000000000000000000000000000000000000000000000000000160028111156108ca57fe5b81526020017f00000000000000000000000000000000000000000000000000000000000f424081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160031415610ac3576040518061010001604052807f000000000000000000000000f650c3d88d12db855b8bf7d11be6c55a4e07dcc96001600160a01b031681526020017f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b031681526020017f8b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d081526020017f00000000000000000000000000000000000000000000000000000000000f424081526020017f00000000000000000000000000000000000000000000000000000000000000016002811115610a3c57fe5b81526020017f00000000000000000000000000000000000000000000000000000000000f424081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160041415610c35576040518061010001604052807f000000000000000000000000c11b1268c1a384e55c48c2391d8d480264a3a7f46001600160a01b031681526020017f0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5996001600160a01b031681526020017fe98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e981526020017f0000000000000000000000000000000000000000000000000000000005f5e10081526020017f00000000000000000000000000000000000000000000000000000000000000026002811115610bae57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d9406001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160051415610da7576040518061010001604052807f0000000000000000000000006c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e6001600160a01b031681526020017f0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef6001600160a01b031681526020017f3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db5581526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f00000000000000000000000000000000000000000000000000000000000000026002811115610d2057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000b6909b960dbbe7392d405429eb2b3649752b48386001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160061415610f19576040518061010001604052807f000000000000000000000000b3319f5d18bc0d84dd1b4825dcde5d5f7266d4076001600160a01b031681526020017f000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f4986001600160a01b031681526020017fb8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd81526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f00000000000000000000000000000000000000000000000000000000000000026002811115610e9257fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000c6f348dd3b91a56d117ec0071c1e9b83c0996de46001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000115158152509050610352565b816007141561108b576040518061010001604052807f000000000000000000000000158079ee67fce2f58472a96584a73c7ab9ac95c16001600160a01b031681526020017f0000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e8626001600160a01b031681526020017f91a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee950481526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f0000000000000000000000000000000000000000000000000000000000000002600281111561100457fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000ec2d2240d02a8cf63c3fa0b7d2c5a3169a3194966001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600814156111fd576040518061010001604052807f000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc6001600160a01b031681526020017f00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a232603596001600160a01b031681526020017f4dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c53281526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561117657fe5b81526020017f0000000000000000000000000000000000000000000000000012c6adf3a3500081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b816009141561136f576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000c00e94cb662c3520282e6f5717214004a7f268886001600160a01b031681526020017fb6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab45481526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f000000000000000000000000000000000000000000000000000000000000000260028111156112e857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000cffdded873554f362ac02f8fb1f02e5ada10516f6001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600a14156114e1576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b031681526020017f921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a77981526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f0000000000000000000000000000000000000000000000000000000000000002600281111561145a57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000a2107fa5b38d9bbd2c461d6edf11b11a50f6b9746001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600b1415611653576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd2006001600160a01b031681526020017fe44e7f628ff17b7c7961d3f0150b75ab99038e99c1bfc32d5721c1ca23747cbc81526020017f0000000000000000000000000000000000000000000000000de0b6b3a764000081526020017f000000000000000000000000000000000000000000000000000000000000000260028111156115cc57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000f49c43ae0faf37217bdcb00df478cf793edd66876001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000115158152509050610352565b81600c14156117c5576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561173e57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600d1415611937576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156118b057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600e1415611aa9576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611a2257fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81600f1415611c1b576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611b9457fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160101415611d8d576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611d0657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160111415611eff576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611e7857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160121415612071576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115611fea57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601314156121e3576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561215c57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160141415612355576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156122ce57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601514156124c7576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561244057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160161415612639576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000060028111156125b257fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601714156127ab576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561272457fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b816018141561291d576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000600281111561289657fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b8160191415612a8f576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612a0857fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601a1415612c01576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612b7a57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601b1415612d73576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612cec57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601c1415612ee5576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612e5e57fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b81601d1415610352576040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006002811115612fd057fe5b81526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000015158152509050610352565b60608280602001905181019061306d9190615692565b50905060405160200161307f90615821565b60405160208183030381529060405280519060200120816040516020016130a691906157d4565b60405160208183030381529060405280519060200120146130d95760405162461bcd60e51b815260040161034990615a70565b7f000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc6001600160a01b031661310d84846103d1565b6001600160a01b0316146131335760405162461bcd60e51b8152600401610349906159b2565b6001805460ff1916811790556040517f98a13f7b181a3a1f99c871e7a3507d4a037d386d157279f978e0d555ae9fe74d9061318f907f000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc90615842565b60405180910390a1505050565b7f000000000000000000000000000000000000000000000000000000000000000c81565b7f0000000000000000000000000000000000000000000000000b1a2bc2ec50000081565b6131ec615346565b60006131f7836144a5565b9050600019811461320b57610329816104b8565b61327f836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561324757600080fd5b505afa15801561325b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101fa91906154bc565b9392505050565b7f000000000000000000000000c629c26dced4277419cde234012f8160a0278a7981565b601e81565b7f000000000000000000000000000000000000000000000000000000000000070881565b6003602052600090815260409020805460019091015482565b84831461330b5760405162461bcd60e51b815260040161034990615af1565b60005b858110156133ff577f000000000000000000000000c629c26dced4277419cde234012f8160a0278a796001600160a01b03166338636e9a88888481811061335157fe5b90506020028101906133639190615c18565b88888681811061336f57fe5b90506020028101906133819190615c18565b6040518563ffffffff1660e01b81526004016133a094939291906158a3565b600060405180830381600087803b1580156133ba57600080fd5b505af11580156133ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133f6919081019061565f565b5060010161330e565b50600061340a614c63565b905060005b8281101561347c5761347484848381811061342657fe5b90506020028101906134389190615c5f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250614ca9915050565b60010161340f565b5050505050505050565b6000613490615346565b613499836131e4565b905080606001516134bf6c0c9f2c9cd04674edea400000006134ba84614f16565b615005565b816134c657fe5b049392505050565b60006134d8615346565b6134e18361037b565b905061327f81614f16565b60008060006134f961503f565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b15801561353457600080fd5b505afa158015613548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356c919061572b565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b1580156135a757600080fd5b505afa1580156135bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135df919061572b565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561361f57600080fd5b505afa158015613633573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061365791906156e2565b9250925092508363ffffffff168163ffffffff16146136b75780840363ffffffff811661368484866136c1565b516001600160e01b031602969096019563ffffffff81166136a585856136c1565b516001600160e01b0316029590950194505b5050509193909250565b6136c961538b565b6000826001600160701b0316116136f25760405162461bcd60e51b815260040161034990615b34565b6040805160208101909152806001600160701b0384166dffffffffffffffffffffffffffff60701b607087901b168161372757fe5b046001600160e01b0316815250905092915050565b60007faaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff482141561376e57506000610352565b7fa5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e56882141561379e57506001610352565b7fd6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa8214156137ce57506002610352565b7f8b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d08214156137fe57506003610352565b7fe98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e982141561382e57506004610352565b7f3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db5582141561385e57506005610352565b7fb8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd82141561388e57506006610352565b7f91a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee95048214156138be57506007610352565b7f4dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c5328214156138ee57506008610352565b7fb6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab45482141561391e57506009610352565b7f921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a77982141561394e5750600a610352565b7fe44e7f628ff17b7c7961d3f0150b75ab99038e99c1bfc32d5721c1ca23747cbc82141561397e5750600b610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156139ae5750600c610352565b7f00000000000000000000000000000000000000000000000000000000000000008214156139de5750600d610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a0e5750600e610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a3e5750600f610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a6e57506010610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613a9e57506011610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613ace57506012610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613afe57506013610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b2e57506014610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b5e57506015610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613b8e57506016610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613bbe57506017610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613bee57506018610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613c1e57506019610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613c4e5750601a610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613c7e5750601b610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613cae5750601c610352565b7f0000000000000000000000000000000000000000000000000000000000000000821415613cde5750601d610352565b50600019919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613d2b57506000610352565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316826001600160a01b03161415613d6d57506001610352565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316826001600160a01b03161415613daf57506002610352565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b0316826001600160a01b03161415613df157506003610352565b7f0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5996001600160a01b0316826001600160a01b03161415613e3357506004610352565b7f0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef6001600160a01b0316826001600160a01b03161415613e7557506005610352565b7f000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f4986001600160a01b0316826001600160a01b03161415613eb757506006610352565b7f0000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e8626001600160a01b0316826001600160a01b03161415613ef957506007610352565b7f00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a232603596001600160a01b0316826001600160a01b03161415613f3b57506008610352565b7f000000000000000000000000c00e94cb662c3520282e6f5717214004a7f268886001600160a01b0316826001600160a01b03161415613f7d57506009610352565b7f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b0316826001600160a01b03161415613fbf5750600a610352565b7f000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd2006001600160a01b0316826001600160a01b031614156140015750600b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140435750600c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140855750600d610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156140c75750600e610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156141095750600f610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561414b57506010610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561418d57506011610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156141cf57506012610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561421157506013610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561425357506014610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561429557506015610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156142d757506016610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561431957506017610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561435b57506018610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561439d57506019610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156143df5750601a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156144215750601b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156144635750601c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613cde5750601d610352565b60007f0000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed56001600160a01b0316826001600160a01b031614156144e957506000610352565b7f0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b0316826001600160a01b0316141561452b57506001610352565b7f00000000000000000000000039aa39c021dfbae8fac545936693ac917d5e75636001600160a01b0316826001600160a01b0316141561456d57506002610352565b7f000000000000000000000000f650c3d88d12db855b8bf7d11be6c55a4e07dcc96001600160a01b0316826001600160a01b031614156145af57506003610352565b7f000000000000000000000000c11b1268c1a384e55c48c2391d8d480264a3a7f46001600160a01b0316826001600160a01b031614156145f157506004610352565b7f0000000000000000000000006c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e6001600160a01b0316826001600160a01b0316141561463357506005610352565b7f000000000000000000000000b3319f5d18bc0d84dd1b4825dcde5d5f7266d4076001600160a01b0316826001600160a01b0316141561467557506006610352565b7f000000000000000000000000158079ee67fce2f58472a96584a73c7ab9ac95c16001600160a01b0316826001600160a01b031614156146b757506007610352565b7f000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc6001600160a01b0316826001600160a01b031614156146f957506008610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561473b57506009610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561477d5750600a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156147bf5750600b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148015750600c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148435750600d610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148855750600e610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156148c75750600f610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561490957506010610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561494b57506011610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561498d57506012610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156149cf57506013610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a1157506014610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a5357506015610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614a9557506016610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614ad757506017610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b1957506018610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b5b57506019610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614b9d5750601a610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614bdf5750601b610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415614c215750601c610352565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415613cde5750601d610352565b6000614ca46040518060400160405280600381526020016208aa8960eb1b815250614c9660405160200161039790615833565b670de0b6b3a7640000615049565b905090565b614cb1615346565b614cba8361037b565b9050600281608001516002811115614cce57fe5b14614ceb5760405162461bcd60e51b815260040161034990615a02565b600083604051602001614cfe91906157d4565b60405160208183030381529060405280519060200120905060007f000000000000000000000000c629c26dced4277419cde234012f8160a0278a796001600160a01b03166376977a3a7f000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc876040518363ffffffff1660e01b8152600401614d86929190615856565b60206040518083038186803b158015614d9e57600080fd5b505afa158015614db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dd69190615743565b67ffffffffffffffff1690506000604051602001614df390615833565b60405160208183030381529060405280519060200120831415614e17575083614e25565b614e22868587615049565b90505b60015460ff1615614e805760008381526020819052604090819020829055517f159e83f4712ba2552e68be9d848e49bf6dd35c24f19564ffd523b6549450a2f490614e7390889084906158d5565b60405180910390a1614f0e565b614e8a8282615161565b15614ed25760008381526020819052604090819020839055517f159e83f4712ba2552e68be9d848e49bf6dd35c24f19564ffd523b6549450a2f490614e7390889085906158d5565b7f90756d4c8646a4591078abac0e4e32dfa8437921729e36d51b88b659d265bfde868383604051614f05939291906158f7565b60405180910390a15b505050505050565b6000600282608001516002811115614f2a57fe5b1415614f485750604080820151600090815260208190522054610352565b600182608001516002811115614f5a57fe5b1415614f6b575060a0810151610352565b600082608001516002811115614f7d57fe5b1415610352576000806000604051602001614f9790615833565b60405160208183030381529060405280519060200120815260200190815260200160002054905060008111614fde5760405162461bcd60e51b815260040161034990615aa5565b670de0b6b3a7640000614ff5828560a00151615005565b81614ffc57fe5b04915050610352565b600082615014575060006103b2565b8282028284828161502157fe5b041461327f5760405162461bcd60e51b81526004016103499061594b565b63ffffffff421690565b600080600080615058866151e9565b92509250925080421161507d5760405162461bcd60e51b815260040161034990615a39565b4281900361508961538b565b6040518060200160405280838688038161509f57fe5b046001600160e01b0316815250905060006150b9826152fc565b905060006150c7828a615005565b905060008a60e00151156150ea578a6060015182816150e257fe5b049050615115565b670de0b6b3a764000080615102848e60600151615005565b8161510957fe5b048161511157fe5b0490505b7ff63d078e0de851897107641e96093a59e5ddc3c25e7b85a2585e3eba9e774a7b8c82884260405161514a949392919061591c565b60405180910390a19b9a5050505050505050505050565b600082156151e05760008361517e84670de0b6b3a7640000615005565b8161518557fe5b0490507f00000000000000000000000000000000000000000000000010a741a46278000081111580156151d857507f0000000000000000000000000000000000000000000000000b1a2bc2ec5000008110155b9150506103b2565b50600092915050565b60008060008084604001519050600061520186615314565b905061520b61539d565b50600082815260036020908152604091829020825180840190935280548084526001909101549183019190915242037f000000000000000000000000000000000000000000000000000000000000070881106152d7578151600085815260026020908152604080832093845581860180516001958601556003909252918290204280825593018690558a82015185519151925190937fe37d39315e3419c0937360f1ac88f2c52ecf67e3b22b367f82047ddb4591904a936152ce93928990615bfd565b60405180910390a25b5050600091825260026020526040909120600181015490549196909550909350915050565b516612725dd1d243ab6001600160e01b039091160490565b60008060006153268460c001516134ec565b50915091508360e001511561533e5791506103529050565b509050610352565b60408051610100810182526000808252602082018190529181018290526060810182905290608082019081526000602082018190526040820181905260609091015290565b60408051602081019091526000815290565b604051806040016040528060008152602001600081525090565b60008083601f8401126153c8578182fd5b50813567ffffffffffffffff8111156153df578182fd5b60208301915083602080830285010111156153f957600080fd5b9250929050565b600082601f830112615410578081fd5b813561542361541e82615c9c565b615c75565b915080825283602082850101111561543a57600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112615463578081fd5b815161547161541e82615c9c565b915080825283602082850101111561548857600080fd5b615499816020840160208601615cc0565b5092915050565b6000602082840312156154b1578081fd5b813561327f81615cf0565b6000602082840312156154cd578081fd5b815161327f81615cf0565b600080600080600080606087890312156154f0578182fd5b863567ffffffffffffffff80821115615507578384fd5b6155138a838b016153b7565b9098509650602089013591508082111561552b578384fd5b6155378a838b016153b7565b9096509450604089013591508082111561554f578384fd5b5061555c89828a016153b7565b979a9699509497509295939492505050565b60006020828403121561557f578081fd5b5035919050565b60008060006060848603121561559a578283fd5b8351925060208401519150604084015160ff811681146155b8578182fd5b809150509250925092565b600080604083850312156155d5578182fd5b823567ffffffffffffffff808211156155ec578384fd5b6155f886838701615400565b9350602085013591508082111561560d578283fd5b5061561a85828601615400565b9150509250929050565b600060208284031215615635578081fd5b813567ffffffffffffffff81111561564b578182fd5b61565784828501615400565b949350505050565b600060208284031215615670578081fd5b815167ffffffffffffffff811115615686578182fd5b61565784828501615453565b600080604083850312156156a4578182fd5b825167ffffffffffffffff8111156156ba578283fd5b6156c685828601615453565b92505060208301516156d781615cf0565b809150509250929050565b6000806000606084860312156156f6578283fd5b835161570181615d08565b602085015190935061571281615d08565b604085015190925063ffffffff811681146155b8578182fd5b60006020828403121561573c578081fd5b5051919050565b600060208284031215615754578081fd5b815167ffffffffffffffff8116811461327f578182fd5b6001600160a01b03169052565b15159052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526157c0816020860160208601615cc0565b601f01601f19169290920160200192915050565b600082516157e6818460208701615cc0565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b65726f7461746560d01b815260060190565b6208aa8960eb1b815260030190565b6001600160a01b0391909116815260200190565b6001600160a01b0383168152604060208201819052600090615657908301846157a8565b901515815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000604082526158b760408301868861577e565b82810360208401526158ca81858761577e565b979650505050505050565b6000604082526158e860408301856157a8565b90508260208301529392505050565b60006060825261590a60608301866157a8565b60208301949094525060400152919050565b60006080825261592f60808301876157a8565b6020830195909552506040810192909252606090910152919050565b60208082526017908201527f6d756c7469706c69636174696f6e206f766572666c6f77000000000000000000604082015260600190565b6020808252601690820152751d1bdad95b8818dbdb999a59c81b9bdd08199bdd5b9960521b604082015260600190565b60208082526030908201527f696e76616c69646174696f6e206d657373616765206d75737420636f6d65206660408201526f3937b6903a3432903932b837b93a32b960811b606082015260800190565b6020808252601f908201527f6f6e6c79207265706f72746572207072696365732067657420706f7374656400604082015260600190565b6020808252601a908201527f6e6f77206d75737420636f6d65206166746572206265666f7265000000000000604082015260600190565b6020808252818101527f696e76616c6964206d657373616765206d7573742062652027726f7461746527604082015260600190565b6020808252602c908201527f455448207072696365206e6f74207365742c2063616e6e6f7420636f6e76657260408201526b7420746f20646f6c6c61727360a01b606082015260800190565b60208082526023908201527f6d6573736167657320616e64207369676e617475726573206d75737420626520604082015262313a3160e81b606082015260800190565b60208082526017908201527f4669786564506f696e743a204449565f42595f5a45524f000000000000000000604082015260600190565b81516001600160a01b039081168252602080840151909116908201526040808301519082015260608083015190820152608082015161010082019060038110615bb057fe5b8060808401525060a083015160a083015260c0830151615bd360c084018261576b565b5060e083015161549960e0840182615778565b90815260200190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b6000808335601e19843603018112615c2e578283fd5b8084018035925067ffffffffffffffff831115615c49578384fd5b602001925050368190038213156153f957600080fd5b6000808335601e19843603018112615c2e578182fd5b60405181810167ffffffffffffffff81118282101715615c9457600080fd5b604052919050565b600067ffffffffffffffff821115615cb2578081fd5b50601f01601f191660200190565b60005b83811015615cdb578181015183820152602001615cc3565b83811115615cea576000848401525b50505050565b6001600160a01b0381168114615d0557600080fd5b50565b6001600160701b0381168114615d0557600080fdfea26469706673582212208c2a73bb54dfe5f38570c033928b1040c23a175021e768c6af478edcf88cf76164736f6c634300060a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c629c26dced4277419cde234012f8160a0278a79000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc00000000000000000000000000000000000000000000000002c68af0bb140000000000000000000000000000000000000000000000000000000000000000070800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed50000000000000000000000000000000000000000000000000000000000000000aaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff40000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc00000000000000000000000000000000000000000000000000000000000000010000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e36430000000000000000000000006b175474e89094c44da98b954eedeac495271d0fa5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e5680000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039aa39c021dfbae8fac545936693ac917d5e7563000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48d6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa00000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f650c3d88d12db855b8bf7d11be6c55a4e07dcc9000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec78b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c11b1268c1a384e55c48c2391d8d480264a3a7f40000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599e98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e90000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d94000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db550000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b6909b960dbbe7392d405429eb2b3649752b48380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3319f5d18bc0d84dd1b4825dcde5d5f7266d407000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498b8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6f348dd3b91a56d117ec0071c1e9b83c0996de40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000158079ee67fce2f58472a96584a73c7ab9ac95c10000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e86291a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee95040000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec2d2240d02a8cf63c3fa0b7d2c5a3169a3194960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a232603594dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c5320000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012c6adf3a35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888b6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab4540000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cffdded873554f362ac02f8fb1f02e5ada10516f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a7790000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2107fa5b38d9bbd2c461d6edf11b11a50f6b97400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd200e44e7f628ff17b7c7961d3f0150b75ab99038e99c1bfc32d5721c1ca23747cbc0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f49c43ae0faf37217bdcb00df478cf793edd66870000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : priceData_ (address): 0xc629C26dcED4277419CDe234012F8160A0278a79
Arg [1] : reporter_ (address): 0xfCEAdAFab14d46e20144F48824d0C09B1a03F2BC
Arg [2] : anchorToleranceMantissa_ (uint256): 200000000000000000
Arg [3] : anchorPeriod_ (uint256): 1800
Arg [4] : configs (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
-----Encoded View---------------
102 Constructor Arguments found :
Arg [0] : 000000000000000000000000c629c26dced4277419cde234012f8160a0278a79
Arg [1] : 000000000000000000000000fceadafab14d46e20144f48824d0c09b1a03f2bc
Arg [2] : 00000000000000000000000000000000000000000000000002c68af0bb140000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000708
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [6] : 0000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed5
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : aaaebeba3810b1e6b70781f14b2d72c1cb89c0b2b320c43bb67ff79f562f5ff4
Arg [9] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [12] : 000000000000000000000000b4e16d0168e52d35cacd2c6185b44281ec28c9dc
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [14] : 0000000000000000000000005d3a536e4d6dbd6114cc1ead35777bab948e3643
Arg [15] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [16] : a5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e568
Arg [17] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [20] : 000000000000000000000000a478c2975ab1ea89e8196811f51a7b7ade33eb11
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [22] : 00000000000000000000000039aa39c021dfbae8fac545936693ac917d5e7563
Arg [23] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [24] : d6aca1be9729c13d677335161321649cccae6a591554772516700f986f942eaa
Arg [25] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [27] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [30] : 000000000000000000000000f650c3d88d12db855b8bf7d11be6c55a4e07dcc9
Arg [31] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [32] : 8b1a1d9c2b109e527c9134b25b1a1833b16b6594f92daa9f6d9b7a6024bce9d0
Arg [33] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [35] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [36] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [37] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [38] : 000000000000000000000000c11b1268c1a384e55c48c2391d8d480264a3a7f4
Arg [39] : 0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599
Arg [40] : e98e2830be1a7e4156d656a7505e65d08c67660dc618072422e9c78053c261e9
Arg [41] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [42] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [43] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [44] : 000000000000000000000000bb2b8038a1640196fbe3e38816f3e67cba72d940
Arg [45] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [46] : 0000000000000000000000006c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e
Arg [47] : 0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef
Arg [48] : 3ec6762bdf44eb044276fec7d12c1bb640cb139cfd533f93eeebba5414f5db55
Arg [49] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [50] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [51] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [52] : 000000000000000000000000b6909b960dbbe7392d405429eb2b3649752b4838
Arg [53] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [54] : 000000000000000000000000b3319f5d18bc0d84dd1b4825dcde5d5f7266d407
Arg [55] : 000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498
Arg [56] : b8612e326dd19fc983e73ae3bc23fa1c78a3e01478574fa7ceb5b57e589dcebd
Arg [57] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [58] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [59] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [60] : 000000000000000000000000c6f348dd3b91a56d117ec0071c1e9b83c0996de4
Arg [61] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [62] : 000000000000000000000000158079ee67fce2f58472a96584a73c7ab9ac95c1
Arg [63] : 0000000000000000000000001985365e9f78359a9b6ad760e32412f4a445e862
Arg [64] : 91a08135082b0a28b4ad8ecc7749a009e0408743a9d1cdf34dd6a58d60ee9504
Arg [65] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [66] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [67] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [68] : 000000000000000000000000ec2d2240d02a8cf63c3fa0b7d2c5a3169a319496
Arg [69] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [70] : 000000000000000000000000f5dce57282a584d2746faf1593d3121fcac444dc
Arg [71] : 00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359
Arg [72] : 4dcbfd8d7239a822743634e138b90febafc5720cec2dbdc6a0e5a2118ba2c532
Arg [73] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [74] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [75] : 0000000000000000000000000000000000000000000000000012c6adf3a35000
Arg [76] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [77] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [78] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [79] : 000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888
Arg [80] : b6dbcaeee318e11fe1e87d4af04bdd7b4d6a3f13307225dc7ee72f7c085ab454
Arg [81] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [82] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [83] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [84] : 000000000000000000000000cffdded873554f362ac02f8fb1f02e5ada10516f
Arg [85] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [86] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [87] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [88] : 921a3539bcb764c889432630877414523e7fbca00c211bc787aeae69e2e3a779
Arg [89] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [90] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [91] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [92] : 000000000000000000000000a2107fa5b38d9bbd2c461d6edf11b11a50f6b974
Arg [93] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [94] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [95] : 000000000000000000000000dd974d5c2e2928dea5f71b9825b8b646686bd200
Arg [96] : e44e7f628ff17b7c7961d3f0150b75ab99038e99c1bfc32d5721c1ca23747cbc
Arg [97] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [98] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [99] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [100] : 000000000000000000000000f49c43ae0faf37217bdcb00df478cf793edd6687
Arg [101] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
50048:14687:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50482:33;;;:::i;:::-;;;;;;;;;;;;;;;;45585:292;;;;;;;;;:::i;:::-;;;;;;;;50644:43;;;:::i;:::-;;;;;;;;45215:184;;;;;;;;;:::i;51310:54::-;;;;;;;;;:::i;:::-;;;;;;;;;64138:344;;;;;;;;;:::i;46654:292::-;;;;;;;;;:::i;51075:38::-;;;;;;;;;:::i;51213:31::-;;;:::i;:::-;;;;;;;;50395:36;;;:::i;37063:7996::-;;;;;;;;;:::i;63224:480::-;;;;;;;;;:::i;:::-;;7032:31;;;:::i;50815:43::-;;;:::i;46150:306::-;;;;;;;;;:::i;50185:46::-;;;:::i;6918:35::-;;;:::i;50984:34::-;;;:::i;51430:54::-;;;;;;;;;:::i;56931:573::-;;;;;;;;;:::i;56064:408::-;;;;;;;;;:::i;55044:182::-;;;;;;;;;:::i;50482:33::-;;;:::o;45585:292::-;45662:18;;:::i;:::-;45693:10;45706:30;45725:10;45706:18;:30::i;:::-;45693:43;;-1:-1:-1;;45751:5:0;:17;45747:78;;45792:21;45807:5;45792:14;:21::i;:::-;45785:28;;;;;45747:78;45837:32;;-1:-1:-1;;;45837:32:0;;;;;;;;;;;;;;;;45585:292;;;;:::o;50644:43::-;;;:::o;45215:184::-;45290:18;;:::i;:::-;45328:63;45382:6;45365:24;;;;;;;;;;;;;;;;;;;;;;45355:35;;;;;;45328:26;:63::i;:::-;45321:70;45215:184;-1:-1:-1;;45215:184:0:o;51310:54::-;;;;;;;;;;;;;;;;;;;:::o;64138:344::-;64221:7;64242:9;64253;64264:7;64286:9;64275:48;;;;;;;;;;;;;;64241:82;;;;;;64334:12;64422:7;64412:18;;;;;;64359:72;;;;;;;;;;;;;;;;;;;;;;64349:83;;;;;;64334:98;;64450:24;64460:4;64466:1;64469;64472;64450:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64450:24:0;;-1:-1:-1;;64450:24:0;;;64138:344;-1:-1:-1;;;;;;;;64138:344:0:o;46654:292::-;46731:18;;:::i;:::-;46762:10;46775:30;46794:10;46775:18;:30::i;51075:38::-;;;;;;;;;;;;;;:::o;51213:31::-;;;;;;:::o;50395:36::-;50427:4;50395:36;:::o;37063:7996::-;37116:18;;:::i;:::-;37159:9;37155:1;:13;37147:48;;;;-1:-1:-1;;;37147:48:0;;;;;;;;;37212:6;37208:250;;37227:231;;;;;;;;37248:8;-1:-1:-1;;;;;37227:231:0;;;;;37270:12;-1:-1:-1;;;;;37227:231:0;;;;;37296:12;37227:231;;;;37320:10;37227:231;;;;37345:13;37227:231;;;;;;;;;;;;37372:12;37227:231;;;;37401:15;-1:-1:-1;;;;;37227:231:0;;;;;37437:19;37227:231;;;;;37220:238;;;;37208:250;37473:1;37478;37473:6;37469:250;;;37488:231;;;;;;;;37509:8;-1:-1:-1;;;;;37488:231:0;;;;;37531:12;-1:-1:-1;;;;;37488:231:0;;;;;37557:12;37488:231;;;;37581:10;37488:231;;;;37606:13;37488:231;;;;;;;;;;;;37633:12;37488:231;;;;37662:15;-1:-1:-1;;;;;37488:231:0;;;;;37698:19;37488:231;;;;;37481:238;;;;37469:250;37734:1;37739;37734:6;37730:250;;;37749:231;;;;;;;;37770:8;-1:-1:-1;;;;;37749:231:0;;;;;37792:12;-1:-1:-1;;;;;37749:231:0;;;;;37818:12;37749:231;;;;37842:10;37749:231;;;;37867:13;37749:231;;;;;;;;;;;;37894:12;37749:231;;;;37923:15;-1:-1:-1;;;;;37749:231:0;;;;;37959:19;37749:231;;;;;37742:238;;;;37730:250;37995:1;38000;37995:6;37991:250;;;38010:231;;;;;;;;38031:8;-1:-1:-1;;;;;38010:231:0;;;;;38053:12;-1:-1:-1;;;;;38010:231:0;;;;;38079:12;38010:231;;;;38103:10;38010:231;;;;38128:13;38010:231;;;;;;;;;;;;38155:12;38010:231;;;;38184:15;-1:-1:-1;;;;;38010:231:0;;;;;38220:19;38010:231;;;;;38003:238;;;;37991:250;38256:1;38261;38256:6;38252:250;;;38271:231;;;;;;;;38292:8;-1:-1:-1;;;;;38271:231:0;;;;;38314:12;-1:-1:-1;;;;;38271:231:0;;;;;38340:12;38271:231;;;;38364:10;38271:231;;;;38389:13;38271:231;;;;;;;;;;;;38416:12;38271:231;;;;38445:15;-1:-1:-1;;;;;38271:231:0;;;;;38481:19;38271:231;;;;;38264:238;;;;38252:250;38517:1;38522;38517:6;38513:250;;;38532:231;;;;;;;;38553:8;-1:-1:-1;;;;;38532:231:0;;;;;38575:12;-1:-1:-1;;;;;38532:231:0;;;;;38601:12;38532:231;;;;38625:10;38532:231;;;;38650:13;38532:231;;;;;;;;;;;;38677:12;38532:231;;;;38706:15;-1:-1:-1;;;;;38532:231:0;;;;;38742:19;38532:231;;;;;38525:238;;;;38513:250;38778:1;38783;38778:6;38774:250;;;38793:231;;;;;;;;38814:8;-1:-1:-1;;;;;38793:231:0;;;;;38836:12;-1:-1:-1;;;;;38793:231:0;;;;;38862:12;38793:231;;;;38886:10;38793:231;;;;38911:13;38793:231;;;;;;;;;;;;38938:12;38793:231;;;;38967:15;-1:-1:-1;;;;;38793:231:0;;;;;39003:19;38793:231;;;;;38786:238;;;;38774:250;39039:1;39044;39039:6;39035:250;;;39054:231;;;;;;;;39075:8;-1:-1:-1;;;;;39054:231:0;;;;;39097:12;-1:-1:-1;;;;;39054:231:0;;;;;39123:12;39054:231;;;;39147:10;39054:231;;;;39172:13;39054:231;;;;;;;;;;;;39199:12;39054:231;;;;39228:15;-1:-1:-1;;;;;39054:231:0;;;;;39264:19;39054:231;;;;;39047:238;;;;39035:250;39300:1;39305;39300:6;39296:250;;;39315:231;;;;;;;;39336:8;-1:-1:-1;;;;;39315:231:0;;;;;39358:12;-1:-1:-1;;;;;39315:231:0;;;;;39384:12;39315:231;;;;39408:10;39315:231;;;;39433:13;39315:231;;;;;;;;;;;;39460:12;39315:231;;;;39489:15;-1:-1:-1;;;;;39315:231:0;;;;;39525:19;39315:231;;;;;39308:238;;;;39296:250;39561:1;39566;39561:6;39557:250;;;39576:231;;;;;;;;39597:8;-1:-1:-1;;;;;39576:231:0;;;;;39619:12;-1:-1:-1;;;;;39576:231:0;;;;;39645:12;39576:231;;;;39669:10;39576:231;;;;39694:13;39576:231;;;;;;;;;;;;39721:12;39576:231;;;;39750:15;-1:-1:-1;;;;;39576:231:0;;;;;39786:19;39576:231;;;;;39569:238;;;;39557:250;39824:1;39829:2;39824:7;39820:251;;;39840:231;;;;;;;;39861:8;-1:-1:-1;;;;;39840:231:0;;;;;39883:12;-1:-1:-1;;;;;39840:231:0;;;;;39909:12;39840:231;;;;39933:10;39840:231;;;;39958:13;39840:231;;;;;;;;;;;;39985:12;39840:231;;;;40014:15;-1:-1:-1;;;;;39840:231:0;;;;;40050:19;39840:231;;;;;39833:238;;;;39820:251;40086:1;40091:2;40086:7;40082:251;;;40102:231;;;;;;;;40123:8;-1:-1:-1;;;;;40102:231:0;;;;;40145:12;-1:-1:-1;;;;;40102:231:0;;;;;40171:12;40102:231;;;;40195:10;40102:231;;;;40220:13;40102:231;;;;;;;;;;;;40247:12;40102:231;;;;40276:15;-1:-1:-1;;;;;40102:231:0;;;;;40312:19;40102:231;;;;;40095:238;;;;40082:251;40348:1;40353:2;40348:7;40344:251;;;40364:231;;;;;;;;40385:8;-1:-1:-1;;;;;40364:231:0;;;;;40407:12;-1:-1:-1;;;;;40364:231:0;;;;;40433:12;40364:231;;;;40457:10;40364:231;;;;40482:13;40364:231;;;;;;;;;;;;40509:12;40364:231;;;;40538:15;-1:-1:-1;;;;;40364:231:0;;;;;40574:19;40364:231;;;;;40357:238;;;;40344:251;40610:1;40615:2;40610:7;40606:251;;;40626:231;;;;;;;;40647:8;-1:-1:-1;;;;;40626:231:0;;;;;40669:12;-1:-1:-1;;;;;40626:231:0;;;;;40695:12;40626:231;;;;40719:10;40626:231;;;;40744:13;40626:231;;;;;;;;;;;;40771:12;40626:231;;;;40800:15;-1:-1:-1;;;;;40626:231:0;;;;;40836:19;40626:231;;;;;40619:238;;;;40606:251;40872:1;40877:2;40872:7;40868:251;;;40888:231;;;;;;;;40909:8;-1:-1:-1;;;;;40888:231:0;;;;;40931:12;-1:-1:-1;;;;;40888:231:0;;;;;40957:12;40888:231;;;;40981:10;40888:231;;;;41006:13;40888:231;;;;;;;;;;;;41033:12;40888:231;;;;41062:15;-1:-1:-1;;;;;40888:231:0;;;;;41098:19;40888:231;;;;;40881:238;;;;40868:251;41134:1;41139:2;41134:7;41130:251;;;41150:231;;;;;;;;41171:8;-1:-1:-1;;;;;41150:231:0;;;;;41193:12;-1:-1:-1;;;;;41150:231:0;;;;;41219:12;41150:231;;;;41243:10;41150:231;;;;41268:13;41150:231;;;;;;;;;;;;41295:12;41150:231;;;;41324:15;-1:-1:-1;;;;;41150:231:0;;;;;41360:19;41150:231;;;;;41143:238;;;;41130:251;41396:1;41401:2;41396:7;41392:251;;;41412:231;;;;;;;;41433:8;-1:-1:-1;;;;;41412:231:0;;;;;41455:12;-1:-1:-1;;;;;41412:231:0;;;;;41481:12;41412:231;;;;41505:10;41412:231;;;;41530:13;41412:231;;;;;;;;;;;;41557:12;41412:231;;;;41586:15;-1:-1:-1;;;;;41412:231:0;;;;;41622:19;41412:231;;;;;41405:238;;;;41392:251;41658:1;41663:2;41658:7;41654:251;;;41674:231;;;;;;;;41695:8;-1:-1:-1;;;;;41674:231:0;;;;;41717:12;-1:-1:-1;;;;;41674:231:0;;;;;41743:12;41674:231;;;;41767:10;41674:231;;;;41792:13;41674:231;;;;;;;;;;;;41819:12;41674:231;;;;41848:15;-1:-1:-1;;;;;41674:231:0;;;;;41884:19;41674:231;;;;;41667:238;;;;41654:251;41920:1;41925:2;41920:7;41916:251;;;41936:231;;;;;;;;41957:8;-1:-1:-1;;;;;41936:231:0;;;;;41979:12;-1:-1:-1;;;;;41936:231:0;;;;;42005:12;41936:231;;;;42029:10;41936:231;;;;42054:13;41936:231;;;;;;;;;;;;42081:12;41936:231;;;;42110:15;-1:-1:-1;;;;;41936:231:0;;;;;42146:19;41936:231;;;;;41929:238;;;;41916:251;42182:1;42187:2;42182:7;42178:251;;;42198:231;;;;;;;;42219:8;-1:-1:-1;;;;;42198:231:0;;;;;42241:12;-1:-1:-1;;;;;42198:231:0;;;;;42267:12;42198:231;;;;42291:10;42198:231;;;;42316:13;42198:231;;;;;;;;;;;;42343:12;42198:231;;;;42372:15;-1:-1:-1;;;;;42198:231:0;;;;;42408:19;42198:231;;;;;42191:238;;;;42178:251;42446:1;42451:2;42446:7;42442:251;;;42462:231;;;;;;;;42483:8;-1:-1:-1;;;;;42462:231:0;;;;;42505:12;-1:-1:-1;;;;;42462:231:0;;;;;42531:12;42462:231;;;;42555:10;42462:231;;;;42580:13;42462:231;;;;;;;;;;;;42607:12;42462:231;;;;42636:15;-1:-1:-1;;;;;42462:231:0;;;;;42672:19;42462:231;;;;;42455:238;;;;42442:251;42708:1;42713:2;42708:7;42704:251;;;42724:231;;;;;;;;42745:8;-1:-1:-1;;;;;42724:231:0;;;;;42767:12;-1:-1:-1;;;;;42724:231:0;;;;;42793:12;42724:231;;;;42817:10;42724:231;;;;42842:13;42724:231;;;;;;;;;;;;42869:12;42724:231;;;;42898:15;-1:-1:-1;;;;;42724:231:0;;;;;42934:19;42724:231;;;;;42717:238;;;;42704:251;42970:1;42975:2;42970:7;42966:251;;;42986:231;;;;;;;;43007:8;-1:-1:-1;;;;;42986:231:0;;;;;43029:12;-1:-1:-1;;;;;42986:231:0;;;;;43055:12;42986:231;;;;43079:10;42986:231;;;;43104:13;42986:231;;;;;;;;;;;;43131:12;42986:231;;;;43160:15;-1:-1:-1;;;;;42986:231:0;;;;;43196:19;42986:231;;;;;42979:238;;;;42966:251;43232:1;43237:2;43232:7;43228:251;;;43248:231;;;;;;;;43269:8;-1:-1:-1;;;;;43248:231:0;;;;;43291:12;-1:-1:-1;;;;;43248:231:0;;;;;43317:12;43248:231;;;;43341:10;43248:231;;;;43366:13;43248:231;;;;;;;;;;;;43393:12;43248:231;;;;43422:15;-1:-1:-1;;;;;43248:231:0;;;;;43458:19;43248:231;;;;;43241:238;;;;43228:251;43494:1;43499:2;43494:7;43490:251;;;43510:231;;;;;;;;43531:8;-1:-1:-1;;;;;43510:231:0;;;;;43553:12;-1:-1:-1;;;;;43510:231:0;;;;;43579:12;43510:231;;;;43603:10;43510:231;;;;43628:13;43510:231;;;;;;;;;;;;43655:12;43510:231;;;;43684:15;-1:-1:-1;;;;;43510:231:0;;;;;43720:19;43510:231;;;;;43503:238;;;;43490:251;43756:1;43761:2;43756:7;43752:251;;;43772:231;;;;;;;;43793:8;-1:-1:-1;;;;;43772:231:0;;;;;43815:12;-1:-1:-1;;;;;43772:231:0;;;;;43841:12;43772:231;;;;43865:10;43772:231;;;;43890:13;43772:231;;;;;;;;;;;;43917:12;43772:231;;;;43946:15;-1:-1:-1;;;;;43772:231:0;;;;;43982:19;43772:231;;;;;43765:238;;;;43752:251;44018:1;44023:2;44018:7;44014:251;;;44034:231;;;;;;;;44055:8;-1:-1:-1;;;;;44034:231:0;;;;;44077:12;-1:-1:-1;;;;;44034:231:0;;;;;44103:12;44034:231;;;;44127:10;44034:231;;;;44152:13;44034:231;;;;;;;;;;;;44179:12;44034:231;;;;44208:15;-1:-1:-1;;;;;44034:231:0;;;;;44244:19;44034:231;;;;;44027:238;;;;44014:251;44280:1;44285:2;44280:7;44276:251;;;44296:231;;;;;;;;44317:8;-1:-1:-1;;;;;44296:231:0;;;;;44339:12;-1:-1:-1;;;;;44296:231:0;;;;;44365:12;44296:231;;;;44389:10;44296:231;;;;44414:13;44296:231;;;;;;;;;;;;44441:12;44296:231;;;;44470:15;-1:-1:-1;;;;;44296:231:0;;;;;44506:19;44296:231;;;;;44289:238;;;;44276:251;44542:1;44547:2;44542:7;44538:251;;;44558:231;;;;;;;;44579:8;-1:-1:-1;;;;;44558:231:0;;;;;44601:12;-1:-1:-1;;;;;44558:231:0;;;;;44627:12;44558:231;;;;44651:10;44558:231;;;;44676:13;44558:231;;;;;;;;;;;;44703:12;44558:231;;;;44732:15;-1:-1:-1;;;;;44558:231:0;;;;;44768:19;44558:231;;;;;44551:238;;;;44538:251;44804:1;44809:2;44804:7;44800:251;;;44820:231;;;;;;;;44841:8;-1:-1:-1;;;;;44820:231:0;;;;;44863:12;-1:-1:-1;;;;;44820:231:0;;;;;44889:12;44820:231;;;;44913:10;44820:231;;;;44938:13;44820:231;;;;;;;;;;;;44965:12;44820:231;;;;44994:15;-1:-1:-1;;;;;44820:231:0;;;;;45030:19;44820:231;;;;;44813:238;;;;63224:480;63319:28;63364:7;63353:38;;;;;;;;;;;;;;63318:73;;;52395:26;;;;;;;;;;;;;;;;;;;;;52385:37;;;;;;63437:14;63420:32;;;;;;;;;;;;;;;;;;;;;;63410:43;;;;;;:57;63402:102;;;;-1:-1:-1;;;63402:102:0;;;;;;;;;63553:8;-1:-1:-1;;;;;63523:38:0;:26;63530:7;63539:9;63523:6;:26::i;:::-;-1:-1:-1;;;;;63523:38:0;;63515:99;;;;-1:-1:-1;;;63515:99:0;;;;;;;;;63647:4;63625:26;;-1:-1:-1;;63625:26:0;;;;;63667:29;;;;;;63687:8;;63667:29;;;;;;;;;;63224:480;;;:::o;7032:31::-;;;:::o;50815:43::-;;;:::o;46150:306::-;46219:18;;:::i;:::-;46250:10;46263:22;46278:6;46263:14;:22::i;:::-;46250:35;;-1:-1:-1;;46300:5:0;:17;46296:78;;46341:21;46356:5;46341:14;:21::i;46296:78::-;46393:55;46427:6;-1:-1:-1;;;;;46420:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46393:55;46386:62;46150:306;-1:-1:-1;;;46150:306:0:o;50185:46::-;;;:::o;6918:35::-;6951:2;6918:35;:::o;50984:34::-;;;:::o;51430:54::-;;;;;;;;;;;;;;;;;;;:::o;56931:573::-;57062:36;;;57054:84;;;;-1:-1:-1;;;57054:84:0;;;;;;;;;57184:6;57179:111;57196:19;;;57179:111;;;57237:9;-1:-1:-1;;;;;57237:13:0;;57251:8;;57260:1;57251:11;;;;;;;;;;;;;;;;;;;;57264:10;;57275:1;57264:13;;;;;;;;;;;;;;;;;;;;57237:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57237:41:0;;;;;;;;;;;;;;-1:-1:-1;57217:3:0;;57179:111;;;;57302:13;57318:15;:13;:15::i;:::-;57302:31;-1:-1:-1;57394:6:0;57389:108;57406:18;;;57389:108;;;57446:39;57464:7;;57472:1;57464:10;;;;;;;;;;;;;;;;;;;;57446:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57476:8:0;;-1:-1:-1;57446:17:0;;-1:-1:-1;;57446:39:0:i;:::-;57426:3;;57389:108;;;;56931:573;;;;;;;:::o;56064:408::-;56131:4;56148:25;;:::i;:::-;56176:30;56199:6;56176:22;:30::i;:::-;56148:58;;56449:6;:15;;;56414:32;56418:4;56424:21;56438:6;56424:13;:21::i;:::-;56414:3;:32::i;:::-;:50;;;;;;;56064:408;-1:-1:-1;;;56064:408:0:o;55044:182::-;55104:4;55121:25;;:::i;:::-;55149:30;55172:6;55149:22;:30::i;:::-;55121:58;;55197:21;55211:6;55197:13;:21::i;48636:1058::-;48722:21;48745;48768;48819:23;:21;:23::i;:::-;48802:40;;48887:4;-1:-1:-1;;;;;48872:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48853:62;;48960:4;-1:-1:-1;;;;;48945:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48926:62;;49103:16;49121;49139:25;49183:4;-1:-1:-1;;;;;49168:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49102:100;;;;;;49239:14;49217:36;;:18;:36;;;49213:474;;49339:35;;;49485:62;;;49490:39;49510:8;49520;49490:19;:39::i;:::-;:42;-1:-1:-1;;;;;49485:48:0;:62;49465:82;;;;;49613:62;;;49618:39;49638:8;49648;49618:19;:39::i;:::-;:42;-1:-1:-1;;;;;49613:48:0;:62;49593:82;;;;;-1:-1:-1;49213:474:0;48636:1058;;;;;;;;:::o;47426:239::-;47507:16;;:::i;:::-;47558:1;47544:11;-1:-1:-1;;;;;47544:15:0;;47536:51;;;;-1:-1:-1;;;47536:51:0;;;;;;;;;47605:52;;;;;;;;;;-1:-1:-1;;;;;47615:41:0;;-1:-1:-1;;;47638:3:0;47616:25;;;;47615:41;;;;;;-1:-1:-1;;;;;47605:52:0;;;;47598:59;;47426:239;;;;:::o;35201:1663::-;35272:4;35307:12;35293:10;:26;35289:40;;;-1:-1:-1;35328:1:0;35321:8;;35289:40;35358:12;35344:10;:26;35340:40;;;-1:-1:-1;35379:1:0;35372:8;;35340:40;35409:12;35395:10;:26;35391:40;;;-1:-1:-1;35430:1:0;35423:8;;35391:40;35460:12;35446:10;:26;35442:40;;;-1:-1:-1;35481:1:0;35474:8;;35442:40;35511:12;35497:10;:26;35493:40;;;-1:-1:-1;35532:1:0;35525:8;;35493:40;35562:12;35548:10;:26;35544:40;;;-1:-1:-1;35583:1:0;35576:8;;35544:40;35613:12;35599:10;:26;35595:40;;;-1:-1:-1;35634:1:0;35627:8;;35595:40;35664:12;35650:10;:26;35646:40;;;-1:-1:-1;35685:1:0;35678:8;;35646:40;35715:12;35701:10;:26;35697:40;;;-1:-1:-1;35736:1:0;35729:8;;35697:40;35766:12;35752:10;:26;35748:40;;;-1:-1:-1;35787:1:0;35780:8;;35748:40;35817:12;35803:10;:26;35799:41;;;-1:-1:-1;35838:2:0;35831:9;;35799:41;35869:12;35855:10;:26;35851:41;;;-1:-1:-1;35890:2:0;35883:9;;35851:41;35921:12;35907:10;:26;35903:41;;;-1:-1:-1;35942:2:0;35935:9;;35903:41;35973:12;35959:10;:26;35955:41;;;-1:-1:-1;35994:2:0;35987:9;;35955:41;36025:12;36011:10;:26;36007:41;;;-1:-1:-1;36046:2:0;36039:9;;36007:41;36077:12;36063:10;:26;36059:41;;;-1:-1:-1;36098:2:0;36091:9;;36059:41;36129:12;36115:10;:26;36111:41;;;-1:-1:-1;36150:2:0;36143:9;;36111:41;36181:12;36167:10;:26;36163:41;;;-1:-1:-1;36202:2:0;36195:9;;36163:41;36233:12;36219:10;:26;36215:41;;;-1:-1:-1;36254:2:0;36247:9;;36215:41;36285:12;36271:10;:26;36267:41;;;-1:-1:-1;36306:2:0;36299:9;;36267:41;36337:12;36323:10;:26;36319:41;;;-1:-1:-1;36358:2:0;36351:9;;36319:41;36389:12;36375:10;:26;36371:41;;;-1:-1:-1;36410:2:0;36403:9;;36371:41;36441:12;36427:10;:26;36423:41;;;-1:-1:-1;36462:2:0;36455:9;;36423:41;36493:12;36479:10;:26;36475:41;;;-1:-1:-1;36514:2:0;36507:9;;36475:41;36545:12;36531:10;:26;36527:41;;;-1:-1:-1;36566:2:0;36559:9;;36527:41;36597:12;36583:10;:26;36579:41;;;-1:-1:-1;36618:2:0;36611:9;;36579:41;36649:12;36635:10;:26;36631:41;;;-1:-1:-1;36670:2:0;36663:9;;36631:41;36701:12;36687:10;:26;36683:41;;;-1:-1:-1;36722:2:0;36715:9;;36683:41;36753:12;36739:10;:26;36735:41;;;-1:-1:-1;36774:2:0;36767:9;;36735:41;36805:12;36791:10;:26;36787:41;;;-1:-1:-1;36826:2:0;36819:9;;36787:41;-1:-1:-1;;;35201:1663:0;;;:::o;33530:::-;33601:4;33636:12;-1:-1:-1;;;;;33622:26:0;:10;-1:-1:-1;;;;;33622:26:0;;33618:40;;;-1:-1:-1;33657:1:0;33650:8;;33618:40;33687:12;-1:-1:-1;;;;;33673:26:0;:10;-1:-1:-1;;;;;33673:26:0;;33669:40;;;-1:-1:-1;33708:1:0;33701:8;;33669:40;33738:12;-1:-1:-1;;;;;33724:26:0;:10;-1:-1:-1;;;;;33724:26:0;;33720:40;;;-1:-1:-1;33759:1:0;33752:8;;33720:40;33789:12;-1:-1:-1;;;;;33775:26:0;:10;-1:-1:-1;;;;;33775:26:0;;33771:40;;;-1:-1:-1;33810:1:0;33803:8;;33771:40;33840:12;-1:-1:-1;;;;;33826:26:0;:10;-1:-1:-1;;;;;33826:26:0;;33822:40;;;-1:-1:-1;33861:1:0;33854:8;;33822:40;33891:12;-1:-1:-1;;;;;33877:26:0;:10;-1:-1:-1;;;;;33877:26:0;;33873:40;;;-1:-1:-1;33912:1:0;33905:8;;33873:40;33942:12;-1:-1:-1;;;;;33928:26:0;:10;-1:-1:-1;;;;;33928:26:0;;33924:40;;;-1:-1:-1;33963:1:0;33956:8;;33924:40;33993:12;-1:-1:-1;;;;;33979:26:0;:10;-1:-1:-1;;;;;33979:26:0;;33975:40;;;-1:-1:-1;34014:1:0;34007:8;;33975:40;34044:12;-1:-1:-1;;;;;34030:26:0;:10;-1:-1:-1;;;;;34030:26:0;;34026:40;;;-1:-1:-1;34065:1:0;34058:8;;34026:40;34095:12;-1:-1:-1;;;;;34081:26:0;:10;-1:-1:-1;;;;;34081:26:0;;34077:40;;;-1:-1:-1;34116:1:0;34109:8;;34077:40;34146:12;-1:-1:-1;;;;;34132:26:0;:10;-1:-1:-1;;;;;34132:26:0;;34128:41;;;-1:-1:-1;34167:2:0;34160:9;;34128:41;34198:12;-1:-1:-1;;;;;34184:26:0;:10;-1:-1:-1;;;;;34184:26:0;;34180:41;;;-1:-1:-1;34219:2:0;34212:9;;34180:41;34250:12;-1:-1:-1;;;;;34236:26:0;:10;-1:-1:-1;;;;;34236:26:0;;34232:41;;;-1:-1:-1;34271:2:0;34264:9;;34232:41;34302:12;-1:-1:-1;;;;;34288:26:0;:10;-1:-1:-1;;;;;34288:26:0;;34284:41;;;-1:-1:-1;34323:2:0;34316:9;;34284:41;34354:12;-1:-1:-1;;;;;34340:26:0;:10;-1:-1:-1;;;;;34340:26:0;;34336:41;;;-1:-1:-1;34375:2:0;34368:9;;34336:41;34406:12;-1:-1:-1;;;;;34392:26:0;:10;-1:-1:-1;;;;;34392:26:0;;34388:41;;;-1:-1:-1;34427:2:0;34420:9;;34388:41;34458:12;-1:-1:-1;;;;;34444:26:0;:10;-1:-1:-1;;;;;34444:26:0;;34440:41;;;-1:-1:-1;34479:2:0;34472:9;;34440:41;34510:12;-1:-1:-1;;;;;34496:26:0;:10;-1:-1:-1;;;;;34496:26:0;;34492:41;;;-1:-1:-1;34531:2:0;34524:9;;34492:41;34562:12;-1:-1:-1;;;;;34548:26:0;:10;-1:-1:-1;;;;;34548:26:0;;34544:41;;;-1:-1:-1;34583:2:0;34576:9;;34544:41;34614:12;-1:-1:-1;;;;;34600:26:0;:10;-1:-1:-1;;;;;34600:26:0;;34596:41;;;-1:-1:-1;34635:2:0;34628:9;;34596:41;34666:12;-1:-1:-1;;;;;34652:26:0;:10;-1:-1:-1;;;;;34652:26:0;;34648:41;;;-1:-1:-1;34687:2:0;34680:9;;34648:41;34718:12;-1:-1:-1;;;;;34704:26:0;:10;-1:-1:-1;;;;;34704:26:0;;34700:41;;;-1:-1:-1;34739:2:0;34732:9;;34700:41;34770:12;-1:-1:-1;;;;;34756:26:0;:10;-1:-1:-1;;;;;34756:26:0;;34752:41;;;-1:-1:-1;34791:2:0;34784:9;;34752:41;34822:12;-1:-1:-1;;;;;34808:26:0;:10;-1:-1:-1;;;;;34808:26:0;;34804:41;;;-1:-1:-1;34843:2:0;34836:9;;34804:41;34874:12;-1:-1:-1;;;;;34860:26:0;:10;-1:-1:-1;;;;;34860:26:0;;34856:41;;;-1:-1:-1;34895:2:0;34888:9;;34856:41;34926:12;-1:-1:-1;;;;;34912:26:0;:10;-1:-1:-1;;;;;34912:26:0;;34908:41;;;-1:-1:-1;34947:2:0;34940:9;;34908:41;34978:12;-1:-1:-1;;;;;34964:26:0;:10;-1:-1:-1;;;;;34964:26:0;;34960:41;;;-1:-1:-1;34999:2:0;34992:9;;34960:41;35030:12;-1:-1:-1;;;;;35016:26:0;:10;-1:-1:-1;;;;;35016:26:0;;35012:41;;;-1:-1:-1;35051:2:0;35044:9;;35012:41;35082:12;-1:-1:-1;;;;;35068:26:0;:10;-1:-1:-1;;;;;35068:26:0;;35064:41;;;-1:-1:-1;35103:2:0;35096:9;;35064:41;35134:12;-1:-1:-1;;;;;35120:26:0;:10;-1:-1:-1;;;;;35120:26:0;;35116:41;;;-1:-1:-1;35155:2:0;35148:9;;32107:1415;32170:4;32201:8;-1:-1:-1;;;;;32191:18:0;:6;-1:-1:-1;;;;;32191:18:0;;32187:32;;;-1:-1:-1;32218:1:0;32211:8;;32187:32;32244:8;-1:-1:-1;;;;;32234:18:0;:6;-1:-1:-1;;;;;32234:18:0;;32230:32;;;-1:-1:-1;32261:1:0;32254:8;;32230:32;32287:8;-1:-1:-1;;;;;32277:18:0;:6;-1:-1:-1;;;;;32277:18:0;;32273:32;;;-1:-1:-1;32304:1:0;32297:8;;32273:32;32330:8;-1:-1:-1;;;;;32320:18:0;:6;-1:-1:-1;;;;;32320:18:0;;32316:32;;;-1:-1:-1;32347:1:0;32340:8;;32316:32;32373:8;-1:-1:-1;;;;;32363:18:0;:6;-1:-1:-1;;;;;32363:18:0;;32359:32;;;-1:-1:-1;32390:1:0;32383:8;;32359:32;32416:8;-1:-1:-1;;;;;32406:18:0;:6;-1:-1:-1;;;;;32406:18:0;;32402:32;;;-1:-1:-1;32433:1:0;32426:8;;32402:32;32459:8;-1:-1:-1;;;;;32449:18:0;:6;-1:-1:-1;;;;;32449:18:0;;32445:32;;;-1:-1:-1;32476:1:0;32469:8;;32445:32;32502:8;-1:-1:-1;;;;;32492:18:0;:6;-1:-1:-1;;;;;32492:18:0;;32488:32;;;-1:-1:-1;32519:1:0;32512:8;;32488:32;32545:8;-1:-1:-1;;;;;32535:18:0;:6;-1:-1:-1;;;;;32535:18:0;;32531:32;;;-1:-1:-1;32562:1:0;32555:8;;32531:32;32588:8;-1:-1:-1;;;;;32578:18:0;:6;-1:-1:-1;;;;;32578:18:0;;32574:32;;;-1:-1:-1;32605:1:0;32598:8;;32574:32;32631:8;-1:-1:-1;;;;;32621:18:0;:6;-1:-1:-1;;;;;32621:18:0;;32617:33;;;-1:-1:-1;32648:2:0;32641:9;;32617:33;32675:8;-1:-1:-1;;;;;32665:18:0;:6;-1:-1:-1;;;;;32665:18:0;;32661:33;;;-1:-1:-1;32692:2:0;32685:9;;32661:33;32719:8;-1:-1:-1;;;;;32709:18:0;:6;-1:-1:-1;;;;;32709:18:0;;32705:33;;;-1:-1:-1;32736:2:0;32729:9;;32705:33;32763:8;-1:-1:-1;;;;;32753:18:0;:6;-1:-1:-1;;;;;32753:18:0;;32749:33;;;-1:-1:-1;32780:2:0;32773:9;;32749:33;32807:8;-1:-1:-1;;;;;32797:18:0;:6;-1:-1:-1;;;;;32797:18:0;;32793:33;;;-1:-1:-1;32824:2:0;32817:9;;32793:33;32851:8;-1:-1:-1;;;;;32841:18:0;:6;-1:-1:-1;;;;;32841:18:0;;32837:33;;;-1:-1:-1;32868:2:0;32861:9;;32837:33;32895:8;-1:-1:-1;;;;;32885:18:0;:6;-1:-1:-1;;;;;32885:18:0;;32881:33;;;-1:-1:-1;32912:2:0;32905:9;;32881:33;32939:8;-1:-1:-1;;;;;32929:18:0;:6;-1:-1:-1;;;;;32929:18:0;;32925:33;;;-1:-1:-1;32956:2:0;32949:9;;32925:33;32983:8;-1:-1:-1;;;;;32973:18:0;:6;-1:-1:-1;;;;;32973:18:0;;32969:33;;;-1:-1:-1;33000:2:0;32993:9;;32969:33;33027:8;-1:-1:-1;;;;;33017:18:0;:6;-1:-1:-1;;;;;33017:18:0;;33013:33;;;-1:-1:-1;33044:2:0;33037:9;;33013:33;33071:8;-1:-1:-1;;;;;33061:18:0;:6;-1:-1:-1;;;;;33061:18:0;;33057:33;;;-1:-1:-1;33088:2:0;33081:9;;33057:33;33115:8;-1:-1:-1;;;;;33105:18:0;:6;-1:-1:-1;;;;;33105:18:0;;33101:33;;;-1:-1:-1;33132:2:0;33125:9;;33101:33;33159:8;-1:-1:-1;;;;;33149:18:0;:6;-1:-1:-1;;;;;33149:18:0;;33145:33;;;-1:-1:-1;33176:2:0;33169:9;;33145:33;33203:8;-1:-1:-1;;;;;33193:18:0;:6;-1:-1:-1;;;;;33193:18:0;;33189:33;;;-1:-1:-1;33220:2:0;33213:9;;33189:33;33247:8;-1:-1:-1;;;;;33237:18:0;:6;-1:-1:-1;;;;;33237:18:0;;33233:33;;;-1:-1:-1;33264:2:0;33257:9;;33233:33;33291:8;-1:-1:-1;;;;;33281:18:0;:6;-1:-1:-1;;;;;33281:18:0;;33277:33;;;-1:-1:-1;33308:2:0;33301:9;;33277:33;33335:8;-1:-1:-1;;;;;33325:18:0;:6;-1:-1:-1;;;;;33325:18:0;;33321:33;;;-1:-1:-1;33352:2:0;33345:9;;33321:33;33379:8;-1:-1:-1;;;;;33369:18:0;:6;-1:-1:-1;;;;;33369:18:0;;33365:33;;;-1:-1:-1;33396:2:0;33389:9;;33365:33;33423:8;-1:-1:-1;;;;;33413:18:0;:6;-1:-1:-1;;;;;33413:18:0;;33409:33;;;-1:-1:-1;33440:2:0;33433:9;;33409:33;33467:8;-1:-1:-1;;;;;33457:18:0;:6;-1:-1:-1;;;;;33457:18:0;;33453:33;;;-1:-1:-1;33484:2:0;33477:9;;59554:148;59597:4;59621:73;;;;;;;;;;;;;;-1:-1:-1;;;59621:73:0;;;59645:35;52324:23;;;;;;;;59645:35;50319:4;59621:16;:73::i;:::-;59614:80;;59554:148;:::o;57512:991::-;57596:25;;:::i;:::-;57624:30;57647:6;57624:22;:30::i;:::-;57596:58;-1:-1:-1;57695:20:0;57673:6;:18;;;:42;;;;;;;;;57665:86;;;;-1:-1:-1;;;57665:86:0;;;;;;;;;57764:18;57812:6;57795:24;;;;;;;;;;;;;;;;;;;;;;57785:35;;;;;;57764:56;;57831:18;57852:9;-1:-1:-1;;;;;57852:18:0;;57871:8;57881:6;57852:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57831:57;;;;57899:16;52324:23;;;;;;;;;;;;;;;;;;;;;52314:34;;;;;;57930:10;:21;57926:165;;;-1:-1:-1;57982:8:0;57926:165;;;58037:42;58054:6;58062;58070:8;58037:16;:42::i;:::-;58023:56;;57926:165;58107:19;;;;58103:393;;;58143:6;:18;;;;;;;;;;;;:32;;;58195:33;;;;;58208:6;;58164:11;;58195:33;;;;;;;;;;58103:393;;;58250:42;58265:13;58280:11;58250:14;:42::i;:::-;58246:250;;;58309:6;:18;;;;;;;;;;;;:34;;;58363:35;;;;;58376:6;;58330:13;;58363:35;;58246:250;58436:48;58449:6;58457:13;58472:11;58436:48;;;;;;;;;;;;;;;;;58246:250;57512:991;;;;;;:::o;55234:534::-;55307:4;55350:20;55328:6;:18;;;:42;;;;;;;;;55324:80;;;-1:-1:-1;55386:17:0;;;;;55379:6;:25;;;;;;;;;55372:32;;55324:80;55441:21;55419:6;:18;;;:43;;;;;;;;;55415:73;;;-1:-1:-1;55471:17:0;;;;55464:24;;55415:73;55525:21;55503:6;:18;;;:43;;;;;;;;;55499:262;;;55563:14;55580:6;:15;52324:23;;;;;;;;;;;;;;;;;;;;;52314:34;;;;;;55580:15;;;;;;;;;;;;55563:32;;55630:1;55618:9;:13;55610:70;;;;-1:-1:-1;;;55610:70:0;;;;;;;;;50319:4;55702:33;55706:9;55717:6;:17;;;55702:3;:33::i;:::-;:47;;;;;;55695:54;;;;;64534:198;64586:4;64607:6;64603:20;;-1:-1:-1;64622:1:0;64615:8;;64603:20;64643:5;;;64647:1;64643;:5;:1;64667:5;;;;;:10;64659:46;;;;-1:-1:-1;;;64659:46:0;;;;;;;;48407:123;48496:25;:15;:25;;48407:123::o;59943:1619::-;60067:4;60085:23;60110;60135:17;60156:24;60173:6;60156:16;:24::i;:::-;60084:96;;;;;;60285:12;60267:15;:30;60259:69;;;;-1:-1:-1;;;60259:69:0;;;;;;;;;60358:15;:30;;;60558:40;;:::i;:::-;60601:86;;;;;;;;60674:11;60652:18;60631;:39;60630:55;;;;;;-1:-1:-1;;;;;60601:86:0;;;;60558:129;;60698:28;60729:30;:12;:28;:30::i;:::-;60698:61;;60770:26;60799:46;60803:23;60828:16;60799:3;:46::i;:::-;60770:75;;60856:16;61090:6;:24;;;61086:350;;;61294:6;:15;;;61270:21;:39;;;;;;61256:53;;61086:350;;;50427:4;50319;61356:43;61360:21;61383:6;:15;;;61356:3;:43::i;:::-;:57;;;;;;:68;;;;;;61342:82;;61086:350;61453:70;61472:6;61480:11;61493:12;61507:15;61453:70;;;;;;;;;;;;;;;;;;61543:11;59943:1619;-1:-1:-1;;;;;;;;;;;59943:1619:0:o;58511:339::-;58596:4;58617:17;;58613:207;;58651:16;58697:13;58670:24;58674:11;58687:6;58670:3;:24::i;:::-;:40;;;;;;58651:59;;58747:21;58732:11;:36;;:76;;;;;58787:21;58772:11;:36;;58732:76;58725:83;;;;;58613:207;-1:-1:-1;58837:5:0;58511:339;;;;:::o;61750:1045::-;61821:4;61827;61833;61850:18;61871:6;:17;;;61850:38;;61899:20;61922:30;61945:6;61922:22;:30::i;:::-;61899:53;;61965:33;;:::i;:::-;-1:-1:-1;62001:27:0;;;;:15;:27;;;;;;;;;61965:63;;;;;;;;;;;;;;;;;;;;;;;;;62162:15;:42;62234:12;62219:27;;62215:466;;62303:24;;;62263:27;;;:15;:27;;;;;;;;:64;;;62376:18;;;;;62342:31;;;;:52;62411:15;:27;;;;;;;62451:15;62411:55;;;62481:31;;:49;;;62571:17;;;;62590:24;;62633:18;;62550:119;;62571:17;;62550:119;;;;62590:24;62515:15;;62550:119;;;;;;;;;;62215:466;-1:-1:-1;;62716:27:0;;;;:15;:27;;;;;;:31;;;;62749:37;;62716:27;;:31;;-1:-1:-1;62749:37:0;;-1:-1:-1;61750:1045:0;-1:-1:-1;;61750:1045:0:o;47742:383::-;48090:7;48101:16;-1:-1:-1;;;;;48085:13:0;;;:32;;47742:383::o;58951:371::-;59033:4;59051:21;59074;59100:68;59147:6;:20;;;59100:46;:68::i;:::-;59050:118;;;;;59183:6;:24;;;59179:136;;;59231:16;-1:-1:-1;59224:23:0;;-1:-1:-1;59224:23:0;59179:136;-1:-1:-1;59287:16:0;-1:-1:-1;59280:23:0;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;456:363::-;;;597:3;590:4;582:6;578:17;574:27;564:2;;-1:-1;;605:12;564:2;-1:-1;635:20;;675:18;664:30;;661:2;;;-1:-1;;697:12;661:2;741:4;733:6;729:17;717:29;;792:3;741:4;;776:6;772:17;733:6;758:32;;755:41;752:2;;;809:1;;799:12;752:2;557:262;;;;;;1495:440;;1596:3;1589:4;1581:6;1577:17;1573:27;1563:2;;-1:-1;;1604:12;1563:2;1651:6;1638:20;1673:64;1688:48;1729:6;1688:48;;;1673:64;;;1664:73;;1757:6;1750:5;1743:21;1861:3;1793:4;1852:6;1785;1843:16;;1840:25;1837:2;;;1878:1;;1868:12;1837:2;32553:6;1793:4;1785:6;1781:17;1793:4;1819:5;1815:16;32530:30;32609:1;32591:16;;;1793:4;32591:16;32584:27;1819:5;1556:379;-1:-1;;1556:379;2395:444;;2508:3;2501:4;2493:6;2489:17;2485:27;2475:2;;-1:-1;;2516:12;2475:2;2556:6;2550:13;2578:65;2593:49;2635:6;2593:49;;2578:65;2569:74;;2663:6;2656:5;2649:21;2767:3;2699:4;2758:6;2691;2749:16;;2746:25;2743:2;;;2784:1;;2774:12;2743:2;2794:39;2826:6;2699:4;2725:5;2721:16;2699:4;2691:6;2687:17;2794:39;;;;2468:371;;;;;3681:241;;3785:2;3773:9;3764:7;3760:23;3756:32;3753:2;;;-1:-1;;3791:12;3753:2;85:6;72:20;97:33;124:5;97:33;;3929:263;;4044:2;4032:9;4023:7;4019:23;4015:32;4012:2;;;-1:-1;;4050:12;4012:2;226:6;220:13;238:33;265:5;238:33;;4199:1027;;;;;;;4476:2;4464:9;4455:7;4451:23;4447:32;4444:2;;;-1:-1;;4482:12;4444:2;4540:17;4527:31;4578:18;;4570:6;4567:30;4564:2;;;-1:-1;;4600:12;4564:2;4638:91;4721:7;4712:6;4701:9;4697:22;4638:91;;;4628:101;;-1:-1;4628:101;-1:-1;4794:2;4779:18;;4766:32;;-1:-1;4807:30;;;4804:2;;;-1:-1;;4840:12;4804:2;4878:91;4961:7;4952:6;4941:9;4937:22;4878:91;;;4868:101;;-1:-1;4868:101;-1:-1;5034:2;5019:18;;5006:32;;-1:-1;5047:30;;;5044:2;;;-1:-1;;5080:12;5044:2;;5118:92;5202:7;5193:6;5182:9;5178:22;5118:92;;;4438:788;;;;-1:-1;4438:788;;-1:-1;4438:788;;5108:102;;4438:788;-1:-1;;;4438:788;5233:241;;5337:2;5325:9;5316:7;5312:23;5308:32;5305:2;;;-1:-1;;5343:12;5305:2;-1:-1;1283:20;;5299:175;-1:-1;5299:175;5481:531;;;;5628:2;5616:9;5607:7;5603:23;5599:32;5596:2;;;-1:-1;;5634:12;5596:2;1437:6;1431:13;5686:74;;5797:2;5851:9;5847:22;1431:13;5805:74;;5916:2;5968:9;5964:22;3620:13;31987:4;34164:5;31976:16;34141:5;34138:33;34128:2;;-1:-1;;34175:12;34128:2;5924:72;;;;5590:422;;;;;;6019:574;;;6158:2;6146:9;6137:7;6133:23;6129:32;6126:2;;;-1:-1;;6164:12;6126:2;6222:17;6209:31;6260:18;;6252:6;6249:30;6246:2;;;-1:-1;;6282:12;6246:2;6312:62;6366:7;6357:6;6346:9;6342:22;6312:62;;;6302:72;;6439:2;6428:9;6424:18;6411:32;6397:46;;6260:18;6455:6;6452:30;6449:2;;;-1:-1;;6485:12;6449:2;;6515:62;6569:7;6560:6;6549:9;6545:22;6515:62;;;6505:72;;;6120:473;;;;;;6600:347;;6714:2;6702:9;6693:7;6689:23;6685:32;6682:2;;;-1:-1;;6720:12;6682:2;6778:17;6765:31;6816:18;6808:6;6805:30;6802:2;;;-1:-1;;6838:12;6802:2;6868:63;6923:7;6914:6;6903:9;6899:22;6868:63;;;6858:73;6676:271;-1:-1;;;;6676:271;6954:362;;7079:2;7067:9;7058:7;7054:23;7050:32;7047:2;;;-1:-1;;7085:12;7047:2;7136:17;7130:24;7174:18;7166:6;7163:30;7160:2;;;-1:-1;;7196:12;7160:2;7226:74;7292:7;7283:6;7272:9;7268:22;7226:74;;7323:514;;;7473:2;7461:9;7452:7;7448:23;7444:32;7441:2;;;-1:-1;;7479:12;7441:2;7530:17;7524:24;7568:18;7560:6;7557:30;7554:2;;;-1:-1;;7590:12;7554:2;7620:74;7686:7;7677:6;7666:9;7662:22;7620:74;;;7610:84;;;7731:2;7793:9;7789:22;369:13;387:41;422:5;387:41;;;7739:82;;;;7435:402;;;;;;7844:533;;;;7992:2;7980:9;7971:7;7967:23;7963:32;7960:2;;;-1:-1;;7998:12;7960:2;2931:6;2925:13;2943:33;2970:5;2943:33;;;8161:2;8211:22;;2925:13;8050:74;;-1:-1;2943:33;2925:13;2943:33;;;8280:2;8329:22;;3343:13;8169:74;;-1:-1;31790:10;31779:22;;33895:34;;33885:2;;-1:-1;;33933:12;8632:263;;8747:2;8735:9;8726:7;8722:23;8718:32;8715:2;;;-1:-1;;8753:12;8715:2;-1:-1;3203:13;;8709:186;-1:-1;8709:186;8902:261;;9016:2;9004:9;8995:7;8991:23;8987:32;8984:2;;;-1:-1;;9022:12;8984:2;3488:6;3482:13;31885:18;34044:5;31874:30;34020:5;34017:34;34007:2;;-1:-1;;34055:12;9170:103;-1:-1;;;;;31573:54;9231:37;;9225:48;9400:94;31147:13;31140:21;9455:34;;9449:45;10024:297;;30495:6;30490:3;30483:19;32553:6;32548:3;30532:4;30527:3;30523:14;32530:30;-1:-1;30532:4;32600:6;30527:3;32591:16;;32584:27;30532:4;33067:7;;33071:2;10307:6;33051:14;33047:28;30527:3;10276:39;;10269:46;;10124:197;;;;;;10665:347;;10810:5;30339:12;30495:6;30490:3;30483:19;10904:52;10949:6;30532:4;30527:3;30523:14;30532:4;10930:5;10926:16;10904:52;;;33067:7;33051:14;-1:-1;;33047:28;10968:39;;;;30532:4;10968:39;;10757:255;-1:-1;;10757:255;17560:275;;11182:5;30339:12;11294:52;11339:6;11334:3;11327:4;11320:5;11316:16;11294:52;;;11358:16;;;;;17696:139;-1:-1;;17696:139;17842:520;11683:66;11663:87;;11647:2;11769:12;;9673:37;;;;18325:12;;;18059:303;18369:381;-1:-1;;;12071:29;;12056:1;12119:11;;18558:192;18757:381;-1:-1;;;14493:26;;14478:1;14538:11;;18946:192;19145:222;-1:-1;;;;;31573:54;;;;9231:37;;19272:2;19257:18;;19243:124;19374:421;-1:-1;;;;;31573:54;;9231:37;;19549:2;19667;19652:18;;19645:48;;;19374:421;;19707:78;;19534:18;;19771:6;19707:78;;19802:210;31147:13;;31140:21;9455:34;;19923:2;19908:18;;19894:118;20019:548;9673:37;;;31987:4;31976:16;;;;20387:2;20372:18;;17513:35;20470:2;20455:18;;9673:37;20553:2;20538:18;;9673:37;20226:3;20211:19;;20197:370;20574:541;;20785:2;20806:17;20799:47;20860:86;20785:2;20774:9;20770:18;20932:6;20924;20860:86;;;20994:9;20988:4;20984:20;20979:2;20968:9;20964:18;20957:48;21019:86;21100:4;21091:6;21083;21019:86;;;21011:94;20756:359;-1:-1;;;;;;;20756:359;21405:421;;21580:2;21601:17;21594:47;21655:78;21580:2;21569:9;21565:18;21719:6;21655:78;;;21647:86;;9703:5;21812:2;21801:9;21797:18;9673:37;21551:275;;;;;;21833:532;;22036:2;22057:17;22050:47;22111:78;22036:2;22025:9;22021:18;22175:6;22111:78;;;22268:2;22253:18;;9673:37;;;;-1:-1;22351:2;22336:18;9673:37;22103:86;22007:358;-1:-1;22007:358;22372:644;;22603:3;22625:17;22618:47;22679:78;22603:3;22592:9;22588:19;22743:6;22679:78;;;22836:2;22821:18;;9673:37;;;;-1:-1;22919:2;22904:18;;9673:37;;;;23002:2;22987:18;;;9673:37;22671:86;22574:442;-1:-1;22574:442;23023:416;23223:2;23237:47;;;12369:2;23208:18;;;30483:19;12405:25;30523:14;;;12385:46;12450:12;;;23194:245;23446:416;23646:2;23660:47;;;12701:2;23631:18;;;30483:19;-1:-1;;;30523:14;;;12717:45;12781:12;;;23617:245;23869:416;24069:2;24083:47;;;13032:2;24054:18;;;30483:19;13068:34;30523:14;;;13048:55;-1:-1;;;13123:12;;;13116:40;13175:12;;;24040:245;24292:416;24492:2;24506:47;;;13426:2;24477:18;;;30483:19;13462:33;30523:14;;;13442:54;13515:12;;;24463:245;24715:416;24915:2;24929:47;;;13766:2;24900:18;;;30483:19;13802:28;30523:14;;;13782:49;13850:12;;;24886:245;25138:416;25338:2;25352:47;;;25323:18;;;30483:19;14137:34;30523:14;;;14117:55;14191:12;;;25309:245;25561:416;25761:2;25775:47;;;14788:2;25746:18;;;30483:19;14824:34;30523:14;;;14804:55;-1:-1;;;14879:12;;;14872:36;14927:12;;;25732:245;25984:416;26184:2;26198:47;;;15178:2;26169:18;;;30483:19;15214:34;30523:14;;;15194:55;-1:-1;;;15269:12;;;15262:27;15308:12;;;26155:245;26407:416;26607:2;26621:47;;;15559:2;26592:18;;;30483:19;15595:25;30523:14;;;15575:46;15640:12;;;26578:245;26830:335;15960:23;;-1:-1;;;;;31573:54;;;9231:37;;16137:4;16126:16;;;16120:23;31573:54;;;16197:14;;;9231:37;16297:4;16286:16;;;16280:23;16357:14;;;9673:37;16455:4;16444:16;;;16438:23;16515:14;;;9673:37;16616:4;16605:16;;16599:23;27013:3;26998:19;;;33172:1;33162:12;;33152:2;;33178:9;33152:2;32420:39;16616:4;16693:3;16689:14;10590:63;;16789:4;16782:5;16778:16;16772:23;16789:4;16853:3;16849:14;9673:37;16952:4;16945:5;16941:16;16935:23;16964:63;16952:4;17016:3;17012:14;16998:12;16964:63;;;;17119:4;17112:5;17108:16;17102:23;17131:57;17119:4;17177:3;17173:14;17159:12;17131:57;;27172:222;9673:37;;;27299:2;27284:18;;27270:124;27401:333;9673:37;;;27720:2;27705:18;;9673:37;27556:2;27541:18;;27527:207;27741:556;9673:37;;;28117:2;28102:18;;9673:37;;;;28200:2;28185:18;;9673:37;28283:2;28268:18;;9673:37;27952:3;27937:19;;27923:374;28304:506;;;28439:11;28426:25;28490:48;;28514:8;28498:14;28494:29;28490:48;28470:18;28466:73;28456:2;;-1:-1;;28543:12;28456:2;28584:18;28574:8;28570:33;28637:4;28624:18;28614:28;;28662:18;28654:6;28651:30;28648:2;;;-1:-1;;28684:12;28648:2;28529:4;28712:13;;-1:-1;;28498:14;28744:38;;;28734:49;;28731:2;;;28796:1;;28786:12;28817:507;;;28953:11;28940:25;28490:48;;29028:8;29012:14;29008:29;29004:48;28984:18;28980:73;28970:2;;-1:-1;;29057:12;29331:256;29393:2;29387:9;29419:17;;;29494:18;29479:34;;29515:22;;;29476:62;29473:2;;;29551:1;;29541:12;29473:2;29393;29560:22;29371:216;;-1:-1;29371:216;29594:321;;29737:18;29729:6;29726:30;29723:2;;;-1:-1;;29759:12;29723:2;-1:-1;33067:7;29813:17;-1:-1;;29809:33;29900:4;29890:15;;29660:255;32626:268;32691:1;32698:101;32712:6;32709:1;32706:13;32698:101;;;32779:11;;;32773:18;32760:11;;;32753:39;32734:2;32727:10;32698:101;;;32814:6;32811:1;32808:13;32805:2;;;32691:1;32870:6;32865:3;32861:16;32854:27;32805:2;;32675:219;;;;33201:117;-1:-1;;;;;31573:54;;33260:35;;33250:2;;33309:1;;33299:12;33250:2;33244:74;;33589:117;-1:-1;;;;;33676:5;31457:42;33651:5;33648:35;33638:2;;33697:1;;33687:12
Swarm Source
ipfs://8c2a73bb54dfe5f38570c033928b1040c23a175021e768c6af478edcf88cf761
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.