false
false
0

Contract Address Details

0x36825bf3Fbdf5a29E2d5148bfe7Dcf7B5639e320

Contract Name
PythUpgradable
Creator
0x783573–e64b81 at 0x58fd3b–349baf
Balance
0 EOS
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
63925333
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
PythUpgradable




Optimization enabled
true
Compiler version
v0.8.4+commit.c7e474f2




Optimization runs
2000
EVM Version
istanbul




Verified at
2023-12-26T01:44:29.775083Z

project:/contracts/pyth/PythUpgradable.sol

Sol2uml
new
// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
import "./Pyth.sol";
import "./PythInternalStructs.sol";
import "./PythGetters.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "./PythGovernance.sol";
import "./Pyth.sol";
import "@pythnetwork/pyth-sdk-solidity/PythErrors.sol";
contract PythUpgradable is
Initializable,
OwnableUpgradeable,
UUPSUpgradeable,
Pyth,
PythGovernance
{
function initialize(
address wormhole,
uint16[] calldata dataSourceEmitterChainIds,
bytes32[] calldata dataSourceEmitterAddresses,
uint16 governanceEmitterChainId,
bytes32 governanceEmitterAddress,
uint64 governanceInitialSequence,
uint validTimePeriodSeconds,
uint singleUpdateFeeInWei
) public initializer {
__Ownable_init();
__UUPSUpgradeable_init();
Pyth._initialize(
wormhole,
dataSourceEmitterChainIds,
dataSourceEmitterAddresses,
governanceEmitterChainId,
governanceEmitterAddress,
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@pythnetwork/pyth-sdk-solidity/PythErrors.sol

// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
library PythErrors {
// Function arguments are invalid (e.g., the arguments lengths mismatch)
// Signature: 0xa9cb9e0d
error InvalidArgument();
// Update data is coming from an invalid data source.
// Signature: 0xe60dce71
error InvalidUpdateDataSource();
// Update data is invalid (e.g., deserialization error)
// Signature: 0xe69ffece
error InvalidUpdateData();
// Insufficient fee is paid to the method.
// Signature: 0x025dbdd4
error InsufficientFee();
// There is no fresh update, whereas expected fresh updates.
// Signature: 0xde2c57fa
error NoFreshUpdate();
// There is no price feed found within the given range or it does not exists.
// Signature: 0x45805f5d
error PriceFeedNotFoundWithinRange();
// Price feed not found or it is not pushed on-chain yet.
// Signature: 0x14aebe68
error PriceFeedNotFound();
// Requested price is stale.
// Signature: 0x19abf40e
error StalePrice();
// Given message is not a valid Wormhole VAA.
// Signature: 0x2acbe915
error InvalidWormholeVaa();
// Governance message is invalid (e.g., deserialization error).
// Signature: 0x97363b35
error InvalidGovernanceMessage();
// Governance message is not for this contract.
// Signature: 0x63daeb77
error InvalidGovernanceTarget();
// Governance message is coming from an invalid data source.
// Signature: 0x360f2d87
error InvalidGovernanceDataSource();
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)
pragma solidity ^0.8.2;
import "../beacon/IBeaconUpgradeable.sol";
import "../../interfaces/draft-IERC1822Upgradeable.sol";
import "../../utils/AddressUpgradeable.sol";
import "../../utils/StorageSlotUpgradeable.sol";
import "../utils/Initializable.sol";
/**
* @dev This abstract contract provides getters and event emitting update functions for
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
*
* _Available since v4.1._
*
* @custom:oz-upgrades-unsafe-allow delegatecall
*/
abstract contract ERC1967UpgradeUpgradeable is Initializable {
function __ERC1967Upgrade_init() internal onlyInitializing {
}
function __ERC1967Upgrade_init_unchained() internal onlyInitializing {
}
// This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
/**
* @dev Emitted when the implementation is upgraded.
*/
event Upgraded(address indexed implementation);
/**
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)
pragma solidity ^0.8.0;
import "../../interfaces/draft-IERC1822Upgradeable.sol";
import "../ERC1967/ERC1967UpgradeUpgradeable.sol";
import "./Initializable.sol";
/**
* @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an
* {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.
*
* A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is
* reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing
* `UUPSUpgradeable` with a custom implementation of upgrades.
*
* The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.
*
* _Available since v4.1._
*/
abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {
function __UUPSUpgradeable_init() internal onlyInitializing {
}
function __UUPSUpgradeable_init_unchained() internal onlyInitializing {
}
/// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
address private immutable __self = address(this);
/**
* @dev Check that the execution is being performed through a delegatecall call and that the execution context is
* a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case
* for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a
* function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to
* fail.
*/
modifier onlyProxy() {
require(address(this) != __self, "Function must be called through delegatecall");
require(_getImplementation() == __self, "Function must be called through active proxy");
_;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/libraries/MerkleTree.sol

// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
import "./external/UnsafeCalldataBytesLib.sol";
/**
* @dev This library provides methods to construct and verify Merkle Tree proofs efficiently.
*
*/
library MerkleTree {
uint8 constant MERKLE_LEAF_PREFIX = 0;
uint8 constant MERKLE_NODE_PREFIX = 1;
uint8 constant MERKLE_EMPTY_LEAF_PREFIX = 2;
function hash(bytes memory input) internal pure returns (bytes20) {
return bytes20(keccak256(input));
}
function emptyLeafHash() internal pure returns (bytes20) {
return hash(abi.encodePacked(MERKLE_EMPTY_LEAF_PREFIX));
}
function leafHash(bytes memory data) internal pure returns (bytes20) {
return hash(abi.encodePacked(MERKLE_LEAF_PREFIX, data));
}
function nodeHash(
bytes20 childA,
bytes20 childB
) internal pure returns (bytes20) {
if (childA > childB) {
(childA, childB) = (childB, childA);
}
return hash(abi.encodePacked(MERKLE_NODE_PREFIX, childA, childB));
}
/// @notice Verify Merkle Tree proof for given leaf data based on data on memory.
/// @dev To optimize gas usage, this method doesn't take the proof as a bytes array
/// but rather takes the encoded proof and the offset of the proof in the
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@pythnetwork/pyth-sdk-solidity/AbstractPyth.sol

// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;
import "./PythStructs.sol";
import "./IPyth.sol";
import "./PythErrors.sol";
abstract contract AbstractPyth is IPyth {
/// @notice Returns the price feed with given id.
/// @dev Reverts if the price does not exist.
/// @param id The Pyth Price Feed ID of which to fetch the PriceFeed.
function queryPriceFeed(
bytes32 id
) public view virtual returns (PythStructs.PriceFeed memory priceFeed);
/// @notice Returns true if a price feed with the given id exists.
/// @param id The Pyth Price Feed ID of which to check its existence.
function priceFeedExists(
bytes32 id
) public view virtual returns (bool exists);
function getValidTimePeriod()
public
view
virtual
override
returns (uint validTimePeriod);
function getPrice(
bytes32 id
) external view virtual override returns (PythStructs.Price memory price) {
return getPriceNoOlderThan(id, getValidTimePeriod());
}
function getEmaPrice(
bytes32 id
) external view virtual override returns (PythStructs.Price memory price) {
return getEmaPriceNoOlderThan(id, getValidTimePeriod());
}
function getPriceUnsafe(
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/pyth/PythState.sol

// contracts/State.sol
// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
import "./PythInternalStructs.sol";
import "./PythDeprecatedStructs.sol";
contract PythStorage {
struct State {
address wormhole;
uint16 _deprecatedPyth2WormholeChainId; // Replaced by validDataSources/isValidDataSource
bytes32 _deprecatedPyth2WormholeEmitter; // Ditto
// After a backward-incompatible change in PriceFeed this mapping got deprecated.
mapping(bytes32 => PythDeprecatedStructs.DeprecatedPriceInfoV1) _deprecatedLatestPriceInfoV1;
// For tracking all active emitter/chain ID pairs
PythInternalStructs.DataSource[] validDataSources;
// (chainId, emitterAddress) => isValid; takes advantage of
// constant-time mapping lookup for VM verification
mapping(bytes32 => bool) isValidDataSource;
uint singleUpdateFeeInWei;
/// Maximum acceptable time period before price is considered to be stale.
/// This includes attestation delay, block time, and potential clock drift
/// between the source/target chains.
uint validTimePeriodSeconds;
// Governance data source. VAA messages from this source can change this contract
// state. e.g., upgrade the contract, change the valid data sources, and more.
PythInternalStructs.DataSource governanceDataSource;
// Sequence number of the last executed governance message. Any governance message
// with a lower or equal sequence number will be discarded. This prevents double-execution,
// and also makes sure that messages are executed in the right order.
uint64 lastExecutedGovernanceSequence;
// After a backward-incompatible change in PriceFeed this mapping got deprecated.
mapping(bytes32 => PythDeprecatedStructs.DeprecatedPriceInfoV2) _deprecatedLatestPriceInfoV2;
// Index of the governance data source, increased each time the governance data source
// changes.
uint32 governanceDataSourceIndex;
// Mapping of cached price information
// priceId => PriceInfo
mapping(bytes32 => PythInternalStructs.PriceInfo) latestPriceInfo;
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/libraries/external/UnsafeBytesLib.sol

// SPDX-License-Identifier: Unlicense
/*
* @title Solidity Bytes Arrays Utils
* @author Gonçalo Sá <goncalo.sa@consensys.net>
*
* @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
* The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
*
* @notice This is the **unsafe** version of BytesLib which removed all the checks (out of bound, ...)
* to be more gas efficient.
*/
pragma solidity >=0.8.0 <0.9.0;
library UnsafeBytesLib {
function concat(
bytes memory _preBytes,
bytes memory _postBytes
) internal pure returns (bytes memory) {
bytes memory tempBytes;
assembly {
// Get a location of some free memory and store it in tempBytes as
// Solidity does for memory variables.
tempBytes := mload(0x40)
// Store the length of the first bytes array at the beginning of
// the memory for tempBytes.
let length := mload(_preBytes)
mstore(tempBytes, length)
// Maintain a memory counter for the current write location in the
// temp bytes array by adding the 32 bytes for the array length to
// the starting location.
let mc := add(tempBytes, 0x20)
// Stop copying when the memory counter reaches the length of the
// first bytes array.
let end := add(mc, length)
for {
// Initialize a copy counter to the start of the _preBytes data,
// 32 bytes into its memory.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)
pragma solidity ^0.8.0;
/**
* @dev This is the interface that {BeaconProxy} expects of its beacon.
*/
interface IBeaconUpgradeable {
/**
* @dev Must return an address that can be used as a delegate call target.
*
* {BeaconProxy} will check that this address is a contract.
*/
function implementation() external view returns (address);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@pythnetwork/pyth-sdk-solidity/IPythEvents.sol

// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;
/// @title IPythEvents contains the events that Pyth contract emits.
/// @dev This interface can be used for listening to the updates for off-chain and testing purposes.
interface IPythEvents {
/// @dev Emitted when the price feed with `id` has received a fresh update.
/// @param id The Pyth Price Feed ID.
/// @param publishTime Publish time of the given price update.
/// @param price Price of the given price update.
/// @param conf Confidence interval of the given price update.
event PriceFeedUpdate(
bytes32 indexed id,
uint64 publishTime,
int64 price,
uint64 conf
);
/// @dev Emitted when a batch price update is processed successfully.
/// @param chainId ID of the source chain that the batch price update comes from.
/// @param sequenceNumber Sequence number of the batch price update.
event BatchPriceFeedUpdate(uint16 chainId, uint64 sequenceNumber);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/pyth/PythGovernanceInstructions.sol

// contracts/GovernanceStructs.sol
// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
import "../libraries/external/BytesLib.sol";
import "./PythInternalStructs.sol";
import "@pythnetwork/pyth-sdk-solidity/PythErrors.sol";
/**
* @dev `PythGovernanceInstructions` defines a set of structs and parsing functions
* for Pyth governance instructions.
*/
contract PythGovernanceInstructions {
using BytesLib for bytes;
// Magic is `PTGM` encoded as a 4 byte data: Pyth Governance Message
uint32 constant MAGIC = 0x5054474d;
enum GovernanceModule {
Executor, // 0
Target // 1
}
GovernanceModule constant MODULE = GovernanceModule.Target;
enum GovernanceAction {
UpgradeContract, // 0
AuthorizeGovernanceDataSourceTransfer, // 1
SetDataSources, // 2
SetFee, // 3
SetValidPeriod, // 4
RequestGovernanceDataSourceTransfer, // 5
SetWormholeAddress // 6
}
struct GovernanceInstruction {
GovernanceModule module;
GovernanceAction action;
uint16 targetChainId;
bytes payload;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)
pragma solidity ^0.8.0;
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC1967 implementation slot:
* ```
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*
* _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
*/
library StorageSlotUpgradeable {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/interfaces/draft-IERC1822.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)
pragma solidity ^0.8.0;
/**
* @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
* proxy whose upgrades are fully controlled by the current implementation.
*/
interface IERC1822Proxiable {
/**
* @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
* address.
*
* IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
* function revert if invoked through a proxy.
*/
function proxiableUUID() external view returns (bytes32);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)
pragma solidity ^0.8.2;
import "../beacon/IBeacon.sol";
import "../../interfaces/draft-IERC1822.sol";
import "../../utils/Address.sol";
import "../../utils/StorageSlot.sol";
/**
* @dev This abstract contract provides getters and event emitting update functions for
* https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
*
* _Available since v4.1._
*
* @custom:oz-upgrades-unsafe-allow delegatecall
*/
abstract contract ERC1967Upgrade {
// This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
/**
* @dev Emitted when the implementation is upgraded.
*/
event Upgraded(address indexed implementation);
/**
* @dev Returns the current implementation address.
*/
function _getImplementation() internal view returns (address) {
return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/StorageSlot.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)
pragma solidity ^0.8.0;
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC1967 implementation slot:
* ```
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*
* _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
*/
library StorageSlot {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/pyth/Pyth.sol

// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
import "../libraries/external/UnsafeBytesLib.sol";
import "@pythnetwork/pyth-sdk-solidity/AbstractPyth.sol";
import "@pythnetwork/pyth-sdk-solidity/PythStructs.sol";
import "@pythnetwork/pyth-sdk-solidity/PythErrors.sol";
import "./PythAccumulator.sol";
import "./PythGetters.sol";
import "./PythSetters.sol";
import "./PythInternalStructs.sol";
abstract contract Pyth is
PythGetters,
PythSetters,
AbstractPyth,
PythAccumulator
{
function _initialize(
address wormhole,
uint16[] calldata dataSourceEmitterChainIds,
bytes32[] calldata dataSourceEmitterAddresses,
uint16 governanceEmitterChainId,
bytes32 governanceEmitterAddress,
uint64 governanceInitialSequence,
uint validTimePeriodSeconds,
uint singleUpdateFeeInWei
) internal {
setWormhole(wormhole);
if (
dataSourceEmitterChainIds.length !=
dataSourceEmitterAddresses.length
) revert PythErrors.InvalidArgument();
for (uint i = 0; i < dataSourceEmitterChainIds.length; i++) {
PythInternalStructs.DataSource memory ds = PythInternalStructs
.DataSource(
dataSourceEmitterChainIds[i],
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/pyth/PythDeprecatedStructs.sol

// contracts/PythDeprecatedStructs.sol
// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
// This contract contains self contained structs of all our deprecated structs.
// When deprecating the structs, make sure that there be no dependency to
// the sdk as the sdk might change.
//
// By storing these structs, we keep deprecated fields definitions correctly. Then,
// in the future, we can use them to cleanup their storage and redeem some gas back.
contract PythDeprecatedStructs {
// Structs related to the _deprecatedLatestPriceInfoV1
enum DeprecatedPriceStatusV1 {
UNKNOWN,
TRADING,
HALTED,
AUCTION
}
struct DeprecatedPriceFeedV1 {
// The price ID.
bytes32 id;
// Product account key.
bytes32 productId;
// The current price.
int64 price;
// Confidence interval around the price.
uint64 conf;
// Price exponent.
int32 expo;
// Status of price.
DeprecatedPriceStatusV1 status;
// Maximum number of allowed publishers that can contribute to a price.
uint32 maxNumPublishers;
// Number of publishers that made up current aggregate.
uint32 numPublishers;
// Exponentially moving average price.
int64 emaPrice;
// Exponentially moving average confidence interval.
uint64 emaConf;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)
pragma solidity ^0.8.0;
/**
* @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
* proxy whose upgrades are fully controlled by the current implementation.
*/
interface IERC1822ProxiableUpgradeable {
/**
* @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
* address.
*
* IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
* bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
* function revert if invoked through a proxy.
*/
function proxiableUUID() external view returns (bytes32);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/utils/Address.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/wormhole/interfaces/IWormhole.sol

// contracts/Messages.sol
// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
import "../Structs.sol";
interface IWormhole is Structs {
event LogMessagePublished(
address indexed sender,
uint64 sequence,
uint32 nonce,
bytes payload,
uint8 consistencyLevel
);
function publishMessage(
uint32 nonce,
bytes memory payload,
uint8 consistencyLevel
) external payable returns (uint64 sequence);
function parseAndVerifyVM(
bytes calldata encodedVM
)
external
view
returns (Structs.VM memory vm, bool valid, string memory reason);
function verifyVM(
Structs.VM memory vm
) external view returns (bool valid, string memory reason);
function verifySignatures(
bytes32 hash,
Structs.Signature[] memory signatures,
Structs.GuardianSet memory guardianSet
) external pure returns (bool valid, string memory reason);
function parseVM(
bytes memory encodedVM
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/wormhole/Structs.sol

// contracts/Structs.sol
// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
interface Structs {
struct Provider {
uint16 chainId;
uint16 governanceChainId;
bytes32 governanceContract;
}
struct GuardianSet {
address[] keys;
uint32 expirationTime;
}
struct Signature {
bytes32 r;
bytes32 s;
uint8 v;
uint8 guardianIndex;
}
struct VM {
uint8 version;
uint32 timestamp;
uint32 nonce;
uint16 emitterChainId;
bytes32 emitterAddress;
uint64 sequence;
uint8 consistencyLevel;
bytes payload;
uint32 guardianSetIndex;
Signature[] signatures;
bytes32 hash;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@pythnetwork/pyth-sdk-solidity/IPyth.sol

// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;
import "./PythStructs.sol";
import "./IPythEvents.sol";
/// @title Consume prices from the Pyth Network (https://pyth.network/).
/// @dev Please refer to the guidance at https://docs.pyth.network/documentation/pythnet-price-feeds/best-practices for how to consume prices safely.
/// @author Pyth Data Association
interface IPyth is IPythEvents {
/// @notice Returns the period (in seconds) that a price feed is considered valid since its publish time
function getValidTimePeriod() external view returns (uint validTimePeriod);
/// @notice Returns the price and confidence interval.
/// @dev Reverts if the price has not been updated within the last `getValidTimePeriod()` seconds.
/// @param id The Pyth Price Feed ID of which to fetch the price and confidence interval.
/// @return price - please read the documentation of PythStructs.Price to understand how to use this safely.
function getPrice(
bytes32 id
) external view returns (PythStructs.Price memory price);
/// @notice Returns the exponentially-weighted moving average price and confidence interval.
/// @dev Reverts if the EMA price is not available.
/// @param id The Pyth Price Feed ID of which to fetch the EMA price and confidence interval.
/// @return price - please read the documentation of PythStructs.Price to understand how to use this safely.
function getEmaPrice(
bytes32 id
) external view returns (PythStructs.Price memory price);
/// @notice Returns the price of a price feed without any sanity checks.
/// @dev This function returns the most recent price update in this contract without any recency checks.
/// This function is unsafe as the returned price update may be arbitrarily far in the past.
///
/// Users of this function should check the `publishTime` in the price to ensure that the returned price is
/// sufficiently recent for their application. If you are considering using this function, it may be
/// safer / easier to use either `getPrice` or `getPriceNoOlderThan`.
/// @return price - please read the documentation of PythStructs.Price to understand how to use this safely.
function getPriceUnsafe(
bytes32 id
) external view returns (PythStructs.Price memory price);
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/libraries/external/BytesLib.sol

// SPDX-License-Identifier: Unlicense
/*
* @title Solidity Bytes Arrays Utils
* @author Gonçalo Sá <goncalo.sa@consensys.net>
*
* @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
* The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
*/
pragma solidity >=0.8.0 <0.9.0;
library BytesLib {
function concat(
bytes memory _preBytes,
bytes memory _postBytes
) internal pure returns (bytes memory) {
bytes memory tempBytes;
assembly {
// Get a location of some free memory and store it in tempBytes as
// Solidity does for memory variables.
tempBytes := mload(0x40)
// Store the length of the first bytes array at the beginning of
// the memory for tempBytes.
let length := mload(_preBytes)
mstore(tempBytes, length)
// Maintain a memory counter for the current write location in the
// temp bytes array by adding the 32 bytes for the array length to
// the starting location.
let mc := add(tempBytes, 0x20)
// Stop copying when the memory counter reaches the length of the
// first bytes array.
let end := add(mc, length)
for {
// Initialize a copy counter to the start of the _preBytes data,
// 32 bytes into its memory.
let cc := add(_preBytes, 0x20)
} lt(mc, end) {
// Increase both counters by 32 bytes each iteration.
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/pyth/PythSetters.sol

// contracts/Setters.sol
// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
import "./PythState.sol";
contract PythSetters is PythState {
function setWormhole(address wh) internal {
_state.wormhole = payable(wh);
}
function setLatestPriceInfo(
bytes32 priceId,
PythInternalStructs.PriceInfo memory info
) internal {
_state.latestPriceInfo[priceId] = info;
}
function setSingleUpdateFeeInWei(uint fee) internal {
_state.singleUpdateFeeInWei = fee;
}
function setValidTimePeriodSeconds(uint validTimePeriodSeconds) internal {
_state.validTimePeriodSeconds = validTimePeriodSeconds;
}
function setGovernanceDataSource(
PythInternalStructs.DataSource memory newDataSource
) internal {
_state.governanceDataSource = newDataSource;
}
function setLastExecutedGovernanceSequence(uint64 sequence) internal {
_state.lastExecutedGovernanceSequence = sequence;
}
function setGovernanceDataSourceIndex(uint32 newIndex) internal {
_state.governanceDataSourceIndex = newIndex;
}
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/pyth/PythAccumulator.sol

// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
import "../libraries/external/UnsafeBytesLib.sol";
import "../libraries/external/UnsafeCalldataBytesLib.sol";
import "@pythnetwork/pyth-sdk-solidity/AbstractPyth.sol";
import "@pythnetwork/pyth-sdk-solidity/PythStructs.sol";
import "@pythnetwork/pyth-sdk-solidity/PythErrors.sol";
import "./PythGetters.sol";
import "./PythSetters.sol";
import "./PythInternalStructs.sol";
import "../libraries/MerkleTree.sol";
abstract contract PythAccumulator is PythGetters, PythSetters, AbstractPyth {
uint32 constant ACCUMULATOR_MAGIC = 0x504e4155; // Stands for PNAU (Pyth Network Accumulator Update)
uint32 constant ACCUMULATOR_WORMHOLE_MAGIC = 0x41555756; // Stands for AUWV (Accumulator Update Wormhole Verficiation)
uint8 constant MINIMUM_ALLOWED_MINOR_VERSION = 0;
uint8 constant MAJOR_VERSION = 1;
enum UpdateType {
WormholeMerkle
}
enum MessageType {
PriceFeed
}
// This method is also used by batch attestation but moved here
// as the batch attestation will deprecate soon.
function parseAndVerifyPythVM(
bytes calldata encodedVm
) internal view returns (IWormhole.VM memory vm) {
{
bool valid;
(vm, valid, ) = wormhole().parseAndVerifyVM(encodedVm);
if (!valid) revert PythErrors.InvalidWormholeVaa();
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/pyth/PythGetters.sol

// contracts/Getters.sol
// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
import "../wormhole/interfaces/IWormhole.sol";
import "./PythInternalStructs.sol";
import "./PythState.sol";
contract PythGetters is PythState {
function wormhole() public view returns (IWormhole) {
return IWormhole(_state.wormhole);
}
function latestPriceInfo(
bytes32 priceId
) internal view returns (PythInternalStructs.PriceInfo memory info) {
return _state.latestPriceInfo[priceId];
}
function latestPriceInfoPublishTime(
bytes32 priceId
) public view returns (uint64) {
return _state.latestPriceInfo[priceId].publishTime;
}
function hashDataSource(
PythInternalStructs.DataSource memory ds
) public pure returns (bytes32) {
return keccak256(abi.encodePacked(ds.chainId, ds.emitterAddress));
}
function isValidDataSource(
uint16 dataSourceChainId,
bytes32 dataSourceEmitterAddress
) public view returns (bool) {
return
_state.isValidDataSource[
keccak256(
abi.encodePacked(
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/pyth/PythInternalStructs.sol

// contracts/Structs.sol
// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
import "../libraries/external/BytesLib.sol";
import "@pythnetwork/pyth-sdk-solidity/PythStructs.sol";
contract PythInternalStructs {
using BytesLib for bytes;
struct PriceInfo {
// slot 1
uint64 publishTime;
int32 expo;
int64 price;
uint64 conf;
// slot 2
int64 emaPrice;
uint64 emaConf;
}
struct DataSource {
uint16 chainId;
bytes32 emitterAddress;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/pyth/PythGovernance.sol

// contracts/Governance.sol
// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.0;
import "./PythGovernanceInstructions.sol";
import "./PythInternalStructs.sol";
import "./PythGetters.sol";
import "./PythSetters.sol";
import "@pythnetwork/pyth-sdk-solidity/PythErrors.sol";
import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol";
/**
* @dev `Governance` defines a means to enacting changes to the Pyth contract.
*/
abstract contract PythGovernance is
PythGetters,
PythSetters,
PythGovernanceInstructions
{
event ContractUpgraded(
address oldImplementation,
address newImplementation
);
event GovernanceDataSourceSet(
PythInternalStructs.DataSource oldDataSource,
PythInternalStructs.DataSource newDataSource,
uint64 initialSequence
);
event DataSourcesSet(
PythInternalStructs.DataSource[] oldDataSources,
PythInternalStructs.DataSource[] newDataSources
);
event FeeSet(uint oldFee, uint newFee);
event ValidPeriodSet(uint oldValidPeriod, uint newValidPeriod);
event WormholeAddressSet(
address oldWormholeAddress,
address newWormholeAddress
);
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@pythnetwork/pyth-sdk-solidity/PythStructs.sol

// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;
contract PythStructs {
// A price with a degree of uncertainty, represented as a price +- a confidence interval.
//
// The confidence interval roughly corresponds to the standard error of a normal distribution.
// Both the price and confidence are stored in a fixed-point numeric representation,
// `x * (10^expo)`, where `expo` is the exponent.
//
// Please refer to the documentation at https://docs.pyth.network/documentation/pythnet-price-feeds/best-practices for how
// to how this price safely.
struct Price {
// Price
int64 price;
// Confidence interval around the price
uint64 conf;
// Price exponent
int32 expo;
// Unix timestamp describing when the price was published
uint publishTime;
}
// PriceFeed represents a current aggregate price from pyth publisher feeds.
struct PriceFeed {
// The price ID.
bytes32 id;
// Latest available price
Price price;
// Latest available exponentially-weighted moving average price
Price emaPrice;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

project:/contracts/libraries/external/UnsafeCalldataBytesLib.sol

// SPDX-License-Identifier: Unlicense
/*
* @title Solidity Bytes Arrays Utils
* @author Gonçalo Sá <goncalo.sa@consensys.net>
*
* @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
* The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
*
* @notice This is the **unsafe** version of BytesLib which removed all the checks (out of bound, ...)
* to be more gas efficient.
*/
pragma solidity >=0.8.0 <0.9.0;
library UnsafeCalldataBytesLib {
function slice(
bytes calldata _bytes,
uint256 _start,
uint256 _length
) internal pure returns (bytes calldata) {
return _bytes[_start:_start + _length];
}
function sliceFrom(
bytes calldata _bytes,
uint256 _start
) internal pure returns (bytes calldata) {
return _bytes[_start:_bytes.length];
}
function toAddress(
bytes calldata _bytes,
uint256 _start
) internal pure returns (address) {
address tempAddress;
assembly {
tempAddress := shr(96, calldataload(add(_bytes.offset, _start)))
}
return tempAddress;
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@openzeppelin/contracts/proxy/beacon/IBeacon.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)
pragma solidity ^0.8.0;
/**
* @dev This is the interface that {BeaconProxy} expects of its beacon.
*/
interface IBeacon {
/**
* @dev Must return an address that can be used as a delegate call target.
*
* {BeaconProxy} will check that this address is a contract.
*/
function implementation() external view returns (address);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Compiler Settings

{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":2000,"enabled":true},"libraries":{},"evmVersion":"istanbul"}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"InsufficientFee","inputs":[]},{"type":"error","name":"InvalidArgument","inputs":[]},{"type":"error","name":"InvalidGovernanceDataSource","inputs":[]},{"type":"error","name":"InvalidGovernanceMessage","inputs":[]},{"type":"error","name":"InvalidGovernanceTarget","inputs":[]},{"type":"error","name":"InvalidUpdateData","inputs":[]},{"type":"error","name":"InvalidUpdateDataSource","inputs":[]},{"type":"error","name":"InvalidWormholeAddressToSet","inputs":[]},{"type":"error","name":"InvalidWormholeVaa","inputs":[]},{"type":"error","name":"NoFreshUpdate","inputs":[]},{"type":"error","name":"OldGovernanceMessage","inputs":[]},{"type":"error","name":"PriceFeedNotFound","inputs":[]},{"type":"error","name":"PriceFeedNotFoundWithinRange","inputs":[]},{"type":"error","name":"StalePrice","inputs":[]},{"type":"event","name":"AdminChanged","inputs":[{"type":"address","name":"previousAdmin","internalType":"address","indexed":false},{"type":"address","name":"newAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"BatchPriceFeedUpdate","inputs":[{"type":"uint16","name":"chainId","internalType":"uint16","indexed":false},{"type":"uint64","name":"sequenceNumber","internalType":"uint64","indexed":false}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"type":"address","name":"beacon","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"ContractUpgraded","inputs":[{"type":"address","name":"oldImplementation","internalType":"address","indexed":false},{"type":"address","name":"newImplementation","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"DataSourcesSet","inputs":[{"type":"tuple[]","name":"oldDataSources","internalType":"struct PythInternalStructs.DataSource[]","indexed":false,"components":[{"type":"uint16","name":"chainId","internalType":"uint16"},{"type":"bytes32","name":"emitterAddress","internalType":"bytes32"}]},{"type":"tuple[]","name":"newDataSources","internalType":"struct PythInternalStructs.DataSource[]","indexed":false,"components":[{"type":"uint16","name":"chainId","internalType":"uint16"},{"type":"bytes32","name":"emitterAddress","internalType":"bytes32"}]}],"anonymous":false},{"type":"event","name":"FeeSet","inputs":[{"type":"uint256","name":"oldFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"newFee","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"GovernanceDataSourceSet","inputs":[{"type":"tuple","name":"oldDataSource","internalType":"struct PythInternalStructs.DataSource","indexed":false,"components":[{"type":"uint16","name":"chainId","internalType":"uint16"},{"type":"bytes32","name":"emitterAddress","internalType":"bytes32"}]},{"type":"tuple","name":"newDataSource","internalType":"struct PythInternalStructs.DataSource","indexed":false,"components":[{"type":"uint16","name":"chainId","internalType":"uint16"},{"type":"bytes32","name":"emitterAddress","internalType":"bytes32"}]},{"type":"uint64","name":"initialSequence","internalType":"uint64","indexed":false}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"type":"uint8","name":"version","internalType":"uint8","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"PriceFeedUpdate","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32","indexed":true},{"type":"uint64","name":"publishTime","internalType":"uint64","indexed":false},{"type":"int64","name":"price","internalType":"int64","indexed":false},{"type":"uint64","name":"conf","internalType":"uint64","indexed":false}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"type":"address","name":"implementation","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"ValidPeriodSet","inputs":[{"type":"uint256","name":"oldValidPeriod","internalType":"uint256","indexed":false},{"type":"uint256","name":"newValidPeriod","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"WormholeAddressSet","inputs":[{"type":"address","name":"oldWormholeAddress","internalType":"address","indexed":false},{"type":"address","name":"newWormholeAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"chainId","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"executeGovernanceInstruction","inputs":[{"type":"bytes","name":"encodedVM","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"price","internalType":"struct PythStructs.Price","components":[{"type":"int64","name":"price","internalType":"int64"},{"type":"uint64","name":"conf","internalType":"uint64"},{"type":"int32","name":"expo","internalType":"int32"},{"type":"uint256","name":"publishTime","internalType":"uint256"}]}],"name":"getEmaPrice","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"price","internalType":"struct PythStructs.Price","components":[{"type":"int64","name":"price","internalType":"int64"},{"type":"uint64","name":"conf","internalType":"uint64"},{"type":"int32","name":"expo","internalType":"int32"},{"type":"uint256","name":"publishTime","internalType":"uint256"}]}],"name":"getEmaPriceNoOlderThan","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32"},{"type":"uint256","name":"age","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"price","internalType":"struct PythStructs.Price","components":[{"type":"int64","name":"price","internalType":"int64"},{"type":"uint64","name":"conf","internalType":"uint64"},{"type":"int32","name":"expo","internalType":"int32"},{"type":"uint256","name":"publishTime","internalType":"uint256"}]}],"name":"getEmaPriceUnsafe","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"price","internalType":"struct PythStructs.Price","components":[{"type":"int64","name":"price","internalType":"int64"},{"type":"uint64","name":"conf","internalType":"uint64"},{"type":"int32","name":"expo","internalType":"int32"},{"type":"uint256","name":"publishTime","internalType":"uint256"}]}],"name":"getPrice","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"price","internalType":"struct PythStructs.Price","components":[{"type":"int64","name":"price","internalType":"int64"},{"type":"uint64","name":"conf","internalType":"uint64"},{"type":"int32","name":"expo","internalType":"int32"},{"type":"uint256","name":"publishTime","internalType":"uint256"}]}],"name":"getPriceNoOlderThan","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32"},{"type":"uint256","name":"age","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"price","internalType":"struct PythStructs.Price","components":[{"type":"int64","name":"price","internalType":"int64"},{"type":"uint64","name":"conf","internalType":"uint64"},{"type":"int32","name":"expo","internalType":"int32"},{"type":"uint256","name":"publishTime","internalType":"uint256"}]}],"name":"getPriceUnsafe","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"feeAmount","internalType":"uint256"}],"name":"getUpdateFee","inputs":[{"type":"bytes[]","name":"updateData","internalType":"bytes[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"feeAmount","internalType":"uint256"}],"name":"getUpdateFee","inputs":[{"type":"uint256","name":"updateDataSize","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getValidTimePeriod","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct PythInternalStructs.DataSource","components":[{"type":"uint16","name":"chainId","internalType":"uint16"},{"type":"bytes32","name":"emitterAddress","internalType":"bytes32"}]}],"name":"governanceDataSource","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"governanceDataSourceIndex","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"hashDataSource","inputs":[{"type":"tuple","name":"ds","internalType":"struct PythInternalStructs.DataSource","components":[{"type":"uint16","name":"chainId","internalType":"uint16"},{"type":"bytes32","name":"emitterAddress","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"wormhole","internalType":"address"},{"type":"uint16[]","name":"dataSourceEmitterChainIds","internalType":"uint16[]"},{"type":"bytes32[]","name":"dataSourceEmitterAddresses","internalType":"bytes32[]"},{"type":"uint16","name":"governanceEmitterChainId","internalType":"uint16"},{"type":"bytes32","name":"governanceEmitterAddress","internalType":"bytes32"},{"type":"uint64","name":"governanceInitialSequence","internalType":"uint64"},{"type":"uint256","name":"validTimePeriodSeconds","internalType":"uint256"},{"type":"uint256","name":"singleUpdateFeeInWei","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isValidDataSource","inputs":[{"type":"uint16","name":"dataSourceChainId","internalType":"uint16"},{"type":"bytes32","name":"dataSourceEmitterAddress","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isValidGovernanceDataSource","inputs":[{"type":"uint16","name":"governanceChainId","internalType":"uint16"},{"type":"bytes32","name":"governanceEmitterAddress","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"lastExecutedGovernanceSequence","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"latestPriceInfoPublishTime","inputs":[{"type":"bytes32","name":"priceId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"tuple","name":"sgds","internalType":"struct PythGovernanceInstructions.AuthorizeGovernanceDataSourceTransferPayload","components":[{"type":"bytes","name":"claimVaa","internalType":"bytes"}]}],"name":"parseAuthorizeGovernanceDataSourceTransferPayload","inputs":[{"type":"bytes","name":"encodedPayload","internalType":"bytes"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"tuple","name":"gi","internalType":"struct PythGovernanceInstructions.GovernanceInstruction","components":[{"type":"uint8","name":"module","internalType":"enum PythGovernanceInstructions.GovernanceModule"},{"type":"uint8","name":"action","internalType":"enum PythGovernanceInstructions.GovernanceAction"},{"type":"uint16","name":"targetChainId","internalType":"uint16"},{"type":"bytes","name":"payload","internalType":"bytes"}]}],"name":"parseGovernanceInstruction","inputs":[{"type":"bytes","name":"encodedInstruction","internalType":"bytes"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"tuple[]","name":"priceFeeds","internalType":"struct PythStructs.PriceFeed[]","components":[{"type":"bytes32","name":"id","internalType":"bytes32"},{"type":"tuple","name":"price","internalType":"struct PythStructs.Price","components":[{"type":"int64","name":"price","internalType":"int64"},{"type":"uint64","name":"conf","internalType":"uint64"},{"type":"int32","name":"expo","internalType":"int32"},{"type":"uint256","name":"publishTime","internalType":"uint256"}]},{"type":"tuple","name":"emaPrice","internalType":"struct PythStructs.Price","components":[{"type":"int64","name":"price","internalType":"int64"},{"type":"uint64","name":"conf","internalType":"uint64"},{"type":"int32","name":"expo","internalType":"int32"},{"type":"uint256","name":"publishTime","internalType":"uint256"}]}]}],"name":"parsePriceFeedUpdates","inputs":[{"type":"bytes[]","name":"updateData","internalType":"bytes[]"},{"type":"bytes32[]","name":"priceIds","internalType":"bytes32[]"},{"type":"uint64","name":"minPublishTime","internalType":"uint64"},{"type":"uint64","name":"maxPublishTime","internalType":"uint64"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"tuple","name":"sgdsClaim","internalType":"struct PythGovernanceInstructions.RequestGovernanceDataSourceTransferPayload","components":[{"type":"uint32","name":"governanceDataSourceIndex","internalType":"uint32"}]}],"name":"parseRequestGovernanceDataSourceTransferPayload","inputs":[{"type":"bytes","name":"encodedPayload","internalType":"bytes"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"tuple","name":"sds","internalType":"struct PythGovernanceInstructions.SetDataSourcesPayload","components":[{"type":"tuple[]","name":"dataSources","internalType":"struct PythInternalStructs.DataSource[]","components":[{"type":"uint16","name":"chainId","internalType":"uint16"},{"type":"bytes32","name":"emitterAddress","internalType":"bytes32"}]}]}],"name":"parseSetDataSourcesPayload","inputs":[{"type":"bytes","name":"encodedPayload","internalType":"bytes"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"tuple","name":"sf","internalType":"struct PythGovernanceInstructions.SetFeePayload","components":[{"type":"uint256","name":"newFee","internalType":"uint256"}]}],"name":"parseSetFeePayload","inputs":[{"type":"bytes","name":"encodedPayload","internalType":"bytes"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"tuple","name":"svp","internalType":"struct PythGovernanceInstructions.SetValidPeriodPayload","components":[{"type":"uint256","name":"newValidPeriod","internalType":"uint256"}]}],"name":"parseSetValidPeriodPayload","inputs":[{"type":"bytes","name":"encodedPayload","internalType":"bytes"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"tuple","name":"sw","internalType":"struct PythGovernanceInstructions.SetWormholeAddressPayload","components":[{"type":"address","name":"newWormholeAddress","internalType":"address"}]}],"name":"parseSetWormholeAddressPayload","inputs":[{"type":"bytes","name":"encodedPayload","internalType":"bytes"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"tuple","name":"uc","internalType":"struct PythGovernanceInstructions.UpgradeContractPayload","components":[{"type":"address","name":"newImplementation","internalType":"address"}]}],"name":"parseUpgradeContractPayload","inputs":[{"type":"bytes","name":"encodedPayload","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"priceFeedExists","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"proxiableUUID","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"pythUpgradableMagic","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"priceFeed","internalType":"struct PythStructs.PriceFeed","components":[{"type":"bytes32","name":"id","internalType":"bytes32"},{"type":"tuple","name":"price","internalType":"struct PythStructs.Price","components":[{"type":"int64","name":"price","internalType":"int64"},{"type":"uint64","name":"conf","internalType":"uint64"},{"type":"int32","name":"expo","internalType":"int32"},{"type":"uint256","name":"publishTime","internalType":"uint256"}]},{"type":"tuple","name":"emaPrice","internalType":"struct PythStructs.Price","components":[{"type":"int64","name":"price","internalType":"int64"},{"type":"uint64","name":"conf","internalType":"uint64"},{"type":"int32","name":"expo","internalType":"int32"},{"type":"uint256","name":"publishTime","internalType":"uint256"}]}]}],"name":"queryPriceFeed","inputs":[{"type":"bytes32","name":"id","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"singleUpdateFeeInWei","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"updatePriceFeeds","inputs":[{"type":"bytes[]","name":"updateData","internalType":"bytes[]"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"updatePriceFeedsIfNecessary","inputs":[{"type":"bytes[]","name":"updateData","internalType":"bytes[]"},{"type":"bytes32[]","name":"priceIds","internalType":"bytes32[]"},{"type":"uint64[]","name":"publishTimes","internalType":"uint64[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"upgradeTo","inputs":[{"type":"address","name":"newImplementation","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"upgradeToAndCall","inputs":[{"type":"address","name":"newImplementation","internalType":"address"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct PythInternalStructs.DataSource[]","components":[{"type":"uint16","name":"chainId","internalType":"uint16"},{"type":"bytes32","name":"emitterAddress","internalType":"bytes32"}]}],"name":"validDataSources","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"validTimePeriodSeconds","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"version","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IWormhole"}],"name":"wormhole","inputs":[]}]
              

Contract Creation Code

Verify & Publish
0x60a06040523060601b6080523480156200001857600080fd5b50600054610100900460ff16158080156200003a5750600054600160ff909116105b806200006a575062000057306200014460201b620026861760201c565b1580156200006a575060005460ff166001145b620000d25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff191660011790558015620000f6576000805461ff0019166101001790555b80156200013d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5062000153565b6001600160a01b03163b151590565b60805160601c615f4c6200018e60003960008181610ba201528181610c3801528181611330015281816113c601526114c10152615f4c6000f3fe6080604052600436106102e75760003560e01c80638881016f11610184578063b6ed701e116100d6578063d82d58a51161008a578063e3795cc111610064578063e3795cc11461096b578063ef9e5e2814610982578063f2fde38b1461099557600080fd5b8063d82d58a5146108fd578063e17efd4814610936578063e18910a31461095657600080fd5b8063caaf43f1116100bb578063caaf43f11461089b578063cb718a9b146108c8578063d47eed45146108dd57600080fd5b8063b6ed701e14610868578063b9256d281461088857600080fd5b80639a8a059211610138578063aac4129211610112578063aac41292146106ef578063b5dcc9111461080f578063b5ec02611461082f57600080fd5b80639a8a0592146107a5578063a38d81c6146107cd578063a4ae35e0146107ef57600080fd5b80638da5cb5b116101695780638da5cb5b146107475780639474f45b1461076557806396834ad31461078557600080fd5b80638881016f146106ef57806389a5bb4d1461072757600080fd5b806352d1902d1161023d5780636c72f51b116101f15780637b72bcae116101cb5780637b72bcae1461065b57806384acd1bb1461069057806387c5bd1b146106c257600080fd5b80636c72f51b146105fa578063711a2e2814610626578063715018a61461064657600080fd5b8063586d3cf811610222578063586d3cf81461058e57806358c67635146105ad5780636b7f53ca146105cd57600080fd5b806352d1902d1461052d57806354fd4d501461054257600080fd5b8063437209a71161029f5780634c469d8c116102795780634c469d8c146104aa5780634d7a734e146104fa5780634f1ef2861461051a57600080fd5b8063437209a7146103d55780634716e9c51461046b57806348b6404d1461048b57600080fd5b806331d98b3f116102d057806331d98b3f146103425780633659cfe61461036f578063426234e41461038f57600080fd5b8063146faf77146102ec57806314dd317f1461030e575b600080fd5b3480156102f857600080fd5b5061030c6103073660046152ff565b6109b5565b005b34801561031a57600080fd5b5061032e610329366004615632565b610b06565b604051905181526020015b60405180910390f35b34801561034e57600080fd5b5061036261035d366004615574565b610b61565b6040516103399190615b80565b34801561037b57600080fd5b5061030c61038a3660046152e5565b610b97565b34801561039b57600080fd5b506040805180820182526000808252602091820152815180830190925260d05461ffff16825260d154908201526040516103399190615af5565b3480156103e157600080fd5b5061045b6103f0366004615846565b6040805160f09390931b7fffff000000000000000000000000000000000000000000000000000000000000166020808501919091526022808501939093528151808503909301835260429093018152815191830191909120600090815260cd90925290205460ff1690565b6040519015158152602001610339565b61047e6104793660046154e2565b610d52565b6040516103399190615a49565b34801561049757600080fd5b5060ce545b604051908152602001610339565b3480156104b657600080fd5b506104e16104c5366004615574565b600090815260d5602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff9091168152602001610339565b34801561050657600080fd5b5061032e610515366004615632565b61128b565b61030c6105283660046153c0565b611325565b34801561053957600080fd5b5061049c6114b4565b34801561054e57600080fd5b50604080518082018252600581527f312e332e30000000000000000000000000000000000000000000000000000000602082015290516103399190615ac7565b34801561059a57600080fd5b5060d25467ffffffffffffffff166104e1565b3480156105b957600080fd5b5061045b6105c8366004615846565b611579565b3480156105d957600080fd5b506105ed6105e8366004615632565b61159c565b6040516103399190615b10565b34801561060657600080fd5b5060d45463ffffffff165b60405163ffffffff9091168152602001610339565b34801561063257600080fd5b506103626106413660046155a4565b6117a0565b34801561065257600080fd5b5061030c611816565b34801561066757600080fd5b5061067b610676366004615632565b61182a565b604051905163ffffffff168152602001610339565b34801561069c57600080fd5b5060c9546001600160a01b03165b6040516001600160a01b039091168152602001610339565b3480156106ce57600080fd5b506106e26106dd366004615632565b611858565b6040516103399190615bbb565b3480156106fb57600080fd5b5061070f61070a366004615632565b6119d5565b60405190516001600160a01b03168152602001610339565b34801561073357600080fd5b5061049c610742366004615665565b611a06565b34801561075357600080fd5b506033546001600160a01b03166106aa565b34801561077157600080fd5b50610362610780366004615574565b611a70565b34801561079157600080fd5b506103626107a0366004615574565b611b03565b3480156107b157600080fd5b506107ba611ba5565b60405161ffff9091168152602001610339565b3480156107d957600080fd5b506107e2611c2e565b6040516103399190615a11565b3480156107fb57600080fd5b5061036261080a3660046155a4565b611ca1565b34801561081b57600080fd5b5061036261082a366004615574565b611cce565b34801561083b57600080fd5b5061045b61084a366004615574565b600090815260d5602052604090205467ffffffffffffffff16151590565b34801561087457600080fd5b5061030c6108833660046155c5565b611cfe565b61030c61089636600461544c565b612018565b3480156108a757600080fd5b506108bb6108b6366004615574565b61212b565b6040516103399190615b71565b3480156108d457600080fd5b5060cf5461049c565b3480156108e957600080fd5b5061049c6108f836600461540c565b612308565b34801561090957600080fd5b50610929610918366004615632565b604080516020810190915290815290565b6040516103399190615ada565b34801561094257600080fd5b5061049c610951366004615574565b612473565b34801561096257600080fd5b5061049c612489565b34801561097757600080fd5b506397a6f304610611565b61030c61099036600461540c565b612494565b3480156109a157600080fd5b5061030c6109b03660046152e5565b6125f9565b600054610100900460ff16158080156109d55750600054600160ff909116105b806109ef5750303b1580156109ef575060005460ff166001145b610a665760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b6000805460ff191660011790558015610a89576000805461ff0019166101001790555b610a91612695565b610a9961271a565b610aab8b8b8b8b8b8b8b8b8b8b612797565b610ab3611816565b8015610af9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050505050565b6040805160208101909152600081526000610b218382612a0b565b67ffffffffffffffff168252610b38600882615d07565b905080835114610b5b576040516397363b3560e01b815260040160405180910390fd5b50919050565b604080516080810182526000808252602082018190529181018290526060810191909152610b918261080a612489565b92915050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415610c365760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610a5d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c917f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610d0d5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610a5d565b610d1681612a71565b610d4f8160005b6040519080825280601f01601f191660200182016040528015610d47576020820181803683370190505b506000612a79565b50565b60606000610d608888612308565b905080341015610d9c576040517f025dbdd400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b508367ffffffffffffffff811115610dc457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e5457816020015b610e41604080516060808201835260008083528351608081018552818152602081810183905294810182905291820152909182019081526040805160808101825260008082526020828101829052928201819052606082015291015290565b815260200190600190039081610de25790505b50905060005b8681101561120a576004888883818110610e8457634e487b7160e01b600052603260045260246000fd5b9050602002810190610e969190615bd6565b9050118015610eea575063504e4155610ee2898984818110610ec857634e487b7160e01b600052603260045260246000fd5b9050602002810190610eda9190615bd6565b503560e01c90565b63ffffffff16145b156110d757600080610f2c8a8a85818110610f1557634e487b7160e01b600052603260045260246000fd5b9050602002810190610f279190615bd6565b612c2d565b90925090506000818015610f5057634e487b7160e01b600052602160045260246000fd5b14610f6e5760405163734fff6760e11b815260040160405180910390fd5b50600080366000610fb08d8d88818110610f9857634e487b7160e01b600052603260045260246000fd5b9050602002810190610faa9190615bd6565b87612cf4565b93985091965094509250905060005b8360ff168110156110ac576040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101829052906110088786868b612e3f565b91995092509050600061101c8f8f84612f54565b90508d81148061105657508a818151811061104757634e487b7160e01b600052603260045260246000fd5b60209081029190910101515115155b15611063575050506110a4565b825167ffffffffffffffff908116908e16811080159061108d57508c67ffffffffffffffff168111155b1561109f5761109f8c83858785612fa5565b505050505b600101610fbf565b508481146110cd5760405163734fff6760e11b815260040160405180910390fd5b5050505050611202565b606060006111158a8a858181106110fe57634e487b7160e01b600052603260045260246000fd5b90506020028101906111109190615bd6565b6131e9565b60e00151915060009050808061112a8461333a565b92509250925060005b828110156111fc576040848601015160209060006111528e8e84612f54565b90508c81148061118c575089818151811061117d57634e487b7160e01b600052603260045260246000fd5b60209081029190910101515115155b1561119d57505050928101926111f4565b60006111aa898988613469565b50805190915067ffffffffffffffff908116908e1681108015906111d857508c67ffffffffffffffff168111155b156111ea576111ea8c84868585612fa5565b5050509483019450505b600101611133565b50505050505b600101610e5a565b5060005b848110156112805781818151811061123657634e487b7160e01b600052603260045260246000fd5b602090810291909101015151611278576040517f45805f5d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60010161120e565b509695505050505050565b6040805160208101909152600081526000806112a78482612a0b565b90506112b4600883615d07565b915060006112c28584612a0b565b90506112cf600884615d07565b92506112e667ffffffffffffffff8216600a615d62565b6112fa9067ffffffffffffffff8416615e0a565b84528451831461131d576040516397363b3560e01b815260040160405180910390fd5b505050919050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156113c45760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610a5d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661141f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b03161461149b5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610a5d565b6114a482612a71565b6114b082826001612a79565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146115545760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a5d565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b60d05460009061ffff8481169116148015611595575060d15482145b9392505050565b6115c8604080516080810190915280600081526020016000815260006020820152606060409091015290565b6000806115d58482613579565b905063ffffffff8116635054474d14611601576040516397363b3560e01b815260040160405180910390fd5b61160c600483615d07565b9150600061161a85846135df565b90508060ff16600181111561163f57634e487b7160e01b600052602160045260246000fd5b8490600181111561166057634e487b7160e01b600052602160045260246000fd5b9081600181111561168157634e487b7160e01b600052602160045260246000fd5b90525061168f600184615d07565b92506001845160018111156116b457634e487b7160e01b600052602160045260246000fd5b146116d2576040516363daeb7760e01b815260040160405180910390fd5b60006116de86856135df565b90508060ff16600681111561170357634e487b7160e01b600052602160045260246000fd5b8560200190600681111561172757634e487b7160e01b600052602160045260246000fd5b9081600681111561174857634e487b7160e01b600052602160045260246000fd5b905250611756600185615d07565b93506117628685613645565b61ffff166040860152611776600285615d07565b9350611791848588516117899190615e29565b8891906136ab565b60608601525092949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526117cd83611a70565b9050816117de4283606001516137d3565b1115610b91576040517f19abf40e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61181e6137f8565b6118286000613852565b565b60408051602081019091526000815260006118458382613579565b63ffffffff168252610b38600482615d07565b60408051602081019091526060815260008061187484826135df565b9050611881600183615d07565b91508060ff1667ffffffffffffffff8111156118ad57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156118f257816020015b60408051808201909152600080825260208201528152602001906001900390816118cb5790505b50835260005b8160ff168110156119ac5761190d8584613645565b845180518390811061192f57634e487b7160e01b600052603260045260246000fd5b602090810291909101015161ffff909116905261194d600284615d07565b925061195985846138b1565b845180518390811061197b57634e487b7160e01b600052603260045260246000fd5b602002602001015160200181815250506020836119989190615d07565b9250806119a481615e6c565b9150506118f8565b50818451146119ce576040516397363b3560e01b815260040160405180910390fd5b5050919050565b60408051602081019091526000815260006119f08382613917565b6001600160a01b03168252610b38601482615d07565b600081600001518260200151604051602001611a5392919060f09290921b7fffff000000000000000000000000000000000000000000000000000000000000168252600282015260220190565b604051602081830303815290604052805190602001209050919050565b60408051608081018252600080825260208083018281528385018381526060850184815287855260d590935294909220805467ffffffffffffffff808216938490526801000000000000000091829004600390810b810b900b9096526001820154600781810b810b900b865204909416909152909190610b5b57604051630295d7cd60e31b815260040160405180910390fd5b60408051608081018252600080825260208083018281528385018381526060850184815287855260d590935294909220805467ffffffffffffffff80821693849052680100000000000000008204600390810b810b900b9096526c010000000000000000000000008104600790810b810b900b8552600160a01b9004909416909152909190610b5b57604051630295d7cd60e31b815260040160405180910390fd5b6000611bb960c9546001600160a01b031690565b6001600160a01b0316639a8a05926040518163ffffffff1660e01b815260040160206040518083038186803b158015611bf157600080fd5b505afa158015611c05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c29919061582a565b905090565b606060c9600301805480602002602001604051908101604052809291908181526020016000905b82821015611c985760008481526020908190206040805180820190915260028502909101805461ffff168252600190810154828401529083529092019101611c55565b50505050905090565b6040805160808101825260008082526020820181905291810182905260608101919091526117cd83611b03565b604080516080810182526000808252602082018190529181018290526060810191909152610b9182610641612489565b6000611d3f83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061398d92505050565b90506000611d508260e0015161159c565b9050611d5a611ba5565b61ffff16816040015161ffff1614158015611d7c5750604081015161ffff1615155b15611d9a576040516363daeb7760e01b815260040160405180910390fd5b600081602001516006811115611dc057634e487b7160e01b600052602160045260246000fd5b1415611e0657604081015161ffff16611dec576040516363daeb7760e01b815260040160405180910390fd5b611e01611dfc82606001516119d5565b613b6e565b612012565b600181602001516006811115611e2c57634e487b7160e01b600052602160045260246000fd5b1415611e5357611e01611e4e8260600151604080516020810190915290815290565b613b77565b600281602001516006811115611e7957634e487b7160e01b600052602160045260246000fd5b1415611e9457611e01611e8f8260600151611858565b613eaa565b600381602001516006811115611eba57634e487b7160e01b600052602160045260246000fd5b1415611ed557611e01611ed0826060015161128b565b614053565b600481602001516006811115611efb57634e487b7160e01b600052602160045260246000fd5b1415611f1657611e01611f118260600151610b06565b6140a5565b600581602001516006811115611f3c57634e487b7160e01b600052602160045260246000fd5b1415611f5b576040516397363b3560e01b815260040160405180910390fd5b600681602001516006811115611f8157634e487b7160e01b600052602160045260246000fd5b1415611ff957604081015161ffff16611fad576040516363daeb7760e01b815260040160405180910390fd5b611e01611fbd82606001516119d5565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506140e292505050565b6040516397363b3560e01b815260040160405180910390fd5b50505050565b8281146120385760405163a9cb9e0d60e01b815260040160405180910390fd5b60005b838110156120f05782828281811061206357634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612078919061588b565b67ffffffffffffffff166120c88686848181106120a557634e487b7160e01b600052603260045260246000fd5b90506020020135600090815260d5602052604090205467ffffffffffffffff1690565b67ffffffffffffffff1610156120e8576120e28787612494565b50612123565b60010161203b565b506040517fde2c57fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b61218a604080516060808201835260008083528351608081018552818152602081810183905294810182905291820152909182019081526040805160808101825260008082526020828101829052928201819052606082015291015290565b6040805160c08082018352600080835260208084018290528385018290526060808501839052608080860184905260a095860184905288845260d5835286842087519586018852805467ffffffffffffffff808216885268010000000000000000808304600390810b810b900b968901969096526c010000000000000000000000008204600790810b810b810b9a89019a909a52600160a01b9091048116938701939093526001015480880b880b90970b90850152940490931691810191909152805190915067ffffffffffffffff1661227757604051630295d7cd60e31b815260040160405180910390fd5b91815260408083015160208084018051600793840b840b9052606080870151825167ffffffffffffffff9182169085015283880180518451600391820b820b9089015289519451948316948401949094526080890151878901805191880b90970b905260a089015186519083169501949094529251845190830b90920b919094015293519051931692019190915290565b600080805b8381101561246157600485858381811061233757634e487b7160e01b600052603260045260246000fd5b90506020028101906123499190615bd6565b9050118015612383575063504e415561237b868684818110610ec857634e487b7160e01b600052603260045260246000fd5b63ffffffff16145b15612441576000806123ae878785818110610f1557634e487b7160e01b600052603260045260246000fd5b909250905060008180156123d257634e487b7160e01b600052602160045260246000fd5b146123f05760405163734fff6760e11b815260040160405180910390fd5b61242b87878581811061241357634e487b7160e01b600052603260045260246000fd5b90506020028101906124259190615bd6565b8461433a565b6124389060ff1685615d07565b9350505061244f565b61244c600183615d07565b91505b8061245981615e6c565b91505061230d565b5061246b81614371565b949350505050565b60008161247f60ce5490565b610b919190615e0a565b6000611c2960cf5490565b6000805b828110156125b15760048484838181106124c257634e487b7160e01b600052603260045260246000fd5b90506020028101906124d49190615bd6565b905011801561250e575063504e4155612506858584818110610ec857634e487b7160e01b600052603260045260246000fd5b63ffffffff16145b156125615761254d84848381811061253657634e487b7160e01b600052603260045260246000fd5b90506020028101906125489190615bd6565b614386565b61255a9060ff1683615d07565b91506125a9565b61259b84848381811061258457634e487b7160e01b600052603260045260246000fd5b90506020028101906125969190615bd6565b614604565b6125a6600183615d07565b91505b600101612498565b5060006125bd82614371565b905080341015612012576040517f025dbdd400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126016137f8565b6001600160a01b03811661267d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a5d565b610d4f81613852565b6001600160a01b03163b151590565b600054610100900460ff166127125760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a5d565b611828614616565b600054610100900460ff166118285760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a5d565b60c9805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038c161790558786146127df5760405163a9cb9e0d60e01b815260040160405180910390fd5b60005b888110156129a257600060405180604001604052808c8c8581811061281757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061282c919061580e565b61ffff1681526020018a8a8581811061285557634e487b7160e01b600052603260045260246000fd5b602090810292909201359092528251838201516040805160f09390931b7fffff00000000000000000000000000000000000000000000000000000000000016838501526022808401929092528051808403909201825260429092018252805190830120600090815260cd9092529020549192505060ff16156128ea5760405163a9cb9e0d60e01b815260040160405180910390fd5b600160cd60006128f984611a06565b81526020808201929092526040016000908120805460ff19169315159390931790925560cc8054600181018255925282517f47197230e1e4b29fc0bd84d7d78966c0925452aff72a2a121538b102457e9ebe6002909302928301805461ffff191661ffff90921691909117905591909101517f47197230e1e4b29fc0bd84d7d78966c0925452aff72a2a121538b102457e9ebf909101558061299a81615e6c565b9150506127e2565b506040805180820190915261ffff86168082526020820186905260d0805461ffff1916909117905560d185905560d2805467ffffffffffffffff191667ffffffffffffffff8616179055506129f68260cf55565b6129ff8160ce55565b50505050505050505050565b6000612a18826008615d07565b83511015612a685760405162461bcd60e51b815260206004820152601460248201527f746f55696e7436345f6f75744f66426f756e64730000000000000000000000006044820152606401610a5d565b50016008015190565b610d4f6137f8565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612ab157612aac8361469c565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612aea57600080fd5b505afa925050508015612b1a575060408051601f3d908101601f19168201909252612b179181019061558c565b60015b612b8c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610a5d565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612c215760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610a5d565b50612aac838383614767565b60046000833560e01c63504e41558114612c5a5760405163734fff6760e11b815260040160405180910390fd5b60018084019386013560f81c908114612c865760405163734fff6760e11b815260040160405180910390fd5b50508184016001013560f890811c9092016002818101939186010135901c60ff168015612cc357634e487b7160e01b600052602160045260246000fd5b60019290920191905081831015612ced5760405163734fff6760e11b815260040160405180910390fd5b9250929050565b600080803681612d0888888880820361478c565b600296509092509050813560f01c60606000612d2e612d2986868b8761478c565b6147b6565b60e0015160048082015161ffff86169a909a01999193509150634155575663ffffffff821614612d715760405163734fff6760e11b815260040160405180910390fd5b8183016001015160009060ff168015612d9a57634e487b7160e01b600052602160045260246000fd5b60019093019290506000818015612dc157634e487b7160e01b600052602160045260246000fd5b14612ddf5760405163734fff6760e11b815260040160405180910390fd5b602c848401015184516c0100000000000000000000000090910460601b9950602090930192831115612e245760405163734fff6760e11b815260040160405180910390fd5b5050600188019b969a505050509381013560f81c9550935050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101829052600283019282903690829088013560f01c612e8d8989898461478c565b925092508061ffff16870196506000612eaa8a8a8a8e8888614940565b9750905080612ecc5760405163734fff6760e11b815260040160405180910390fd5b6000843560f81c8015612eef57634e487b7160e01b600052602160045260246000fd5b90506000818015612f1057634e487b7160e01b600052602160045260246000fd5b1415612f2c57612f22858560016149f2565b9097509550612f45565b60405163734fff6760e11b815260040160405180910390fd5b50505050509450945094915050565b6000805b8381101561246b5782858583818110612f8157634e487b7160e01b600052603260045260246000fd5b905060200201351415612f935761246b565b80612f9d81615e6c565b915050612f58565b82858581518110612fc657634e487b7160e01b600052603260045260246000fd5b602002602001015160000181815250508160400151858581518110612ffb57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516000019060070b908160070b81525050816060015185858151811061303c57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516020019067ffffffffffffffff16908167ffffffffffffffff1681525050816020015185858151811061308b57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516040019060030b908160030b81525050808585815181106130c857634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516060018181525050816080015185858151811061310157634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516000019060070b908160070b815250508160a0015185858151811061314257634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516020019067ffffffffffffffff16908167ffffffffffffffff1681525050816020015185858151811061319157634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516040019060030b908160030b81525050808585815181106131ce57634e487b7160e01b600052603260045260246000fd5b60200260200101516040015160600181815250505050505050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e082018190526101008201839052610120820152610140810191909152600061325560c9546001600160a01b031690565b6001600160a01b031663c0fd8bde85856040518363ffffffff1660e01b8152600401613282929190615a98565b60006040518083038186803b15801561329a57600080fd5b505afa1580156132ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132d691908101906156bc565b509092509050806132fa57604051632acbe91560e01b815260040160405180910390fd5b5061330481614a8c565b610b91576040517fe60dce7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080808061334d858260049101015190565b90506004840193508063ffffffff1663503257481461337f5760405163734fff6760e11b815260040160405180910390fd5b6002858501810151940193600361ffff8216146133af5760405163734fff6760e11b815260040160405180910390fd5b60028501945060006133c5878760029101015190565b905060028601955060006133dd888860019101015190565b90508161ffff16870196508060ff1660021461340c5760405163734fff6760e11b815260040160405180910390fd5b505050508284016002015161ffff169150600283019250613431848460029101015190565b61ffff16905060028301925081810283018451146134625760405163734fff6760e11b815260040160405180910390fd5b9193909250565b6040805160c081018252600080825260208201818152828401828152606084018381526080850184815260a08601948552888a01968701516048880151600790810b810b909452605088015167ffffffffffffffff9081169093526054880151600390810b900b909452605c870151830b90920b909152606485015181169092526065840151607d94850151909216835291929060ff8116600114156135145760188201915061354e565b8582018701600881015167ffffffffffffffff90811686526010820151600790810b900b6040870152601891820151166060860152909101905b50838111156135705760405163734fff6760e11b815260040160405180910390fd5b50935093915050565b6000613586826004615d07565b835110156135d65760405162461bcd60e51b815260206004820152601460248201527f746f55696e7433325f6f75744f66426f756e64730000000000000000000000006044820152606401610a5d565b50016004015190565b60006135ec826001615d07565b8351101561363c5760405162461bcd60e51b815260206004820152601360248201527f746f55696e74385f6f75744f66426f756e6473000000000000000000000000006044820152606401610a5d565b50016001015190565b6000613652826002615d07565b835110156136a25760405162461bcd60e51b815260206004820152601460248201527f746f55696e7431365f6f75744f66426f756e64730000000000000000000000006044820152606401610a5d565b50016002015190565b6060816136b981601f615d07565b10156137075760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610a5d565b6137118284615d07565b845110156137615760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610a5d565b60608215801561378057604051915060008252602082016040526137ca565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156137b95780518352602092830192016137a1565b5050858452601f01601f1916604052505b50949350505050565b6000818311156137ee576137e78284615e29565b9050610b91565b6137e78383615e29565b6033546001600160a01b031633146118285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a5d565b603380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006138be826020615d07565b8351101561390e5760405162461bcd60e51b815260206004820152601560248201527f746f427974657333325f6f75744f66426f756e647300000000000000000000006044820152606401610a5d565b50016020015190565b6000613924826014615d07565b835110156139745760405162461bcd60e51b815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e647300000000000000000000006044820152606401610a5d565b5001602001516c01000000000000000000000000900490565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820181905261010082018390526101208201526101408101919091526000806139fa60c9546001600160a01b031690565b6001600160a01b031663c0fd8bde856040518263ffffffff1660e01b8152600401613a259190615ac7565b60006040518083038186803b158015613a3d57600080fd5b505afa158015613a51573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a7991908101906156bc565b509150915080613a9c57604051632acbe91560e01b815260040160405180910390fd5b613aae82606001518360800151611579565b613ae4576040517f360f2d8700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60d25467ffffffffffffffff1667ffffffffffffffff168260a0015167ffffffffffffffff1611613b41576040517f88d1b84700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a082015160d2805467ffffffffffffffff191667ffffffffffffffff9092169190911790555092915050565b610d4f81614b06565b6000613bab6040805180820182526000808252602091820152815180830190925260d05461ffff16825260d1549082015290565b9050600080613bc260c9546001600160a01b031690565b84516040517fc0fd8bde0000000000000000000000000000000000000000000000000000000081526001600160a01b03929092169163c0fd8bde91613c0991600401615ac7565b60006040518083038186803b158015613c2157600080fd5b505afa158015613c35573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613c5d91908101906156bc565b509150915080613c8057604051632acbe91560e01b815260040160405180910390fd5b6000613c8f8360e0015161159c565b9050613c99611ba5565b61ffff16816040015161ffff1614158015613cbb5750604081015161ffff1615155b15613cd9576040516363daeb7760e01b815260040160405180910390fd5b600581602001516006811115613cff57634e487b7160e01b600052602160045260246000fd5b14613d1d576040516397363b3560e01b815260040160405180910390fd5b6000613d2c826060015161182a565b805190915063ffffffff16613d4660d45463ffffffff1690565b63ffffffff1610613d83576040517f88d1b84700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160d480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff909216919091179055604080518082018252606086015161ffff168082526080870151602080840182905260d0805461ffff19168417905560d182905560a089015160d2805467ffffffffffffffff191667ffffffffffffffff90921691909117905584518086018652600080825290820152845180860190955291845290830152907f6bce23ef3d34e51710fe4700b43ba5f1733a6215c883f384671a4ece3ea8aa2090879060d25460408051845161ffff908116825260209586015186830152845116918101919091529290910151606083015267ffffffffffffffff16608082015260a0015b60405180910390a150505050505050565b6000613eb4611c2e565b905060005b8151811015613f2c57600060c96004016000613efb858581518110613eee57634e487b7160e01b600052603260045260246000fd5b6020026020010151611a06565b81526020810191909152604001600020805460ff1916911515919091179055613f25600182615d07565b9050613eb9565b50613f3960cc600061509d565b60005b82515181101561400e578251805160cc919083908110613f6c57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182546001808201855560009485528385208351600290930201805461ffff191661ffff90931692909217825591909201519181019190915584518051919260cd929091613fdd9186908110613eee57634e487b7160e01b600052603260045260246000fd5b81526020810191909152604001600020805460ff19169115159190911790558061400681615e6c565b915050613f3c565b507fd451e0fcb7c5b9e13de533604d158069dad159841c45f39f09d379bfc423080d81614039611c2e565b604051614047929190615a24565b60405180910390a15050565b600061405e60ce5490565b825160ce5590507f74dbbbe280ef27b79a8a0c449d5ae2ba7a31849103241d0f98df70bbc9d03e378161409060ce5490565b60408051928352602083019190915201614047565b60006140b060cf5490565b825160cf5590507fcdb88a22f82ddd76115ab7c66cf08eb1e40afe80c9b31017eb2cbdb1570b33ae8161409060cf5490565b60006140f660c9546001600160a01b031690565b835160c9805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390921691821790556040517fc0fd8bde00000000000000000000000000000000000000000000000000000000815291925060009182919063c0fd8bde90614166908790600401615ac7565b60006040518083038186803b15801561417e57600080fd5b505afa158015614192573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526141ba91908101906156bc565b5091509150806141dd576040516397363b3560e01b815260040160405180910390fd5b6141ef82606001518360800151611579565b61420c576040516397363b3560e01b815260040160405180910390fd5b60d25467ffffffffffffffff1667ffffffffffffffff168260a0015167ffffffffffffffff1614614250576040516309e9f6c160e11b815260040160405180910390fd5b600061425f8360e0015161159c565b905060068160200151600681111561428757634e487b7160e01b600052602160045260246000fd5b146142a5576040516309e9f6c160e11b815260040160405180910390fd5b60006142b482606001516119d5565b875181519192506001600160a01b039182169116146142e6576040516309e9f6c160e11b815260040160405180910390fd5b7fd495c4e5b386d59bccca38a2277b5d70a0f5e47d7b6587a45a6f5aca221a31258561431a60c9546001600160a01b031690565b604080516001600160a01b03938416815292909116602083015201613e99565b60008382013560f01c61434e600284615d07565b925061435e61ffff821684615d07565b92508483013560f81c5b95945050505050565b600061437c60ce5490565b610b919083615e0a565b60008060006143958585612c2d565b909250905060008180156143b957634e487b7160e01b600052602160045260246000fd5b146143d75760405163734fff6760e11b815260040160405180910390fd5b6000803660006143e8898988612cf4565b919a50929650909450909250905060005b8760ff168110156145d7576040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101829052906144428686868a612e3f565b600081815260d560205260409020548251939a50919450925067ffffffffffffffff90811691168110156145cc57600082815260d560209081526040918290208551815487840151888601516060808b015167ffffffffffffffff9586166bffffffffffffffffffffffff1990951685176801000000000000000063ffffffff60039690960b959095168502177fffffffff00000000000000000000000000000000ffffffffffffffffffffffff166c01000000000000000000000000600794850b808916919091027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff1691909117600160a01b92881692830217885560808d01516001909801805460a08f01519990950b88167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090951694909417979096169093029590951790558551918252938101919091529283019190915283917fd06a6b7f4918494b3719217d1802786c1f5112a6c1d88fe2cfec00b4584f6aec910160405180910390a25b5050506001016143f9565b508381146145f85760405163734fff6760e11b815260040160405180910390fd5b50505050505092915050565b6114b061461183836131e9565b614c56565b600054610100900460ff166146935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a5d565b61182833613852565b6001600160a01b0381163b6147195760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610a5d565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61477083614e78565b60008251118061477d5750805b15612aac576120128383614eb8565b36600085848661479c8683615d07565b926147a993929190615cdf565b9150915094509492505050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e082018190526101008201839052610120820152610140810191909152600061482260c9546001600160a01b031690565b6001600160a01b031663c0fd8bde85856040518363ffffffff1660e01b815260040161484f929190615a98565b60006040518083038186803b15801561486757600080fd5b505afa15801561487b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526148a391908101906156bc565b509092509050806148c757604051632acbe91560e01b815260040160405180910390fd5b50613304816060015182608001516040805160f09390931b7fffff000000000000000000000000000000000000000000000000000000000000166020808501919091526022808501939093528151808503909301835260429093018152815191830191909120600090815260cd90925290205460ff1690565b600080600061498485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250614fba92505050565b600188019790915089013560f81c60005b8160ff168110156149cc5760148901988b01356bffffffffffffffffffffffff19166149c18482614fed565b935050600101614995565b50506bffffffffffffffffffffffff199081169516949094149794965093945050505050565b6040805160c08082018352838601602081810135831c600790810b810b958501959095526028820135831c6060850152603082013560e01c600390810b900b908401526034810135821c83526044810135821c840b90930b6080830152604c830135901c60a0820152605490920191903583831115614a845760405163734fff6760e11b815260040160405180910390fd5b935093915050565b6000610b91826060015183608001516040805160f09390931b7fffff000000000000000000000000000000000000000000000000000000000000166020808501919091526022808501939093528151808503909301835260429093018152815191830191909120600090815260cd90925290205460ff1690565b6000614b397f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b8251909150614b49906000610d1d565b306001600160a01b031663e3795cc16040518163ffffffff1660e01b815260040160206040518083038186803b158015614b8257600080fd5b505afa158015614b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bba9190615871565b63ffffffff166397a6f30414614be3576040516397363b3560e01b815260040160405180910390fd5b7f2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a4981614c367f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b604080516001600160a01b03938416815292909116602083015201614047565b60e081015160008080614c688461333a565b92509250925060005b82811015614e1e57600080614c87878786613469565b600081815260d5602052604090205482519887019892945090925067ffffffffffffffff9081169116811015614e1357600082815260d560209081526040918290208551815487840151888601516060808b015167ffffffffffffffff9586166bffffffffffffffffffffffff1990951685176801000000000000000063ffffffff60039690960b959095168502177fffffffff00000000000000000000000000000000ffffffffffffffffffffffff166c01000000000000000000000000600794850b808916919091027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff1691909117600160a01b92881692830217885560808d01516001909801805460a08f01519990950b88167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090951694909417979096169093029590951790558551918252938101919091529283019190915283917fd06a6b7f4918494b3719217d1802786c1f5112a6c1d88fe2cfec00b4584f6aec910160405180910390a25b505050600101614c71565b50606085015160a08601516040805161ffff909316835267ffffffffffffffff90911660208301527f943f0e8a16c19895fb87cbeb1a349ed86d7f31923089dd36c1a1ed5e300f267b910160405180910390a15050505050565b614e818161469c565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b614f375760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610a5d565b600080846001600160a01b031684604051614f5291906159aa565b600060405180830381855af49150503d8060008114614f8d576040519150601f19603f3d011682016040523d82523d6000602084013e614f92565b606091505b50915091506143688282604051806060016040528060278152602001615ef06027913961505f565b6000610b91600083604051602001614fd39291906159c6565b604051602081830303815290604052805160209091012090565b60006bffffffffffffffffffffffff19808316908416111561500d579091905b6040517f010000000000000000000000000000000000000000000000000000000000000060208201526bffffffffffffffffffffffff1980851660218301528316603582015261159590604901614fd3565b6060831561506e575081611595565b61159583838151156150835781518083602001fd5b8060405162461bcd60e51b8152600401610a5d9190615ac7565b5080546000825560020290600052602060002090810190610d4f91905b808211156150da57805461ffff19168155600060018201556002016150ba565b5090565b80356001600160a01b03811681146150f557600080fd5b919050565b60008083601f84011261510b578182fd5b50813567ffffffffffffffff811115615122578182fd5b6020830191508360208260051b8501011115612ced57600080fd5b600082601f83011261514d578081fd5b8151602067ffffffffffffffff82111561516957615169615eb3565b615177818360051b01615c86565b80838252828201915082860187848660071b8901011115615196578586fd5b855b858110156151f957608080838b0312156151b0578788fd5b6151b8615c39565b83518152868401518782015260406151d18186016152d4565b9082015260606151e28582016152d4565b908201528552938501939190910190600101615198565b5090979650505050505050565b805180151581146150f557600080fd5b600082601f830112615226578081fd5b813561523961523482615cb7565b615c86565b81815284602083860101111561524d578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112615277578081fd5b815161528561523482615cb7565b818152846020838601011115615299578283fd5b61246b826020830160208701615e40565b80516150f581615ec9565b805163ffffffff811681146150f557600080fd5b80516150f581615ed9565b805160ff811681146150f557600080fd5b6000602082840312156152f6578081fd5b611595826150de565b6000806000806000806000806000806101008b8d03121561531e578586fd5b6153278b6150de565b995060208b013567ffffffffffffffff80821115615343578788fd5b61534f8e838f016150fa565b909b50995060408d0135915080821115615367578788fd5b506153748d828e016150fa565b90985096505060608b013561538881615ec9565b945060808b0135935060a08b013561539f81615ed9565b8093505060c08b0135915060e08b013590509295989b9194979a5092959850565b600080604083850312156153d2578182fd5b6153db836150de565b9150602083013567ffffffffffffffff8111156153f6578182fd5b61540285828601615216565b9150509250929050565b6000806020838503121561541e578182fd5b823567ffffffffffffffff811115615434578283fd5b615440858286016150fa565b90969095509350505050565b60008060008060008060608789031215615464578384fd5b863567ffffffffffffffff8082111561547b578586fd5b6154878a838b016150fa565b9098509650602089013591508082111561549f578586fd5b6154ab8a838b016150fa565b909650945060408901359150808211156154c3578384fd5b506154d089828a016150fa565b979a9699509497509295939492505050565b600080600080600080608087890312156154fa578384fd5b863567ffffffffffffffff80821115615511578586fd5b61551d8a838b016150fa565b90985096506020890135915080821115615535578586fd5b5061554289828a016150fa565b909550935050604087013561555681615ed9565b9150606087013561556681615ed9565b809150509295509295509295565b600060208284031215615585578081fd5b5035919050565b60006020828403121561559d578081fd5b5051919050565b600080604083850312156155b6578182fd5b50508035926020909101359150565b600080602083850312156155d7578182fd5b823567ffffffffffffffff808211156155ee578384fd5b818501915085601f830112615601578384fd5b81358181111561560f578485fd5b866020828501011115615620578485fd5b60209290920196919550909350505050565b600060208284031215615643578081fd5b813567ffffffffffffffff811115615659578182fd5b61246b84828501615216565b600060408284031215615676578081fd5b6040516040810181811067ffffffffffffffff8211171561569957615699615eb3565b60405282356156a781615ec9565b81526020928301359281019290925250919050565b6000806000606084860312156156d0578081fd5b835167ffffffffffffffff808211156156e7578283fd5b9085019061016082880312156156fb578283fd5b615703615c62565b61570c836152d4565b815261571a602084016152b5565b602082015261572b604084016152b5565b604082015261573c606084016152aa565b60608201526080830151608082015261575760a084016152c9565b60a082015261576860c084016152d4565b60c082015260e08301518281111561577e578485fd5b61578a89828601615267565b60e08301525061010061579e8185016152b5565b9082015261012083810151838111156157b5578586fd5b6157c18a82870161513d565b9183019190915250610140838101519082015294506157e260208701615206565b935060408601519150808211156157f7578283fd5b5061580486828701615267565b9150509250925092565b60006020828403121561581f578081fd5b813561159581615ec9565b60006020828403121561583b578081fd5b815161159581615ec9565b60008060408385031215615858578182fd5b823561586381615ec9565b946020939093013593505050565b600060208284031215615882578081fd5b611595826152b5565b60006020828403121561589c578081fd5b813561159581615ed9565b6000815180845260208085019450808401835b838110156158ee576158db878351805161ffff168252602090810151910152565b60409690960195908201906001016158ba565b509495945050505050565b60008151808452615911816020860160208601615e40565b601f01601f19169290920160200192915050565b80518252602081015161596c6020840182805160070b825267ffffffffffffffff6020820151166020830152604081015160030b6040830152606081015160608301525050565b50604090810151805160070b60a0840152602081015167ffffffffffffffff1660c08401529081015160030b60e08301526060015161010090910152565b600082516159bc818460208701615e40565b9190910192915050565b7fff000000000000000000000000000000000000000000000000000000000000008360f81b16815260008251615a03816001850160208701615e40565b919091016001019392505050565b60208152600061159560208301846158a7565b604081526000615a3760408301856158a7565b828103602084015261436881856158a7565b6020808252825182820181905260009190848201906040850190845b81811015615a8c57615a78838551615925565b928401926101209290920191600101615a65565b50909695505050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60208152600061159560208301846158f9565b602081526000825160208084015261246b60408401826158f9565b815161ffff1681526020808301519082015260408101610b91565b602081526000825160028110615b2857615b28615e9d565b80602084015250602083015160078110615b4457615b44615e9d565b8060408401525061ffff6040840151166060830152606083015160808084015261246b60a08401826158f9565b6101208101610b918284615925565b815160070b815260208083015167ffffffffffffffff169082015260408083015160030b908201526060808301519082015260808101610b91565b602081526000825160208084015261246b60408401826158a7565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615c0a578283fd5b83018035915067ffffffffffffffff821115615c24578283fd5b602001915036819003821315612ced57600080fd5b6040516080810167ffffffffffffffff81118282101715615c5c57615c5c615eb3565b60405290565b604051610160810167ffffffffffffffff81118282101715615c5c57615c5c615eb3565b604051601f8201601f1916810167ffffffffffffffff81118282101715615caf57615caf615eb3565b604052919050565b600067ffffffffffffffff821115615cd157615cd1615eb3565b50601f01601f191660200190565b60008085851115615cee578182fd5b83861115615cfa578182fd5b5050820193919092039150565b60008219821115615d1a57615d1a615e87565b500190565b600181815b80851115615d5a578160001904821115615d4057615d40615e87565b80851615615d4d57918102915b93841c9390800290615d24565b509250929050565b60006115958383600082615d7857506001610b91565b81615d8557506000610b91565b8160018114615d9b5760028114615da557615dc1565b6001915050610b91565b60ff841115615db657615db6615e87565b50506001821b610b91565b5060208310610133831016604e8410600b8410161715615de4575081810a610b91565b615dee8383615d1f565b8060001904821115615e0257615e02615e87565b029392505050565b6000816000190483118215151615615e2457615e24615e87565b500290565b600082821015615e3b57615e3b615e87565b500390565b60005b83811015615e5b578181015183820152602001615e43565b838111156120125750506000910152565b6000600019821415615e8057615e80615e87565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61ffff81168114610d4f57600080fd5b67ffffffffffffffff81168114610d4f57600080fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122099b939a0e68f7cf23dd87f1d08ae171925bb84265dfec2ec4a23e360576bf68364736f6c63430008040033

Deployed ByteCode

0x6080604052600436106102e75760003560e01c80638881016f11610184578063b6ed701e116100d6578063d82d58a51161008a578063e3795cc111610064578063e3795cc11461096b578063ef9e5e2814610982578063f2fde38b1461099557600080fd5b8063d82d58a5146108fd578063e17efd4814610936578063e18910a31461095657600080fd5b8063caaf43f1116100bb578063caaf43f11461089b578063cb718a9b146108c8578063d47eed45146108dd57600080fd5b8063b6ed701e14610868578063b9256d281461088857600080fd5b80639a8a059211610138578063aac4129211610112578063aac41292146106ef578063b5dcc9111461080f578063b5ec02611461082f57600080fd5b80639a8a0592146107a5578063a38d81c6146107cd578063a4ae35e0146107ef57600080fd5b80638da5cb5b116101695780638da5cb5b146107475780639474f45b1461076557806396834ad31461078557600080fd5b80638881016f146106ef57806389a5bb4d1461072757600080fd5b806352d1902d1161023d5780636c72f51b116101f15780637b72bcae116101cb5780637b72bcae1461065b57806384acd1bb1461069057806387c5bd1b146106c257600080fd5b80636c72f51b146105fa578063711a2e2814610626578063715018a61461064657600080fd5b8063586d3cf811610222578063586d3cf81461058e57806358c67635146105ad5780636b7f53ca146105cd57600080fd5b806352d1902d1461052d57806354fd4d501461054257600080fd5b8063437209a71161029f5780634c469d8c116102795780634c469d8c146104aa5780634d7a734e146104fa5780634f1ef2861461051a57600080fd5b8063437209a7146103d55780634716e9c51461046b57806348b6404d1461048b57600080fd5b806331d98b3f116102d057806331d98b3f146103425780633659cfe61461036f578063426234e41461038f57600080fd5b8063146faf77146102ec57806314dd317f1461030e575b600080fd5b3480156102f857600080fd5b5061030c6103073660046152ff565b6109b5565b005b34801561031a57600080fd5b5061032e610329366004615632565b610b06565b604051905181526020015b60405180910390f35b34801561034e57600080fd5b5061036261035d366004615574565b610b61565b6040516103399190615b80565b34801561037b57600080fd5b5061030c61038a3660046152e5565b610b97565b34801561039b57600080fd5b506040805180820182526000808252602091820152815180830190925260d05461ffff16825260d154908201526040516103399190615af5565b3480156103e157600080fd5b5061045b6103f0366004615846565b6040805160f09390931b7fffff000000000000000000000000000000000000000000000000000000000000166020808501919091526022808501939093528151808503909301835260429093018152815191830191909120600090815260cd90925290205460ff1690565b6040519015158152602001610339565b61047e6104793660046154e2565b610d52565b6040516103399190615a49565b34801561049757600080fd5b5060ce545b604051908152602001610339565b3480156104b657600080fd5b506104e16104c5366004615574565b600090815260d5602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff9091168152602001610339565b34801561050657600080fd5b5061032e610515366004615632565b61128b565b61030c6105283660046153c0565b611325565b34801561053957600080fd5b5061049c6114b4565b34801561054e57600080fd5b50604080518082018252600581527f312e332e30000000000000000000000000000000000000000000000000000000602082015290516103399190615ac7565b34801561059a57600080fd5b5060d25467ffffffffffffffff166104e1565b3480156105b957600080fd5b5061045b6105c8366004615846565b611579565b3480156105d957600080fd5b506105ed6105e8366004615632565b61159c565b6040516103399190615b10565b34801561060657600080fd5b5060d45463ffffffff165b60405163ffffffff9091168152602001610339565b34801561063257600080fd5b506103626106413660046155a4565b6117a0565b34801561065257600080fd5b5061030c611816565b34801561066757600080fd5b5061067b610676366004615632565b61182a565b604051905163ffffffff168152602001610339565b34801561069c57600080fd5b5060c9546001600160a01b03165b6040516001600160a01b039091168152602001610339565b3480156106ce57600080fd5b506106e26106dd366004615632565b611858565b6040516103399190615bbb565b3480156106fb57600080fd5b5061070f61070a366004615632565b6119d5565b60405190516001600160a01b03168152602001610339565b34801561073357600080fd5b5061049c610742366004615665565b611a06565b34801561075357600080fd5b506033546001600160a01b03166106aa565b34801561077157600080fd5b50610362610780366004615574565b611a70565b34801561079157600080fd5b506103626107a0366004615574565b611b03565b3480156107b157600080fd5b506107ba611ba5565b60405161ffff9091168152602001610339565b3480156107d957600080fd5b506107e2611c2e565b6040516103399190615a11565b3480156107fb57600080fd5b5061036261080a3660046155a4565b611ca1565b34801561081b57600080fd5b5061036261082a366004615574565b611cce565b34801561083b57600080fd5b5061045b61084a366004615574565b600090815260d5602052604090205467ffffffffffffffff16151590565b34801561087457600080fd5b5061030c6108833660046155c5565b611cfe565b61030c61089636600461544c565b612018565b3480156108a757600080fd5b506108bb6108b6366004615574565b61212b565b6040516103399190615b71565b3480156108d457600080fd5b5060cf5461049c565b3480156108e957600080fd5b5061049c6108f836600461540c565b612308565b34801561090957600080fd5b50610929610918366004615632565b604080516020810190915290815290565b6040516103399190615ada565b34801561094257600080fd5b5061049c610951366004615574565b612473565b34801561096257600080fd5b5061049c612489565b34801561097757600080fd5b506397a6f304610611565b61030c61099036600461540c565b612494565b3480156109a157600080fd5b5061030c6109b03660046152e5565b6125f9565b600054610100900460ff16158080156109d55750600054600160ff909116105b806109ef5750303b1580156109ef575060005460ff166001145b610a665760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b6000805460ff191660011790558015610a89576000805461ff0019166101001790555b610a91612695565b610a9961271a565b610aab8b8b8b8b8b8b8b8b8b8b612797565b610ab3611816565b8015610af9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050505050565b6040805160208101909152600081526000610b218382612a0b565b67ffffffffffffffff168252610b38600882615d07565b905080835114610b5b576040516397363b3560e01b815260040160405180910390fd5b50919050565b604080516080810182526000808252602082018190529181018290526060810191909152610b918261080a612489565b92915050565b306001600160a01b037f00000000000000000000000036825bf3fbdf5a29e2d5148bfe7dcf7b5639e320161415610c365760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610a5d565b7f00000000000000000000000036825bf3fbdf5a29e2d5148bfe7dcf7b5639e3206001600160a01b0316610c917f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614610d0d5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610a5d565b610d1681612a71565b610d4f8160005b6040519080825280601f01601f191660200182016040528015610d47576020820181803683370190505b506000612a79565b50565b60606000610d608888612308565b905080341015610d9c576040517f025dbdd400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b508367ffffffffffffffff811115610dc457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e5457816020015b610e41604080516060808201835260008083528351608081018552818152602081810183905294810182905291820152909182019081526040805160808101825260008082526020828101829052928201819052606082015291015290565b815260200190600190039081610de25790505b50905060005b8681101561120a576004888883818110610e8457634e487b7160e01b600052603260045260246000fd5b9050602002810190610e969190615bd6565b9050118015610eea575063504e4155610ee2898984818110610ec857634e487b7160e01b600052603260045260246000fd5b9050602002810190610eda9190615bd6565b503560e01c90565b63ffffffff16145b156110d757600080610f2c8a8a85818110610f1557634e487b7160e01b600052603260045260246000fd5b9050602002810190610f279190615bd6565b612c2d565b90925090506000818015610f5057634e487b7160e01b600052602160045260246000fd5b14610f6e5760405163734fff6760e11b815260040160405180910390fd5b50600080366000610fb08d8d88818110610f9857634e487b7160e01b600052603260045260246000fd5b9050602002810190610faa9190615bd6565b87612cf4565b93985091965094509250905060005b8360ff168110156110ac576040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101829052906110088786868b612e3f565b91995092509050600061101c8f8f84612f54565b90508d81148061105657508a818151811061104757634e487b7160e01b600052603260045260246000fd5b60209081029190910101515115155b15611063575050506110a4565b825167ffffffffffffffff908116908e16811080159061108d57508c67ffffffffffffffff168111155b1561109f5761109f8c83858785612fa5565b505050505b600101610fbf565b508481146110cd5760405163734fff6760e11b815260040160405180910390fd5b5050505050611202565b606060006111158a8a858181106110fe57634e487b7160e01b600052603260045260246000fd5b90506020028101906111109190615bd6565b6131e9565b60e00151915060009050808061112a8461333a565b92509250925060005b828110156111fc576040848601015160209060006111528e8e84612f54565b90508c81148061118c575089818151811061117d57634e487b7160e01b600052603260045260246000fd5b60209081029190910101515115155b1561119d57505050928101926111f4565b60006111aa898988613469565b50805190915067ffffffffffffffff908116908e1681108015906111d857508c67ffffffffffffffff168111155b156111ea576111ea8c84868585612fa5565b5050509483019450505b600101611133565b50505050505b600101610e5a565b5060005b848110156112805781818151811061123657634e487b7160e01b600052603260045260246000fd5b602090810291909101015151611278576040517f45805f5d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60010161120e565b509695505050505050565b6040805160208101909152600081526000806112a78482612a0b565b90506112b4600883615d07565b915060006112c28584612a0b565b90506112cf600884615d07565b92506112e667ffffffffffffffff8216600a615d62565b6112fa9067ffffffffffffffff8416615e0a565b84528451831461131d576040516397363b3560e01b815260040160405180910390fd5b505050919050565b306001600160a01b037f00000000000000000000000036825bf3fbdf5a29e2d5148bfe7dcf7b5639e3201614156113c45760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152608401610a5d565b7f00000000000000000000000036825bf3fbdf5a29e2d5148bfe7dcf7b5639e3206001600160a01b031661141f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b03161461149b5760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152608401610a5d565b6114a482612a71565b6114b082826001612a79565b5050565b6000306001600160a01b037f00000000000000000000000036825bf3fbdf5a29e2d5148bfe7dcf7b5639e32016146115545760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a5d565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b60d05460009061ffff8481169116148015611595575060d15482145b9392505050565b6115c8604080516080810190915280600081526020016000815260006020820152606060409091015290565b6000806115d58482613579565b905063ffffffff8116635054474d14611601576040516397363b3560e01b815260040160405180910390fd5b61160c600483615d07565b9150600061161a85846135df565b90508060ff16600181111561163f57634e487b7160e01b600052602160045260246000fd5b8490600181111561166057634e487b7160e01b600052602160045260246000fd5b9081600181111561168157634e487b7160e01b600052602160045260246000fd5b90525061168f600184615d07565b92506001845160018111156116b457634e487b7160e01b600052602160045260246000fd5b146116d2576040516363daeb7760e01b815260040160405180910390fd5b60006116de86856135df565b90508060ff16600681111561170357634e487b7160e01b600052602160045260246000fd5b8560200190600681111561172757634e487b7160e01b600052602160045260246000fd5b9081600681111561174857634e487b7160e01b600052602160045260246000fd5b905250611756600185615d07565b93506117628685613645565b61ffff166040860152611776600285615d07565b9350611791848588516117899190615e29565b8891906136ab565b60608601525092949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526117cd83611a70565b9050816117de4283606001516137d3565b1115610b91576040517f19abf40e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61181e6137f8565b6118286000613852565b565b60408051602081019091526000815260006118458382613579565b63ffffffff168252610b38600482615d07565b60408051602081019091526060815260008061187484826135df565b9050611881600183615d07565b91508060ff1667ffffffffffffffff8111156118ad57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156118f257816020015b60408051808201909152600080825260208201528152602001906001900390816118cb5790505b50835260005b8160ff168110156119ac5761190d8584613645565b845180518390811061192f57634e487b7160e01b600052603260045260246000fd5b602090810291909101015161ffff909116905261194d600284615d07565b925061195985846138b1565b845180518390811061197b57634e487b7160e01b600052603260045260246000fd5b602002602001015160200181815250506020836119989190615d07565b9250806119a481615e6c565b9150506118f8565b50818451146119ce576040516397363b3560e01b815260040160405180910390fd5b5050919050565b60408051602081019091526000815260006119f08382613917565b6001600160a01b03168252610b38601482615d07565b600081600001518260200151604051602001611a5392919060f09290921b7fffff000000000000000000000000000000000000000000000000000000000000168252600282015260220190565b604051602081830303815290604052805190602001209050919050565b60408051608081018252600080825260208083018281528385018381526060850184815287855260d590935294909220805467ffffffffffffffff808216938490526801000000000000000091829004600390810b810b900b9096526001820154600781810b810b900b865204909416909152909190610b5b57604051630295d7cd60e31b815260040160405180910390fd5b60408051608081018252600080825260208083018281528385018381526060850184815287855260d590935294909220805467ffffffffffffffff80821693849052680100000000000000008204600390810b810b900b9096526c010000000000000000000000008104600790810b810b900b8552600160a01b9004909416909152909190610b5b57604051630295d7cd60e31b815260040160405180910390fd5b6000611bb960c9546001600160a01b031690565b6001600160a01b0316639a8a05926040518163ffffffff1660e01b815260040160206040518083038186803b158015611bf157600080fd5b505afa158015611c05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c29919061582a565b905090565b606060c9600301805480602002602001604051908101604052809291908181526020016000905b82821015611c985760008481526020908190206040805180820190915260028502909101805461ffff168252600190810154828401529083529092019101611c55565b50505050905090565b6040805160808101825260008082526020820181905291810182905260608101919091526117cd83611b03565b604080516080810182526000808252602082018190529181018290526060810191909152610b9182610641612489565b6000611d3f83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061398d92505050565b90506000611d508260e0015161159c565b9050611d5a611ba5565b61ffff16816040015161ffff1614158015611d7c5750604081015161ffff1615155b15611d9a576040516363daeb7760e01b815260040160405180910390fd5b600081602001516006811115611dc057634e487b7160e01b600052602160045260246000fd5b1415611e0657604081015161ffff16611dec576040516363daeb7760e01b815260040160405180910390fd5b611e01611dfc82606001516119d5565b613b6e565b612012565b600181602001516006811115611e2c57634e487b7160e01b600052602160045260246000fd5b1415611e5357611e01611e4e8260600151604080516020810190915290815290565b613b77565b600281602001516006811115611e7957634e487b7160e01b600052602160045260246000fd5b1415611e9457611e01611e8f8260600151611858565b613eaa565b600381602001516006811115611eba57634e487b7160e01b600052602160045260246000fd5b1415611ed557611e01611ed0826060015161128b565b614053565b600481602001516006811115611efb57634e487b7160e01b600052602160045260246000fd5b1415611f1657611e01611f118260600151610b06565b6140a5565b600581602001516006811115611f3c57634e487b7160e01b600052602160045260246000fd5b1415611f5b576040516397363b3560e01b815260040160405180910390fd5b600681602001516006811115611f8157634e487b7160e01b600052602160045260246000fd5b1415611ff957604081015161ffff16611fad576040516363daeb7760e01b815260040160405180910390fd5b611e01611fbd82606001516119d5565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506140e292505050565b6040516397363b3560e01b815260040160405180910390fd5b50505050565b8281146120385760405163a9cb9e0d60e01b815260040160405180910390fd5b60005b838110156120f05782828281811061206357634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612078919061588b565b67ffffffffffffffff166120c88686848181106120a557634e487b7160e01b600052603260045260246000fd5b90506020020135600090815260d5602052604090205467ffffffffffffffff1690565b67ffffffffffffffff1610156120e8576120e28787612494565b50612123565b60010161203b565b506040517fde2c57fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050565b61218a604080516060808201835260008083528351608081018552818152602081810183905294810182905291820152909182019081526040805160808101825260008082526020828101829052928201819052606082015291015290565b6040805160c08082018352600080835260208084018290528385018290526060808501839052608080860184905260a095860184905288845260d5835286842087519586018852805467ffffffffffffffff808216885268010000000000000000808304600390810b810b900b968901969096526c010000000000000000000000008204600790810b810b810b9a89019a909a52600160a01b9091048116938701939093526001015480880b880b90970b90850152940490931691810191909152805190915067ffffffffffffffff1661227757604051630295d7cd60e31b815260040160405180910390fd5b91815260408083015160208084018051600793840b840b9052606080870151825167ffffffffffffffff9182169085015283880180518451600391820b820b9089015289519451948316948401949094526080890151878901805191880b90970b905260a089015186519083169501949094529251845190830b90920b919094015293519051931692019190915290565b600080805b8381101561246157600485858381811061233757634e487b7160e01b600052603260045260246000fd5b90506020028101906123499190615bd6565b9050118015612383575063504e415561237b868684818110610ec857634e487b7160e01b600052603260045260246000fd5b63ffffffff16145b15612441576000806123ae878785818110610f1557634e487b7160e01b600052603260045260246000fd5b909250905060008180156123d257634e487b7160e01b600052602160045260246000fd5b146123f05760405163734fff6760e11b815260040160405180910390fd5b61242b87878581811061241357634e487b7160e01b600052603260045260246000fd5b90506020028101906124259190615bd6565b8461433a565b6124389060ff1685615d07565b9350505061244f565b61244c600183615d07565b91505b8061245981615e6c565b91505061230d565b5061246b81614371565b949350505050565b60008161247f60ce5490565b610b919190615e0a565b6000611c2960cf5490565b6000805b828110156125b15760048484838181106124c257634e487b7160e01b600052603260045260246000fd5b90506020028101906124d49190615bd6565b905011801561250e575063504e4155612506858584818110610ec857634e487b7160e01b600052603260045260246000fd5b63ffffffff16145b156125615761254d84848381811061253657634e487b7160e01b600052603260045260246000fd5b90506020028101906125489190615bd6565b614386565b61255a9060ff1683615d07565b91506125a9565b61259b84848381811061258457634e487b7160e01b600052603260045260246000fd5b90506020028101906125969190615bd6565b614604565b6125a6600183615d07565b91505b600101612498565b5060006125bd82614371565b905080341015612012576040517f025dbdd400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126016137f8565b6001600160a01b03811661267d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a5d565b610d4f81613852565b6001600160a01b03163b151590565b600054610100900460ff166127125760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a5d565b611828614616565b600054610100900460ff166118285760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a5d565b60c9805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038c161790558786146127df5760405163a9cb9e0d60e01b815260040160405180910390fd5b60005b888110156129a257600060405180604001604052808c8c8581811061281757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061282c919061580e565b61ffff1681526020018a8a8581811061285557634e487b7160e01b600052603260045260246000fd5b602090810292909201359092528251838201516040805160f09390931b7fffff00000000000000000000000000000000000000000000000000000000000016838501526022808401929092528051808403909201825260429092018252805190830120600090815260cd9092529020549192505060ff16156128ea5760405163a9cb9e0d60e01b815260040160405180910390fd5b600160cd60006128f984611a06565b81526020808201929092526040016000908120805460ff19169315159390931790925560cc8054600181018255925282517f47197230e1e4b29fc0bd84d7d78966c0925452aff72a2a121538b102457e9ebe6002909302928301805461ffff191661ffff90921691909117905591909101517f47197230e1e4b29fc0bd84d7d78966c0925452aff72a2a121538b102457e9ebf909101558061299a81615e6c565b9150506127e2565b506040805180820190915261ffff86168082526020820186905260d0805461ffff1916909117905560d185905560d2805467ffffffffffffffff191667ffffffffffffffff8616179055506129f68260cf55565b6129ff8160ce55565b50505050505050505050565b6000612a18826008615d07565b83511015612a685760405162461bcd60e51b815260206004820152601460248201527f746f55696e7436345f6f75744f66426f756e64730000000000000000000000006044820152606401610a5d565b50016008015190565b610d4f6137f8565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612ab157612aac8361469c565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b158015612aea57600080fd5b505afa925050508015612b1a575060408051601f3d908101601f19168201909252612b179181019061558c565b60015b612b8c5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608401610a5d565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114612c215760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152608401610a5d565b50612aac838383614767565b60046000833560e01c63504e41558114612c5a5760405163734fff6760e11b815260040160405180910390fd5b60018084019386013560f81c908114612c865760405163734fff6760e11b815260040160405180910390fd5b50508184016001013560f890811c9092016002818101939186010135901c60ff168015612cc357634e487b7160e01b600052602160045260246000fd5b60019290920191905081831015612ced5760405163734fff6760e11b815260040160405180910390fd5b9250929050565b600080803681612d0888888880820361478c565b600296509092509050813560f01c60606000612d2e612d2986868b8761478c565b6147b6565b60e0015160048082015161ffff86169a909a01999193509150634155575663ffffffff821614612d715760405163734fff6760e11b815260040160405180910390fd5b8183016001015160009060ff168015612d9a57634e487b7160e01b600052602160045260246000fd5b60019093019290506000818015612dc157634e487b7160e01b600052602160045260246000fd5b14612ddf5760405163734fff6760e11b815260040160405180910390fd5b602c848401015184516c0100000000000000000000000090910460601b9950602090930192831115612e245760405163734fff6760e11b815260040160405180910390fd5b5050600188019b969a505050509381013560f81c9550935050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101829052600283019282903690829088013560f01c612e8d8989898461478c565b925092508061ffff16870196506000612eaa8a8a8a8e8888614940565b9750905080612ecc5760405163734fff6760e11b815260040160405180910390fd5b6000843560f81c8015612eef57634e487b7160e01b600052602160045260246000fd5b90506000818015612f1057634e487b7160e01b600052602160045260246000fd5b1415612f2c57612f22858560016149f2565b9097509550612f45565b60405163734fff6760e11b815260040160405180910390fd5b50505050509450945094915050565b6000805b8381101561246b5782858583818110612f8157634e487b7160e01b600052603260045260246000fd5b905060200201351415612f935761246b565b80612f9d81615e6c565b915050612f58565b82858581518110612fc657634e487b7160e01b600052603260045260246000fd5b602002602001015160000181815250508160400151858581518110612ffb57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516000019060070b908160070b81525050816060015185858151811061303c57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516020019067ffffffffffffffff16908167ffffffffffffffff1681525050816020015185858151811061308b57634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516040019060030b908160030b81525050808585815181106130c857634e487b7160e01b600052603260045260246000fd5b6020026020010151602001516060018181525050816080015185858151811061310157634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516000019060070b908160070b815250508160a0015185858151811061314257634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516020019067ffffffffffffffff16908167ffffffffffffffff1681525050816020015185858151811061319157634e487b7160e01b600052603260045260246000fd5b6020026020010151604001516040019060030b908160030b81525050808585815181106131ce57634e487b7160e01b600052603260045260246000fd5b60200260200101516040015160600181815250505050505050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e082018190526101008201839052610120820152610140810191909152600061325560c9546001600160a01b031690565b6001600160a01b031663c0fd8bde85856040518363ffffffff1660e01b8152600401613282929190615a98565b60006040518083038186803b15801561329a57600080fd5b505afa1580156132ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526132d691908101906156bc565b509092509050806132fa57604051632acbe91560e01b815260040160405180910390fd5b5061330481614a8c565b610b91576040517fe60dce7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080808061334d858260049101015190565b90506004840193508063ffffffff1663503257481461337f5760405163734fff6760e11b815260040160405180910390fd5b6002858501810151940193600361ffff8216146133af5760405163734fff6760e11b815260040160405180910390fd5b60028501945060006133c5878760029101015190565b905060028601955060006133dd888860019101015190565b90508161ffff16870196508060ff1660021461340c5760405163734fff6760e11b815260040160405180910390fd5b505050508284016002015161ffff169150600283019250613431848460029101015190565b61ffff16905060028301925081810283018451146134625760405163734fff6760e11b815260040160405180910390fd5b9193909250565b6040805160c081018252600080825260208201818152828401828152606084018381526080850184815260a08601948552888a01968701516048880151600790810b810b909452605088015167ffffffffffffffff9081169093526054880151600390810b900b909452605c870151830b90920b909152606485015181169092526065840151607d94850151909216835291929060ff8116600114156135145760188201915061354e565b8582018701600881015167ffffffffffffffff90811686526010820151600790810b900b6040870152601891820151166060860152909101905b50838111156135705760405163734fff6760e11b815260040160405180910390fd5b50935093915050565b6000613586826004615d07565b835110156135d65760405162461bcd60e51b815260206004820152601460248201527f746f55696e7433325f6f75744f66426f756e64730000000000000000000000006044820152606401610a5d565b50016004015190565b60006135ec826001615d07565b8351101561363c5760405162461bcd60e51b815260206004820152601360248201527f746f55696e74385f6f75744f66426f756e6473000000000000000000000000006044820152606401610a5d565b50016001015190565b6000613652826002615d07565b835110156136a25760405162461bcd60e51b815260206004820152601460248201527f746f55696e7431365f6f75744f66426f756e64730000000000000000000000006044820152606401610a5d565b50016002015190565b6060816136b981601f615d07565b10156137075760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610a5d565b6137118284615d07565b845110156137615760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610a5d565b60608215801561378057604051915060008252602082016040526137ca565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156137b95780518352602092830192016137a1565b5050858452601f01601f1916604052505b50949350505050565b6000818311156137ee576137e78284615e29565b9050610b91565b6137e78383615e29565b6033546001600160a01b031633146118285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a5d565b603380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006138be826020615d07565b8351101561390e5760405162461bcd60e51b815260206004820152601560248201527f746f427974657333325f6f75744f66426f756e647300000000000000000000006044820152606401610a5d565b50016020015190565b6000613924826014615d07565b835110156139745760405162461bcd60e51b815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e647300000000000000000000006044820152606401610a5d565b5001602001516c01000000000000000000000000900490565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820181905261010082018390526101208201526101408101919091526000806139fa60c9546001600160a01b031690565b6001600160a01b031663c0fd8bde856040518263ffffffff1660e01b8152600401613a259190615ac7565b60006040518083038186803b158015613a3d57600080fd5b505afa158015613a51573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a7991908101906156bc565b509150915080613a9c57604051632acbe91560e01b815260040160405180910390fd5b613aae82606001518360800151611579565b613ae4576040517f360f2d8700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60d25467ffffffffffffffff1667ffffffffffffffff168260a0015167ffffffffffffffff1611613b41576040517f88d1b84700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a082015160d2805467ffffffffffffffff191667ffffffffffffffff9092169190911790555092915050565b610d4f81614b06565b6000613bab6040805180820182526000808252602091820152815180830190925260d05461ffff16825260d1549082015290565b9050600080613bc260c9546001600160a01b031690565b84516040517fc0fd8bde0000000000000000000000000000000000000000000000000000000081526001600160a01b03929092169163c0fd8bde91613c0991600401615ac7565b60006040518083038186803b158015613c2157600080fd5b505afa158015613c35573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613c5d91908101906156bc565b509150915080613c8057604051632acbe91560e01b815260040160405180910390fd5b6000613c8f8360e0015161159c565b9050613c99611ba5565b61ffff16816040015161ffff1614158015613cbb5750604081015161ffff1615155b15613cd9576040516363daeb7760e01b815260040160405180910390fd5b600581602001516006811115613cff57634e487b7160e01b600052602160045260246000fd5b14613d1d576040516397363b3560e01b815260040160405180910390fd5b6000613d2c826060015161182a565b805190915063ffffffff16613d4660d45463ffffffff1690565b63ffffffff1610613d83576040517f88d1b84700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160d480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff909216919091179055604080518082018252606086015161ffff168082526080870151602080840182905260d0805461ffff19168417905560d182905560a089015160d2805467ffffffffffffffff191667ffffffffffffffff90921691909117905584518086018652600080825290820152845180860190955291845290830152907f6bce23ef3d34e51710fe4700b43ba5f1733a6215c883f384671a4ece3ea8aa2090879060d25460408051845161ffff908116825260209586015186830152845116918101919091529290910151606083015267ffffffffffffffff16608082015260a0015b60405180910390a150505050505050565b6000613eb4611c2e565b905060005b8151811015613f2c57600060c96004016000613efb858581518110613eee57634e487b7160e01b600052603260045260246000fd5b6020026020010151611a06565b81526020810191909152604001600020805460ff1916911515919091179055613f25600182615d07565b9050613eb9565b50613f3960cc600061509d565b60005b82515181101561400e578251805160cc919083908110613f6c57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182546001808201855560009485528385208351600290930201805461ffff191661ffff90931692909217825591909201519181019190915584518051919260cd929091613fdd9186908110613eee57634e487b7160e01b600052603260045260246000fd5b81526020810191909152604001600020805460ff19169115159190911790558061400681615e6c565b915050613f3c565b507fd451e0fcb7c5b9e13de533604d158069dad159841c45f39f09d379bfc423080d81614039611c2e565b604051614047929190615a24565b60405180910390a15050565b600061405e60ce5490565b825160ce5590507f74dbbbe280ef27b79a8a0c449d5ae2ba7a31849103241d0f98df70bbc9d03e378161409060ce5490565b60408051928352602083019190915201614047565b60006140b060cf5490565b825160cf5590507fcdb88a22f82ddd76115ab7c66cf08eb1e40afe80c9b31017eb2cbdb1570b33ae8161409060cf5490565b60006140f660c9546001600160a01b031690565b835160c9805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390921691821790556040517fc0fd8bde00000000000000000000000000000000000000000000000000000000815291925060009182919063c0fd8bde90614166908790600401615ac7565b60006040518083038186803b15801561417e57600080fd5b505afa158015614192573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526141ba91908101906156bc565b5091509150806141dd576040516397363b3560e01b815260040160405180910390fd5b6141ef82606001518360800151611579565b61420c576040516397363b3560e01b815260040160405180910390fd5b60d25467ffffffffffffffff1667ffffffffffffffff168260a0015167ffffffffffffffff1614614250576040516309e9f6c160e11b815260040160405180910390fd5b600061425f8360e0015161159c565b905060068160200151600681111561428757634e487b7160e01b600052602160045260246000fd5b146142a5576040516309e9f6c160e11b815260040160405180910390fd5b60006142b482606001516119d5565b875181519192506001600160a01b039182169116146142e6576040516309e9f6c160e11b815260040160405180910390fd5b7fd495c4e5b386d59bccca38a2277b5d70a0f5e47d7b6587a45a6f5aca221a31258561431a60c9546001600160a01b031690565b604080516001600160a01b03938416815292909116602083015201613e99565b60008382013560f01c61434e600284615d07565b925061435e61ffff821684615d07565b92508483013560f81c5b95945050505050565b600061437c60ce5490565b610b919083615e0a565b60008060006143958585612c2d565b909250905060008180156143b957634e487b7160e01b600052602160045260246000fd5b146143d75760405163734fff6760e11b815260040160405180910390fd5b6000803660006143e8898988612cf4565b919a50929650909450909250905060005b8760ff168110156145d7576040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101829052906144428686868a612e3f565b600081815260d560205260409020548251939a50919450925067ffffffffffffffff90811691168110156145cc57600082815260d560209081526040918290208551815487840151888601516060808b015167ffffffffffffffff9586166bffffffffffffffffffffffff1990951685176801000000000000000063ffffffff60039690960b959095168502177fffffffff00000000000000000000000000000000ffffffffffffffffffffffff166c01000000000000000000000000600794850b808916919091027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff1691909117600160a01b92881692830217885560808d01516001909801805460a08f01519990950b88167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090951694909417979096169093029590951790558551918252938101919091529283019190915283917fd06a6b7f4918494b3719217d1802786c1f5112a6c1d88fe2cfec00b4584f6aec910160405180910390a25b5050506001016143f9565b508381146145f85760405163734fff6760e11b815260040160405180910390fd5b50505050505092915050565b6114b061461183836131e9565b614c56565b600054610100900460ff166146935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a5d565b61182833613852565b6001600160a01b0381163b6147195760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610a5d565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b61477083614e78565b60008251118061477d5750805b15612aac576120128383614eb8565b36600085848661479c8683615d07565b926147a993929190615cdf565b9150915094509492505050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e082018190526101008201839052610120820152610140810191909152600061482260c9546001600160a01b031690565b6001600160a01b031663c0fd8bde85856040518363ffffffff1660e01b815260040161484f929190615a98565b60006040518083038186803b15801561486757600080fd5b505afa15801561487b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526148a391908101906156bc565b509092509050806148c757604051632acbe91560e01b815260040160405180910390fd5b50613304816060015182608001516040805160f09390931b7fffff000000000000000000000000000000000000000000000000000000000000166020808501919091526022808501939093528151808503909301835260429093018152815191830191909120600090815260cd90925290205460ff1690565b600080600061498485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250614fba92505050565b600188019790915089013560f81c60005b8160ff168110156149cc5760148901988b01356bffffffffffffffffffffffff19166149c18482614fed565b935050600101614995565b50506bffffffffffffffffffffffff199081169516949094149794965093945050505050565b6040805160c08082018352838601602081810135831c600790810b810b958501959095526028820135831c6060850152603082013560e01c600390810b900b908401526034810135821c83526044810135821c840b90930b6080830152604c830135901c60a0820152605490920191903583831115614a845760405163734fff6760e11b815260040160405180910390fd5b935093915050565b6000610b91826060015183608001516040805160f09390931b7fffff000000000000000000000000000000000000000000000000000000000000166020808501919091526022808501939093528151808503909301835260429093018152815191830191909120600090815260cd90925290205460ff1690565b6000614b397f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b8251909150614b49906000610d1d565b306001600160a01b031663e3795cc16040518163ffffffff1660e01b815260040160206040518083038186803b158015614b8257600080fd5b505afa158015614b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bba9190615871565b63ffffffff166397a6f30414614be3576040516397363b3560e01b815260040160405180910390fd5b7f2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a4981614c367f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b604080516001600160a01b03938416815292909116602083015201614047565b60e081015160008080614c688461333a565b92509250925060005b82811015614e1e57600080614c87878786613469565b600081815260d5602052604090205482519887019892945090925067ffffffffffffffff9081169116811015614e1357600082815260d560209081526040918290208551815487840151888601516060808b015167ffffffffffffffff9586166bffffffffffffffffffffffff1990951685176801000000000000000063ffffffff60039690960b959095168502177fffffffff00000000000000000000000000000000ffffffffffffffffffffffff166c01000000000000000000000000600794850b808916919091027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff1691909117600160a01b92881692830217885560808d01516001909801805460a08f01519990950b88167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090951694909417979096169093029590951790558551918252938101919091529283019190915283917fd06a6b7f4918494b3719217d1802786c1f5112a6c1d88fe2cfec00b4584f6aec910160405180910390a25b505050600101614c71565b50606085015160a08601516040805161ffff909316835267ffffffffffffffff90911660208301527f943f0e8a16c19895fb87cbeb1a349ed86d7f31923089dd36c1a1ed5e300f267b910160405180910390a15050505050565b614e818161469c565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b614f375760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610a5d565b600080846001600160a01b031684604051614f5291906159aa565b600060405180830381855af49150503d8060008114614f8d576040519150601f19603f3d011682016040523d82523d6000602084013e614f92565b606091505b50915091506143688282604051806060016040528060278152602001615ef06027913961505f565b6000610b91600083604051602001614fd39291906159c6565b604051602081830303815290604052805160209091012090565b60006bffffffffffffffffffffffff19808316908416111561500d579091905b6040517f010000000000000000000000000000000000000000000000000000000000000060208201526bffffffffffffffffffffffff1980851660218301528316603582015261159590604901614fd3565b6060831561506e575081611595565b61159583838151156150835781518083602001fd5b8060405162461bcd60e51b8152600401610a5d9190615ac7565b5080546000825560020290600052602060002090810190610d4f91905b808211156150da57805461ffff19168155600060018201556002016150ba565b5090565b80356001600160a01b03811681146150f557600080fd5b919050565b60008083601f84011261510b578182fd5b50813567ffffffffffffffff811115615122578182fd5b6020830191508360208260051b8501011115612ced57600080fd5b600082601f83011261514d578081fd5b8151602067ffffffffffffffff82111561516957615169615eb3565b615177818360051b01615c86565b80838252828201915082860187848660071b8901011115615196578586fd5b855b858110156151f957608080838b0312156151b0578788fd5b6151b8615c39565b83518152868401518782015260406151d18186016152d4565b9082015260606151e28582016152d4565b908201528552938501939190910190600101615198565b5090979650505050505050565b805180151581146150f557600080fd5b600082601f830112615226578081fd5b813561523961523482615cb7565b615c86565b81815284602083860101111561524d578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112615277578081fd5b815161528561523482615cb7565b818152846020838601011115615299578283fd5b61246b826020830160208701615e40565b80516150f581615ec9565b805163ffffffff811681146150f557600080fd5b80516150f581615ed9565b805160ff811681146150f557600080fd5b6000602082840312156152f6578081fd5b611595826150de565b6000806000806000806000806000806101008b8d03121561531e578586fd5b6153278b6150de565b995060208b013567ffffffffffffffff80821115615343578788fd5b61534f8e838f016150fa565b909b50995060408d0135915080821115615367578788fd5b506153748d828e016150fa565b90985096505060608b013561538881615ec9565b945060808b0135935060a08b013561539f81615ed9565b8093505060c08b0135915060e08b013590509295989b9194979a5092959850565b600080604083850312156153d2578182fd5b6153db836150de565b9150602083013567ffffffffffffffff8111156153f6578182fd5b61540285828601615216565b9150509250929050565b6000806020838503121561541e578182fd5b823567ffffffffffffffff811115615434578283fd5b615440858286016150fa565b90969095509350505050565b60008060008060008060608789031215615464578384fd5b863567ffffffffffffffff8082111561547b578586fd5b6154878a838b016150fa565b9098509650602089013591508082111561549f578586fd5b6154ab8a838b016150fa565b909650945060408901359150808211156154c3578384fd5b506154d089828a016150fa565b979a9699509497509295939492505050565b600080600080600080608087890312156154fa578384fd5b863567ffffffffffffffff80821115615511578586fd5b61551d8a838b016150fa565b90985096506020890135915080821115615535578586fd5b5061554289828a016150fa565b909550935050604087013561555681615ed9565b9150606087013561556681615ed9565b809150509295509295509295565b600060208284031215615585578081fd5b5035919050565b60006020828403121561559d578081fd5b5051919050565b600080604083850312156155b6578182fd5b50508035926020909101359150565b600080602083850312156155d7578182fd5b823567ffffffffffffffff808211156155ee578384fd5b818501915085601f830112615601578384fd5b81358181111561560f578485fd5b866020828501011115615620578485fd5b60209290920196919550909350505050565b600060208284031215615643578081fd5b813567ffffffffffffffff811115615659578182fd5b61246b84828501615216565b600060408284031215615676578081fd5b6040516040810181811067ffffffffffffffff8211171561569957615699615eb3565b60405282356156a781615ec9565b81526020928301359281019290925250919050565b6000806000606084860312156156d0578081fd5b835167ffffffffffffffff808211156156e7578283fd5b9085019061016082880312156156fb578283fd5b615703615c62565b61570c836152d4565b815261571a602084016152b5565b602082015261572b604084016152b5565b604082015261573c606084016152aa565b60608201526080830151608082015261575760a084016152c9565b60a082015261576860c084016152d4565b60c082015260e08301518281111561577e578485fd5b61578a89828601615267565b60e08301525061010061579e8185016152b5565b9082015261012083810151838111156157b5578586fd5b6157c18a82870161513d565b9183019190915250610140838101519082015294506157e260208701615206565b935060408601519150808211156157f7578283fd5b5061580486828701615267565b9150509250925092565b60006020828403121561581f578081fd5b813561159581615ec9565b60006020828403121561583b578081fd5b815161159581615ec9565b60008060408385031215615858578182fd5b823561586381615ec9565b946020939093013593505050565b600060208284031215615882578081fd5b611595826152b5565b60006020828403121561589c578081fd5b813561159581615ed9565b6000815180845260208085019450808401835b838110156158ee576158db878351805161ffff168252602090810151910152565b60409690960195908201906001016158ba565b509495945050505050565b60008151808452615911816020860160208601615e40565b601f01601f19169290920160200192915050565b80518252602081015161596c6020840182805160070b825267ffffffffffffffff6020820151166020830152604081015160030b6040830152606081015160608301525050565b50604090810151805160070b60a0840152602081015167ffffffffffffffff1660c08401529081015160030b60e08301526060015161010090910152565b600082516159bc818460208701615e40565b9190910192915050565b7fff000000000000000000000000000000000000000000000000000000000000008360f81b16815260008251615a03816001850160208701615e40565b919091016001019392505050565b60208152600061159560208301846158a7565b604081526000615a3760408301856158a7565b828103602084015261436881856158a7565b6020808252825182820181905260009190848201906040850190845b81811015615a8c57615a78838551615925565b928401926101209290920191600101615a65565b50909695505050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60208152600061159560208301846158f9565b602081526000825160208084015261246b60408401826158f9565b815161ffff1681526020808301519082015260408101610b91565b602081526000825160028110615b2857615b28615e9d565b80602084015250602083015160078110615b4457615b44615e9d565b8060408401525061ffff6040840151166060830152606083015160808084015261246b60a08401826158f9565b6101208101610b918284615925565b815160070b815260208083015167ffffffffffffffff169082015260408083015160030b908201526060808301519082015260808101610b91565b602081526000825160208084015261246b60408401826158a7565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615c0a578283fd5b83018035915067ffffffffffffffff821115615c24578283fd5b602001915036819003821315612ced57600080fd5b6040516080810167ffffffffffffffff81118282101715615c5c57615c5c615eb3565b60405290565b604051610160810167ffffffffffffffff81118282101715615c5c57615c5c615eb3565b604051601f8201601f1916810167ffffffffffffffff81118282101715615caf57615caf615eb3565b604052919050565b600067ffffffffffffffff821115615cd157615cd1615eb3565b50601f01601f191660200190565b60008085851115615cee578182fd5b83861115615cfa578182fd5b5050820193919092039150565b60008219821115615d1a57615d1a615e87565b500190565b600181815b80851115615d5a578160001904821115615d4057615d40615e87565b80851615615d4d57918102915b93841c9390800290615d24565b509250929050565b60006115958383600082615d7857506001610b91565b81615d8557506000610b91565b8160018114615d9b5760028114615da557615dc1565b6001915050610b91565b60ff841115615db657615db6615e87565b50506001821b610b91565b5060208310610133831016604e8410600b8410161715615de4575081810a610b91565b615dee8383615d1f565b8060001904821115615e0257615e02615e87565b029392505050565b6000816000190483118215151615615e2457615e24615e87565b500290565b600082821015615e3b57615e3b615e87565b500390565b60005b83811015615e5b578181015183820152602001615e43565b838111156120125750506000910152565b6000600019821415615e8057615e80615e87565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61ffff81168114610d4f57600080fd5b67ffffffffffffffff81168114610d4f57600080fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122099b939a0e68f7cf23dd87f1d08ae171925bb84265dfec2ec4a23e360576bf68364736f6c63430008040033