{
  "_format": "hh-sol-artifact-1",
  "contractName": "EVM2EVMOffRamp",
  "sourceName": "src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol",
  "abi": [
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "commitStore",
              "type": "address"
            },
            {
              "internalType": "uint64",
              "name": "chainSelector",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "sourceChainSelector",
              "type": "uint64"
            },
            {
              "internalType": "address",
              "name": "onRamp",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "prevOffRamp",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "armProxy",
              "type": "address"
            }
          ],
          "internalType": "struct EVM2EVMOffRamp.StaticConfig",
          "name": "staticConfig",
          "type": "tuple"
        },
        {
          "internalType": "contract IERC20[]",
          "name": "sourceTokens",
          "type": "address[]"
        },
        {
          "internalType": "contract IPool[]",
          "name": "pools",
          "type": "address[]"
        },
        {
          "components": [
            {
              "internalType": "bool",
              "name": "isEnabled",
              "type": "bool"
            },
            {
              "internalType": "uint128",
              "name": "capacity",
              "type": "uint128"
            },
            {
              "internalType": "uint128",
              "name": "rate",
              "type": "uint128"
            }
          ],
          "internalType": "struct RateLimiter.Config",
          "name": "rateLimiterConfig",
          "type": "tuple"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "capacity",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "requested",
          "type": "uint256"
        }
      ],
      "name": "AggregateValueMaxCapacityExceeded",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "minWaitInSeconds",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "available",
          "type": "uint256"
        }
      ],
      "name": "AggregateValueRateLimitReached",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "sequenceNumber",
          "type": "uint64"
        }
      ],
      "name": "AlreadyAttempted",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "sequenceNumber",
          "type": "uint64"
        }
      ],
      "name": "AlreadyExecuted",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "BadARMSignal",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "BucketOverfilled",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CanOnlySelfCall",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CommitStoreAlreadyInUse",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "expected",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "actual",
          "type": "bytes32"
        }
      ],
      "name": "ConfigDigestMismatch",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "EmptyReport",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "error",
          "type": "bytes"
        }
      ],
      "name": "ExecutionError",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "expected",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "actual",
          "type": "uint256"
        }
      ],
      "name": "ForkedChain",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "message",
          "type": "string"
        }
      ],
      "name": "InvalidConfig",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "newLimit",
          "type": "uint256"
        }
      ],
      "name": "InvalidManualExecutionGasLimit",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidMessageId",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "sequenceNumber",
          "type": "uint64"
        },
        {
          "internalType": "enum Internal.MessageExecutionState",
          "name": "newState",
          "type": "uint8"
        }
      ],
      "name": "InvalidNewState",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "sourceChainSelector",
          "type": "uint64"
        }
      ],
      "name": "InvalidSourceChain",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidTokenPoolConfig",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ManualExecutionGasLimitMismatch",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ManualExecutionNotYetEnabled",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "maxSize",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "actualSize",
          "type": "uint256"
        }
      ],
      "name": "MessageTooLarge",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyCallableByAdminOrOwner",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OracleCannotBeZeroAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "PoolAlreadyAdded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "PoolDoesNotExist",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "PriceNotFoundForToken",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "error",
          "type": "bytes"
        }
      ],
      "name": "ReceiverError",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "RootNotCommitted",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "sequenceNumber",
          "type": "uint64"
        }
      ],
      "name": "TokenDataMismatch",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "error",
          "type": "bytes"
        }
      ],
      "name": "TokenHandlingError",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "capacity",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "requested",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        }
      ],
      "name": "TokenMaxCapacityExceeded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TokenPoolMismatch",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "error",
          "type": "bytes"
        }
      ],
      "name": "TokenRateLimitError",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "minWaitInSeconds",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "available",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        }
      ],
      "name": "TokenRateLimitReached",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnauthorizedTransmitter",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnexpectedTokenData",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "sequenceNumber",
          "type": "uint64"
        }
      ],
      "name": "UnsupportedNumberOfTokens",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "UnsupportedToken",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "expected",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "actual",
          "type": "uint256"
        }
      ],
      "name": "WrongMessageLength",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroAddressNotAllowed",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "AdminSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "commitStore",
              "type": "address"
            },
            {
              "internalType": "uint64",
              "name": "chainSelector",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "sourceChainSelector",
              "type": "uint64"
            },
            {
              "internalType": "address",
              "name": "onRamp",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "prevOffRamp",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "armProxy",
              "type": "address"
            }
          ],
          "indexed": false,
          "internalType": "struct EVM2EVMOffRamp.StaticConfig",
          "name": "staticConfig",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "permissionLessExecutionThresholdSeconds",
              "type": "uint32"
            },
            {
              "internalType": "address",
              "name": "router",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "priceRegistry",
              "type": "address"
            },
            {
              "internalType": "uint16",
              "name": "maxTokensLength",
              "type": "uint16"
            },
            {
              "internalType": "uint32",
              "name": "maxDataSize",
              "type": "uint32"
            }
          ],
          "indexed": false,
          "internalType": "struct EVM2EVMOffRamp.DynamicConfig",
          "name": "dynamicConfig",
          "type": "tuple"
        }
      ],
      "name": "ConfigSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "previousConfigBlockNumber",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "configDigest",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "configCount",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "address[]",
          "name": "signers",
          "type": "address[]"
        },
        {
          "indexed": false,
          "internalType": "address[]",
          "name": "transmitters",
          "type": "address[]"
        },
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "f",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "onchainConfig",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "offchainConfigVersion",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "offchainConfig",
          "type": "bytes"
        }
      ],
      "name": "ConfigSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "sequenceNumber",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "messageId",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "enum Internal.MessageExecutionState",
          "name": "state",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "returnData",
          "type": "bytes"
        }
      ],
      "name": "ExecutionStateChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferRequested",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "pool",
          "type": "address"
        }
      ],
      "name": "PoolAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "pool",
          "type": "address"
        }
      ],
      "name": "PoolRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "nonce",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "SkippedIncorrectNonce",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "nonce",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "SkippedSenderWithPreviousRampMessageInflight",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "configDigest",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "epoch",
          "type": "uint32"
        }
      ],
      "name": "Transmitted",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "acceptOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "pool",
              "type": "address"
            }
          ],
          "internalType": "struct Internal.PoolUpdate[]",
          "name": "removes",
          "type": "tuple[]"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "pool",
              "type": "address"
            }
          ],
          "internalType": "struct Internal.PoolUpdate[]",
          "name": "adds",
          "type": "tuple[]"
        }
      ],
      "name": "applyPoolUpdates",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "messageId",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "sourceChainSelector",
              "type": "uint64"
            },
            {
              "internalType": "bytes",
              "name": "sender",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "data",
              "type": "bytes"
            },
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "internalType": "struct Client.EVMTokenAmount[]",
              "name": "destTokenAmounts",
              "type": "tuple[]"
            }
          ],
          "internalType": "struct Client.Any2EVMMessage",
          "name": "",
          "type": "tuple"
        }
      ],
      "name": "ccipReceive",
      "outputs": [],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "currentRateLimiterState",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint128",
              "name": "tokens",
              "type": "uint128"
            },
            {
              "internalType": "uint32",
              "name": "lastUpdated",
              "type": "uint32"
            },
            {
              "internalType": "bool",
              "name": "isEnabled",
              "type": "bool"
            },
            {
              "internalType": "uint128",
              "name": "capacity",
              "type": "uint128"
            },
            {
              "internalType": "uint128",
              "name": "rate",
              "type": "uint128"
            }
          ],
          "internalType": "struct RateLimiter.TokenBucket",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint64",
              "name": "sourceChainSelector",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "sequenceNumber",
              "type": "uint64"
            },
            {
              "internalType": "uint256",
              "name": "feeTokenAmount",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "sender",
              "type": "address"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            },
            {
              "internalType": "uint256",
              "name": "gasLimit",
              "type": "uint256"
            },
            {
              "internalType": "bool",
              "name": "strict",
              "type": "bool"
            },
            {
              "internalType": "address",
              "name": "receiver",
              "type": "address"
            },
            {
              "internalType": "bytes",
              "name": "data",
              "type": "bytes"
            },
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "internalType": "struct Client.EVMTokenAmount[]",
              "name": "tokenAmounts",
              "type": "tuple[]"
            },
            {
              "internalType": "address",
              "name": "feeToken",
              "type": "address"
            },
            {
              "internalType": "bytes32",
              "name": "messageId",
              "type": "bytes32"
            }
          ],
          "internalType": "struct Internal.EVM2EVMMessage",
          "name": "message",
          "type": "tuple"
        },
        {
          "internalType": "bytes[]",
          "name": "offchainTokenData",
          "type": "bytes[]"
        }
      ],
      "name": "executeSingleMessage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "sourceToken",
          "type": "address"
        }
      ],
      "name": "getDestinationToken",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getDestinationTokens",
      "outputs": [
        {
          "internalType": "contract IERC20[]",
          "name": "destTokens",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getDynamicConfig",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "permissionLessExecutionThresholdSeconds",
              "type": "uint32"
            },
            {
              "internalType": "address",
              "name": "router",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "priceRegistry",
              "type": "address"
            },
            {
              "internalType": "uint16",
              "name": "maxTokensLength",
              "type": "uint16"
            },
            {
              "internalType": "uint32",
              "name": "maxDataSize",
              "type": "uint32"
            }
          ],
          "internalType": "struct EVM2EVMOffRamp.DynamicConfig",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "sequenceNumber",
          "type": "uint64"
        }
      ],
      "name": "getExecutionState",
      "outputs": [
        {
          "internalType": "enum Internal.MessageExecutionState",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "destToken",
          "type": "address"
        }
      ],
      "name": "getPoolByDestToken",
      "outputs": [
        {
          "internalType": "contract IPool",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "sourceToken",
          "type": "address"
        }
      ],
      "name": "getPoolBySourceToken",
      "outputs": [
        {
          "internalType": "contract IPool",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "getSenderNonce",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "nonce",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getStaticConfig",
      "outputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "commitStore",
              "type": "address"
            },
            {
              "internalType": "uint64",
              "name": "chainSelector",
              "type": "uint64"
            },
            {
              "internalType": "uint64",
              "name": "sourceChainSelector",
              "type": "uint64"
            },
            {
              "internalType": "address",
              "name": "onRamp",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "prevOffRamp",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "armProxy",
              "type": "address"
            }
          ],
          "internalType": "struct EVM2EVMOffRamp.StaticConfig",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getSupportedTokens",
      "outputs": [
        {
          "internalType": "contract IERC20[]",
          "name": "sourceTokens",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTokenLimitAdmin",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTransmitters",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "latestConfigDetails",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "configCount",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "blockNumber",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "configDigest",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "latestConfigDigestAndEpoch",
      "outputs": [
        {
          "internalType": "bool",
          "name": "scanLogs",
          "type": "bool"
        },
        {
          "internalType": "bytes32",
          "name": "configDigest",
          "type": "bytes32"
        },
        {
          "internalType": "uint32",
          "name": "epoch",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "uint64",
                  "name": "sourceChainSelector",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "sequenceNumber",
                  "type": "uint64"
                },
                {
                  "internalType": "uint256",
                  "name": "feeTokenAmount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "uint64",
                  "name": "nonce",
                  "type": "uint64"
                },
                {
                  "internalType": "uint256",
                  "name": "gasLimit",
                  "type": "uint256"
                },
                {
                  "internalType": "bool",
                  "name": "strict",
                  "type": "bool"
                },
                {
                  "internalType": "address",
                  "name": "receiver",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                },
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "token",
                      "type": "address"
                    },
                    {
                      "internalType": "uint256",
                      "name": "amount",
                      "type": "uint256"
                    }
                  ],
                  "internalType": "struct Client.EVMTokenAmount[]",
                  "name": "tokenAmounts",
                  "type": "tuple[]"
                },
                {
                  "internalType": "address",
                  "name": "feeToken",
                  "type": "address"
                },
                {
                  "internalType": "bytes32",
                  "name": "messageId",
                  "type": "bytes32"
                }
              ],
              "internalType": "struct Internal.EVM2EVMMessage[]",
              "name": "messages",
              "type": "tuple[]"
            },
            {
              "internalType": "bytes[][]",
              "name": "offchainTokenData",
              "type": "bytes[][]"
            },
            {
              "internalType": "bytes32[]",
              "name": "proofs",
              "type": "bytes32[]"
            },
            {
              "internalType": "uint256",
              "name": "proofFlagBits",
              "type": "uint256"
            }
          ],
          "internalType": "struct Internal.ExecutionReport",
          "name": "report",
          "type": "tuple"
        },
        {
          "internalType": "uint256[]",
          "name": "gasLimitOverrides",
          "type": "uint256[]"
        }
      ],
      "name": "manuallyExecute",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "setAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "signers",
          "type": "address[]"
        },
        {
          "internalType": "address[]",
          "name": "transmitters",
          "type": "address[]"
        },
        {
          "internalType": "uint8",
          "name": "f",
          "type": "uint8"
        },
        {
          "internalType": "bytes",
          "name": "onchainConfig",
          "type": "bytes"
        },
        {
          "internalType": "uint64",
          "name": "offchainConfigVersion",
          "type": "uint64"
        },
        {
          "internalType": "bytes",
          "name": "offchainConfig",
          "type": "bytes"
        }
      ],
      "name": "setOCR2Config",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "bool",
              "name": "isEnabled",
              "type": "bool"
            },
            {
              "internalType": "uint128",
              "name": "capacity",
              "type": "uint128"
            },
            {
              "internalType": "uint128",
              "name": "rate",
              "type": "uint128"
            }
          ],
          "internalType": "struct RateLimiter.Config",
          "name": "config",
          "type": "tuple"
        }
      ],
      "name": "setRateLimiterConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[3]",
          "name": "reportContext",
          "type": "bytes32[3]"
        },
        {
          "internalType": "bytes",
          "name": "report",
          "type": "bytes"
        },
        {
          "internalType": "bytes32[]",
          "name": "rs",
          "type": "bytes32[]"
        },
        {
          "internalType": "bytes32[]",
          "name": "ss",
          "type": "bytes32[]"
        },
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "transmit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "typeAndVersion",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x6101806040523480156200001257600080fd5b50604051620063c9380380620063c9833981016040819052620000359162000891565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000478565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080938401819052600380546001600160a01b031916909517600160801b9384021760ff60a01b1916600160a01b90920291909117909355909102909217600455504690528151835114620001705760405162d8548360e71b815260040160405180910390fd5b60608401516001600160a01b0316158062000193575083516001600160a01b0316155b15620001b2576040516342bcdf7f60e11b815260040160405180910390fd5b83600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021b9190620009a8565b6001600160401b03166001146200024557604051636fc2a20760e11b815260040160405180910390fd5b83516001600160a01b0390811660a090815260408601516001600160401b0390811660c05260208701511660e052606086015182166101005260808601518216610140528501511661016052620002bc7fbdd59ac4dd1d82276c9a9c5d2656546346b9dcdb1f9b4204aed4ec15c23d7d3a62000523565b6101205260005b83518110156200046d576200031d848281518110620002e657620002e6620009c6565b6020026020010151848381518110620003035762000303620009c6565b6020026020010151600c6200058a60201b9092919060201c565b50620003d2838281518110620003375762000337620009c6565b60200260200101516001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200037d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a39190620009dc565b848381518110620003b857620003b8620009c6565b6020026020010151600f6200058a60201b9092919060201c565b507f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c848281518110620004095762000409620009c6565b6020026020010151848381518110620004265762000426620009c6565b6020026020010151604051620004529291906001600160a01b0392831681529116602082015260400190565b60405180910390a1620004658162000a03565b9050620002c3565b505050505062000a2b565b336001600160a01b03821603620004d25760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200056d94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000620005a2846001600160a01b03851684620005aa565b949350505050565b6000620005a284846001600160a01b03851660008281526002840160205260408120829055620005a284846000620005e38383620005ec565b90505b92915050565b60008181526001830160205260408120546200063557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620005e6565b506000620005e6565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200067957620006796200063e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006aa57620006aa6200063e565b604052919050565b6001600160a01b0381168114620006c857600080fd5b50565b80516001600160401b0381168114620006e357600080fd5b919050565b60006001600160401b038211156200070457620007046200063e565b5060051b60200190565b600082601f8301126200072057600080fd5b81516020620007396200073383620006e8565b6200067f565b82815260059290921b840181019181810190868411156200075957600080fd5b8286015b84811015620007815780516200077381620006b2565b83529183019183016200075d565b509695505050505050565b600082601f8301126200079e57600080fd5b81516020620007b16200073383620006e8565b82815260059290921b84018101918181019086841115620007d157600080fd5b8286015b8481101562000781578051620007eb81620006b2565b8352918301918301620007d5565b80516001600160801b0381168114620006e357600080fd5b6000606082840312156200082457600080fd5b604051606081016001600160401b03811182821017156200084957620008496200063e565b8060405250809150825180151581146200086257600080fd5b81526200087260208401620007f9565b60208201526200088560408401620007f9565b60408201525092915050565b600080600080848603610160811215620008aa57600080fd5b60c0811215620008b957600080fd5b50620008c462000654565b8551620008d181620006b2565b8152620008e160208701620006cb565b6020820152620008f460408701620006cb565b604082015260608601516200090981620006b2565b606082015260808601516200091e81620006b2565b608082015260a08601516200093381620006b2565b60a082015260c08601519094506001600160401b03808211156200095657600080fd5b62000964888389016200070e565b945060e08701519150808211156200097b57600080fd5b506200098a878288016200078c565b9250506200099d86610100870162000811565b905092959194509250565b600060208284031215620009bb57600080fd5b620005e382620006cb565b634e487b7160e01b600052603260045260246000fd5b600060208284031215620009ef57600080fd5b8151620009fc81620006b2565b9392505050565b60006001820162000a2457634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e051610100516101205161014051610160516158c162000b08600039600081816102e201528181611e3e01526127ba0152600081816102b3015281816112d00152818161133801528181611e1401528181612d080152612d75015260006129660152600081816102840152611ded0152600081816102240152611d9b01526000818161025401528181611dc50152818161214801526136dd0152600081816101f501528181611d6d0152612a4e0152600081816115f30152818161163f01528181611a050152611a5101526158c16000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c806381ff7048116100ee578063b1dc65a411610097578063d3c7c2c711610071578063d3c7c2c71461063f578063d7e2bb5014610647578063e65bf00a1461065a578063f2fde38b1461066d57600080fd5b8063b1dc65a414610606578063b4069b3114610619578063c92b28321461062c57600080fd5b80638da5cb5b116100c85780638da5cb5b146105c2578063afa0d379146105d3578063afcb95d7146105e657600080fd5b806381ff70481461055857806385572ffb14610588578063856c82471461059657600080fd5b8063599f64311161015b578063681fba1611610135578063681fba161461046a578063704b6c021461047f5780637437ff9f1461049257806379ba50971461055057600080fd5b8063599f64311461041d5780635d86f14114610442578063666cab8d1461045557600080fd5b80631ef381741161018c5780631ef38174146103915780633a87ac53146103a6578063546719cd146103b957600080fd5b806306285c69146101b3578063142a98fc14610328578063181f5a7714610348575b600080fd5b6103126040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b60405161031f9190614208565b60405180910390f35b61033b610336366004614292565b610680565b60405161031f91906142e7565b6103846040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e302e3000000000000000000000000081525081565b60405161031f9190614345565b6103a461039f366004614551565b6106fb565b005b6103a46103b4366004614663565b610b2f565b6103c1610ed7565b60405161031f919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b03909116815260200161031f565b61042a6104503660046146cf565b610f8c565b61045d610fe8565b60405161031f9190614730565b61047261104a565b60405161031f9190614743565b6103a461048d3660046146cf565b6110f6565b6105436040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff80821683526001600160a01b0364010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000009004909116608082015290565b60405161031f9190614790565b6103a46111bf565b6007546005546040805163ffffffff8085168252640100000000909404909316602084015282015260600161031f565b6103a46101ae3660046147e6565b6105a96105a43660046146cf565b6112a2565b60405167ffffffffffffffff909116815260200161031f565b6000546001600160a01b031661042a565b6103a46105e1366004614a50565b6113a3565b60408051600181526000602082018190529181019190915260600161031f565b6103a4610614366004614af9565b61159d565b61042a6106273660046146cf565b611821565b6103a461063a366004614bfe565b6118e0565b61047261194b565b61042a6106553660046146cf565b6119f3565b6103a4610668366004614e55565b611a02565b6103a461067b3660046146cf565b611b84565b600061068e60016004614f26565b600261069b608085614f4f565b67ffffffffffffffff166106af9190614f76565b601360006106be608087614f8d565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156106f5576106f56142af565b92915050565b84518460ff16601f821115610771576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b806000036107db576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f73697469766500000000000000000000000000006044820152606401610768565b6107e3611b95565b6107ec85611c0b565b60095460005b8181101561084e57600860006009838154811061081157610811614fb4565b60009182526020808320909101546001600160a01b031683528201929092526040019020805461ffff1916905561084781614fca565b90506107f2565b50875160005b81811015610a065760008a828151811061087057610870614fb4565b602002602001015190506000600281111561088d5761088d6142af565b6001600160a01b038216600090815260086020526040902054610100900460ff1660028111156108bf576108bf6142af565b14610926576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d69747465722061646472657373000000006044820152606401610768565b6001600160a01b038116610966576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821681178355928401519192839161ffff1916176101008360028111156109ec576109ec6142af565b021790555090505050806109ff90614fca565b9050610854565b508851610a1a9060099060208c019061417f565b506006805460ff8381166101000261ffff19909216908b161717905560078054610a83914691309190600090610a559063ffffffff16615002565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d611e9e565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610b1a99989796959493929190615025565b60405180910390a15050505050505050505050565b610b37611b95565b60005b83811015610d02576000858583818110610b5657610b56614fb4565b610b6c92602060409092020190810191506146cf565b90506000868684818110610b8257610b82614fb4565b9050604002016020016020810190610b9a91906146cf565b9050610ba7600c83611f2b565b610bdd576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610bf2600c84611f40565b6001600160a01b031614610c32576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3d600c83611f55565b50610cab816001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca391906150bb565b600f90611f55565b50604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610cfb90614fca565b9050610b3a565b5060005b81811015610ed0576000838383818110610d2257610d22614fb4565b610d3892602060409092020190810191506146cf565b90506000848484818110610d4e57610d4e614fb4565b9050604002016020016020810190610d6691906146cf565b90506001600160a01b0382161580610d8557506001600160a01b038116155b15610dbc576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dc7600c83611f2b565b15610dfe576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0a600c8383611f6a565b50610e79816001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7091906150bb565b600f9083611f6a565b50604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1505080610ec990614fca565b9050610d06565b5050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610f8790611f80565b905090565b60008080610f9b600c85612032565b9150915081610fe1576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610768565b9392505050565b6060600980548060200260200160405190810160405280929190818152602001828054801561104057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611022575b5050505050905090565b6060611056600f612054565b67ffffffffffffffff81111561106e5761106e614358565b604051908082528060200260200182016040528015611097578160200160208202803683370190505b50905060005b81518110156110f25760006110b3600f8361205f565b509050808383815181106110c9576110c9614fb4565b6001600160a01b0390921660209283029190910190910152506110eb81614fca565b905061109d565b5090565b6000546001600160a01b0316331480159061111c57506002546001600160a01b03163314155b15611153576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b6001546001600160a01b03163314611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610768565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b03811660009081526012602052604081205467ffffffffffffffff16801580156112fb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b156106f5576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa15801561137f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe191906150d8565b3330146113dc576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611419565b60408051808201909152600080825260208201528152602001906001900390816113f25790505b50610120840151519091501561146b576101208301516060840151604080516001600160a01b0390921660208301526114689291016040516020818303038152906040528560e001518561207b565b90505b60e08301516001600160a01b03163b15806114bb575060e08301516114b9906001600160a01b03167f85572ffb000000000000000000000000000000000000000000000000000000006124ed565b155b156114c557505050565b600a54600090819064010000000090046001600160a01b0316633cf979836114ed8786612509565b6113888860a001518960e001516040518563ffffffff1660e01b81526004016115199493929190615139565b6000604051808303816000875af1158015611538573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261156091908101906151fe565b9150915081610ed057806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107689190614345565b6115a787876125ac565b6005548835908082146115f0576040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610768565b467f000000000000000000000000000000000000000000000000000000000000000014611671576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610768565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff808216845292939192918401916101009091041660028111156116f9576116f96142af565b600281111561170a5761170a6142af565b9052509050600281602001516002811115611727576117276142af565b14801561176157506009816000015160ff168154811061174957611749614fb4565b6000918252602090912001546001600160a01b031633145b611797576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060006117a5856020614f76565b6117b0886020614f76565b6117bc8b61014461528b565b6117c6919061528b565b6117d0919061528b565b9050368114611814576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610768565b5050505050505050505050565b60008080611830600c85612032565b9150915081611876576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610768565b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d891906150bb565b949350505050565b6000546001600160a01b0316331480159061190657506002546001600160a01b03163314155b1561193d576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119486003826125d3565b50565b6060611957600c612054565b67ffffffffffffffff81111561196f5761196f614358565b604051908082528060200260200182016040528015611998578160200160208202803683370190505b50905060005b81518110156110f25760006119b4600c8361205f565b509050808383815181106119ca576119ca614fb4565b6001600160a01b0390921660209283029190910190910152506119ec81614fca565b905061199e565b60008080610f9b600f85612032565b467f000000000000000000000000000000000000000000000000000000000000000014611a8d576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff46166024820152604401610768565b81515181518114611aca576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015611b74576000838281518110611ae957611ae9614fb4565b6020026020010151905080600014158015611b2257508451805183908110611b1357611b13614fb4565b602002602001015160a0015181105b15611b63576040517f085e39cf0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610768565b50611b6d81614fca565b9050611acd565b50611b7f83836127b8565b505050565b611b8c611b95565b61194881613172565b6000546001600160a01b03163314611c09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610768565b565b600081806020019051810190611c2191906152b2565b60208101519091506001600160a01b0316611c68576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a80546020808501516001600160a01b03908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b0151909916760100000000000000000000000000000000000000000000027fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909416958816959095179290921791909116929092179055815160c0810183527f00000000000000000000000000000000000000000000000000000000000000008416815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848301527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000008216938301939093527f00000000000000000000000000000000000000000000000000000000000000001660a082015290517f737ef22d3f6615e342ed21c69e06620dbc5c8a261ed7cfb2ce214806b1f76eda91611e9291849061534d565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611ec299989796959493929190615402565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b6000610fe1836001600160a01b03841661324d565b6000610fe1836001600160a01b038416613259565b6000610fe1836001600160a01b038416613265565b60006118d8846001600160a01b03851684613271565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261200e82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611ff29190614f26565b85608001516fffffffffffffffffffffffffffffffff16613287565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b600080612048846001600160a01b0385166132a6565b915091505b9250929050565b60006106f5826132b5565b600080808061206e86866132c0565b9097909650945050505050565b60606000855167ffffffffffffffff81111561209957612099614358565b6040519080825280602002602001820160405280156120de57816020015b60408051808201909152600080825260208201528152602001906001900390816120b75790505b50905060005b86518110156124cc57600061211588838151811061210457612104614fb4565b602002602001015160000151610f8c565b9050806001600160a01b0316638627fad688888b868151811061213a5761213a614fb4565b6020026020010151602001517f00000000000000000000000000000000000000000000000000000000000000008a888151811061217957612179614fb4565b60200260200101516040518663ffffffff1660e01b81526004016121a195949392919061548a565b600060405180830381600087803b1580156121bb57600080fd5b505af19250505080156121cc575060015b6123ef573d8080156121fa576040519150601f19603f3d011682016040523d82523d6000602084013e6121ff565b606091505b50600061220b826154e0565b90507f9725942a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216148061229e57507ff94ebcd1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b806122ea57507f15279c08000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061233657507f1a76572a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061238257507fd0c8d23a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b156123bb57816040517f30dabb590000000000000000000000000000000000000000000000000000000081526004016107689190614345565b816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107689190614345565b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561242d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245191906150bb565b83838151811061246357612463614fb4565b60209081029190910101516001600160a01b039091169052875188908390811061248f5761248f614fb4565b6020026020010151602001518383815181106124ad576124ad614fb4565b6020908102919091018101510152506124c581614fca565b90506120e4565b50600b546124e49082906001600160a01b03166132cf565b95945050505050565b60006124f883613488565b8015610fe15750610fe183836134ec565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461016001518152602001846000015167ffffffffffffffff168152602001846060015160405160200161258191906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001846101000151815260200183815250905092915050565b6125cf6125bb82840184615530565b6040805160008152602081019091526127b8565b5050565b81546000906125fc90700100000000000000000000000000000000900463ffffffff1642614f26565b9050801561269e5760018301548354612644916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613287565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546126c4916fffffffffffffffffffffffffffffffff90811691166135bb565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906127ab9084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612816573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283a9190615565565b15612871576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81515160008190036128ae576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001515181146128ec576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561290757612907614358565b604051908082528060200260200182016040528015612930578160200160208202803683370190505b50905060005b82811015612a105760008560000151828151811061295657612956614fb4565b6020026020010151905061298a817f00000000000000000000000000000000000000000000000000000000000000006135d1565b83838151811061299c5761299c614fb4565b6020026020010181815250508061016001518383815181106129c0576129c0614fb4565b6020026020010151146129ff576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612a0981614fca565b9050612936565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692633204887592612a84928792916004016155b2565b602060405180830381865afa158015612aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac591906155e8565b905080600003612b01576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b8481101561316957600087600001518281518110612b2857612b28614fb4565b602002602001015190506000612b418260200151610680565b90506000816003811115612b5757612b576142af565b1480612b7457506003816003811115612b7257612b726142af565b145b612bbc5760208201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610768565b8315612c7957600a5460009063ffffffff16612bd88742614f26565b1190508080612bf857506003826003811115612bf657612bf66142af565b145b612c2e576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b888481518110612c4057612c40614fb4565b6020026020010151600014612c7357888481518110612c6157612c61614fb4565b60200260200101518360a00181815250505b50612cd6565b6000816003811115612c8d57612c8d6142af565b14612cd65760208201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610768565b60608201516001600160a01b031660009081526012602052604090205467ffffffffffffffff1680158015612d3357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15612eae5760608301516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa158015612dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de291906150d8565b608084015190915067ffffffffffffffff16612dff826001615601565b67ffffffffffffffff1614612e5f5782606001516001600160a01b0316836080015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050613159565b60608301516001600160a01b0316600090815260126020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b6000826003811115612ec257612ec26142af565b03612f4157608083015167ffffffffffffffff16612ee1826001615601565b67ffffffffffffffff1614612f415782606001516001600160a01b0316836080015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050613159565b60008a602001518581518110612f5957612f59614fb4565b60200260200101519050612f6e8482516136db565b612f7d846020015160016138b1565b600080612f8a868461395b565b91509150612f9c8660200151836138b1565b6003826003811115612fb057612fb06142af565b14158015612fd057506002826003811115612fcd57612fcd6142af565b14155b1561300f578560200151826040517f9e261603000000000000000000000000000000000000000000000000000000008152600401610768929190615622565b8560c001511561309157600282600381111561302d5761302d6142af565b0361308c5760608601516001600160a01b03166000908152601260205260408120805467ffffffffffffffff169161306483615640565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b613104565b60008560038111156130a5576130a56142af565b036131045760608601516001600160a01b03166000908152601260205260408120805467ffffffffffffffff16916130dc83615640565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101600151866020015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef65848460405161314a92919061565d565b60405180910390a35050505050505b61316281614fca565b9050612b08565b50505050505050565b336001600160a01b038216036131e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610768565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000610fe18383613afe565b6000610fe18383613b0a565b6000610fe18383613b94565b60006118d884846001600160a01b038516613bb1565b60006124e4856132978486614f76565b6132a1908761528b565b6135bb565b600080808061206e8686613bce565b60006106f582613c08565b600080808061206e8686613c13565b81516000805b82811015613474576000846001600160a01b031663d02641a087848151811061330057613300614fb4565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016040805180830381865afa158015613367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338b919061567d565b51905077ffffffffffffffffffffffffffffffffffffffffffffffff811660000361340c578582815181106133c2576133c2614fb4565b6020908102919091010151516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610768565b61345686838151811061342157613421614fb4565b6020026020010151602001518277ffffffffffffffffffffffffffffffffffffffffffffffff16613c3e90919063ffffffff16565b613460908461528b565b9250508061346d90614fca565b90506132d5565b506134826003826000613c77565b50505050565b60006134b4827f01ffc9a7000000000000000000000000000000000000000000000000000000006134ec565b80156106f557506134e5827fffffffff000000000000000000000000000000000000000000000000000000006134ec565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156135a4575060208210155b80156135b05750600081115b979650505050505050565b60008183106135ca5781610fe1565b5090919050565b60008060001b828460200151856080015186606001518760e001518861010001518051906020012089610120015160405160200161360f91906156db565b604051602081830303815290604052805190602001208a60a001518b60c001518c61014001518d604001516040516020016136bd9c9b9a999897969594939291909b8c5260208c019a909a5267ffffffffffffffff98891660408c01529690971660608a01526001600160a01b0394851660808a015292841660a089015260c088019190915260e0870152610100860152911515610120850152166101408301526101608201526101800190565b60405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16826000015167ffffffffffffffff161461375b5781516040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610768565b600b54610120830151517401000000000000000000000000000000000000000090910461ffff1610156137cc5760208201516040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610768565b80826101200151511461381d5760208201516040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610768565b600b546101008301515176010000000000000000000000000000000000000000000090910463ffffffff1610156125cf57600b54610100830151516040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090920463ffffffff1660048301526024820152604401610768565b600060026138c0608085614f4f565b67ffffffffffffffff166138d49190614f76565b905060006013816138e6608087614f8d565b67ffffffffffffffff16815260208101919091526040016000205490508161391060016004614f26565b901b191681836003811115613927576139276142af565b901b17806013600061393a608088614f8d565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517fafa0d379000000000000000000000000000000000000000000000000000000008152600090606090309063afa0d3799061399f9087908790600401615746565b600060405180830381600087803b1580156139b957600080fd5b505af19250505080156139ca575060015b613ae3573d8080156139f8576040519150601f19603f3d011682016040523d82523d6000602084013e6139fd565b606091505b50613a07816154e0565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c000000000000000000000000000000000000000000000000000000001480613a9f5750613a5a816154e0565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b15613aaf5760039250905061204d565b806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107689190614345565b50506040805160208101909152600081526002909250929050565b6000610fe18383613fc6565b600081815260028301602052604081205480151580613b2e5750613b2e8484613afe565b610fe1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610768565b60008181526002830160205260408120819055610fe18383613fde565b600082815260028401602052604081208290556118d88484613fea565b6000818152600283016020526040812054819080613bfd57613bf08585613afe565b92506000915061204d9050565b60019250905061204d565b60006106f582613ff6565b60008080613c218585614000565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a7640000613c6d8377ffffffffffffffffffffffffffffffffffffffffffffffff8616614f76565b610fe1919061588a565b825474010000000000000000000000000000000000000000900460ff161580613c9e575081155b15613ca857505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090613cee90700100000000000000000000000000000000900463ffffffff1642614f26565b90508015613dae5781831115613d30576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613d6a9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613287565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015613e4b576001600160a01b038416613e00576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610768565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610768565b84831015613f445760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613e8f9082614f26565b613e99878a614f26565b613ea3919061528b565b613ead919061588a565b90506001600160a01b038616613ef9576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610768565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610768565b613f4e8584614f26565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60008181526001830160205260408120541515610fe1565b6000610fe1838361400c565b6000610fe18383614106565b60006106f5825490565b6000610fe18383614155565b600081815260018301602052604081205480156140f5576000614030600183614f26565b855490915060009061404490600190614f26565b90508181146140a957600086600001828154811061406457614064614fb4565b906000526020600020015490508087600001848154811061408757614087614fb4565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806140ba576140ba61589e565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106f5565b60009150506106f5565b5092915050565b600081815260018301602052604081205461414d575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106f5565b5060006106f5565b600082600001828154811061416c5761416c614fb4565b9060005260206000200154905092915050565b8280548282559060005260206000209081019282156141ec579160200282015b828111156141ec57825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0390911617825560209092019160019091019061419f565b506110f29291505b808211156110f257600081556001016141f4565b60c081016106f582846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff8116811461194857600080fd5b803561428d8161426c565b919050565b6000602082840312156142a457600080fd5b8135610fe18161426c565b634e487b7160e01b600052602160045260246000fd5b600481106142e357634e487b7160e01b600052602160045260246000fd5b9052565b602081016106f582846142c5565b60005b838110156143105781810151838201526020016142f8565b50506000910152565b600081518084526143318160208601602086016142f5565b601f01601f19169290920160200192915050565b602081526000610fe16020830184614319565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561439157614391614358565b60405290565b604051610180810167ffffffffffffffff8111828210171561439157614391614358565b6040516080810167ffffffffffffffff8111828210171561439157614391614358565b604051601f8201601f1916810167ffffffffffffffff8111828210171561440757614407614358565b604052919050565b600067ffffffffffffffff82111561442957614429614358565b5060051b60200190565b6001600160a01b038116811461194857600080fd5b803561428d81614433565b600082601f83011261446457600080fd5b813560206144796144748361440f565b6143de565b82815260059290921b8401810191818101908684111561449857600080fd5b8286015b848110156144bc5780356144af81614433565b835291830191830161449c565b509695505050505050565b803560ff8116811461428d57600080fd5b600067ffffffffffffffff8211156144f2576144f2614358565b50601f01601f191660200190565b600082601f83011261451157600080fd5b813561451f614474826144d8565b81815284602083860101111561453457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561456a57600080fd5b863567ffffffffffffffff8082111561458257600080fd5b61458e8a838b01614453565b975060208901359150808211156145a457600080fd5b6145b08a838b01614453565b96506145be60408a016144c7565b955060608901359150808211156145d457600080fd5b6145e08a838b01614500565b94506145ee60808a01614282565b935060a089013591508082111561460457600080fd5b5061461189828a01614500565b9150509295509295509295565b60008083601f84011261463057600080fd5b50813567ffffffffffffffff81111561464857600080fd5b6020830191508360208260061b850101111561204d57600080fd5b6000806000806040858703121561467957600080fd5b843567ffffffffffffffff8082111561469157600080fd5b61469d8883890161461e565b909650945060208701359150808211156146b657600080fd5b506146c38782880161461e565b95989497509550505050565b6000602082840312156146e157600080fd5b8135610fe181614433565b600081518084526020808501945080840160005b838110156147255781516001600160a01b031687529582019590820190600101614700565b509495945050505050565b602081526000610fe160208301846146ec565b6020808252825182820181905260009190848201906040850190845b818110156147845783516001600160a01b03168352928401929184019160010161475f565b50909695505050505050565b60a081016106f5828463ffffffff80825116835260208201516001600160a01b038082166020860152806040850151166040860152505061ffff6060830151166060840152806080830151166080840152505050565b6000602082840312156147f857600080fd5b813567ffffffffffffffff81111561480f57600080fd5b820160a08185031215610fe157600080fd5b801515811461194857600080fd5b803561428d81614821565b600082601f83011261484b57600080fd5b8135602061485b6144748361440f565b82815260069290921b8401810191818101908684111561487a57600080fd5b8286015b848110156144bc57604081890312156148975760008081fd5b61489f61436e565b81356148aa81614433565b8152818501358582015283529183019160400161487e565b600061018082840312156148d557600080fd5b6148dd614397565b90506148e882614282565b81526148f660208301614282565b60208201526040820135604082015261491160608301614448565b606082015261492260808301614282565b608082015260a082013560a082015261493d60c0830161482f565b60c082015261494e60e08301614448565b60e08201526101008083013567ffffffffffffffff8082111561497057600080fd5b61497c86838701614500565b8385015261012092508285013591508082111561499857600080fd5b506149a58582860161483a565b8284015250506101406149b9818401614448565b818301525061016080830135818301525092915050565b600082601f8301126149e157600080fd5b813560206149f16144748361440f565b82815260059290921b84018101918181019086841115614a1057600080fd5b8286015b848110156144bc57803567ffffffffffffffff811115614a345760008081fd5b614a428986838b0101614500565b845250918301918301614a14565b60008060408385031215614a6357600080fd5b823567ffffffffffffffff80821115614a7b57600080fd5b614a87868387016148c2565b93506020850135915080821115614a9d57600080fd5b50614aaa858286016149d0565b9150509250929050565b60008083601f840112614ac657600080fd5b50813567ffffffffffffffff811115614ade57600080fd5b6020830191508360208260051b850101111561204d57600080fd5b60008060008060008060008060e0898b031215614b1557600080fd5b606089018a811115614b2657600080fd5b8998503567ffffffffffffffff80821115614b4057600080fd5b818b0191508b601f830112614b5457600080fd5b813581811115614b6357600080fd5b8c6020828501011115614b7557600080fd5b6020830199508098505060808b0135915080821115614b9357600080fd5b614b9f8c838d01614ab4565b909750955060a08b0135915080821115614bb857600080fd5b50614bc58b828c01614ab4565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff8116811461428d57600080fd5b600060608284031215614c1057600080fd5b6040516060810181811067ffffffffffffffff82111715614c3357614c33614358565b6040528235614c4181614821565b8152614c4f60208401614bde565b6020820152614c6060408401614bde565b60408201529392505050565b600082601f830112614c7d57600080fd5b81356020614c8d6144748361440f565b82815260059290921b84018101918181019086841115614cac57600080fd5b8286015b848110156144bc57803567ffffffffffffffff811115614cd05760008081fd5b614cde8986838b01016149d0565b845250918301918301614cb0565b600082601f830112614cfd57600080fd5b81356020614d0d6144748361440f565b82815260059290921b84018101918181019086841115614d2c57600080fd5b8286015b848110156144bc5780358352918301918301614d30565b600060808284031215614d5957600080fd5b614d616143bb565b9050813567ffffffffffffffff80821115614d7b57600080fd5b818401915084601f830112614d8f57600080fd5b81356020614d9f6144748361440f565b82815260059290921b84018101918181019088841115614dbe57600080fd5b8286015b84811015614df657803586811115614dda5760008081fd5b614de88b86838b01016148c2565b845250918301918301614dc2565b5086525085810135935082841115614e0d57600080fd5b614e1987858801614c6c565b90850152506040840135915080821115614e3257600080fd5b50614e3f84828501614cec565b6040830152506060820135606082015292915050565b60008060408385031215614e6857600080fd5b823567ffffffffffffffff80821115614e8057600080fd5b614e8c86838701614d47565b9350602091508185013581811115614ea357600080fd5b85019050601f81018613614eb657600080fd5b8035614ec46144748261440f565b81815260059190911b82018301908381019088831115614ee357600080fd5b928401925b82841015614f0157833582529284019290840190614ee8565b80955050505050509250929050565b634e487b7160e01b600052601160045260246000fd5b818103818111156106f5576106f5614f10565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff80841680614f6a57614f6a614f39565b92169190910692915050565b80820281158282048414176106f5576106f5614f10565b600067ffffffffffffffff80841680614fa857614fa8614f39565b92169190910492915050565b634e487b7160e01b600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614ffb57614ffb614f10565b5060010190565b600063ffffffff80831681810361501b5761501b614f10565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526150558184018a6146ec565b9050828103608084015261506981896146ec565b905060ff871660a084015282810360c08401526150868187614319565b905067ffffffffffffffff851660e08401528281036101008401526150ab8185614319565b9c9b505050505050505050505050565b6000602082840312156150cd57600080fd5b8151610fe181614433565b6000602082840312156150ea57600080fd5b8151610fe18161426c565b600081518084526020808501945080840160005b8381101561472557815180516001600160a01b031688528301518388015260409096019590820190600101615109565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152615174610120840182614319565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e08601526151b08383614319565b9250608089015191508085840301610100860152506151cf82826150f5565b925050506151e3602083018661ffff169052565b8360408301526124e460608301846001600160a01b03169052565b6000806040838503121561521157600080fd5b825161521c81614821565b602084015190925067ffffffffffffffff81111561523957600080fd5b8301601f8101851361524a57600080fd5b8051615258614474826144d8565b81815286602083850101111561526d57600080fd5b61527e8260208301602086016142f5565b8093505050509250929050565b808201808211156106f5576106f5614f10565b805163ffffffff8116811461428d57600080fd5b600060a082840312156152c457600080fd5b60405160a0810181811067ffffffffffffffff821117156152e7576152e7614358565b6040526152f38361529e565b8152602083015161530381614433565b6020820152604083015161531681614433565b6040820152606083015161ffff8116811461533057600080fd5b60608201526153416080840161529e565b60808201529392505050565b61016081016153b282856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c084015260208401516001600160a01b0390811660e0850152604085015116610100840152606084015161ffff16610120840152608084015116610140830152610fe1565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b16604085015281606085015261543c8285018b6146ec565b91508382036080850152615450828a6146ec565b915060ff881660a085015283820360c085015261546d8288614319565b90861660e085015283810361010085015290506150ab8185614319565b60a08152600061549d60a0830188614319565b6001600160a01b038716602084015285604084015267ffffffffffffffff8516606084015282810360808401526154d48185614319565b98975050505050505050565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156155285780818460040360031b1b83161693505b505050919050565b60006020828403121561554257600080fd5b813567ffffffffffffffff81111561555957600080fd5b6118d884828501614d47565b60006020828403121561557757600080fd5b8151610fe181614821565b600081518084526020808501945080840160005b8381101561472557815187529582019590820190600101615596565b6060815260006155c56060830186615582565b82810360208401526155d78186615582565b915050826040830152949350505050565b6000602082840312156155fa57600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156140ff576140ff614f10565b67ffffffffffffffff8316815260408101610fe160208301846142c5565b600067ffffffffffffffff80831681810361501b5761501b614f10565b61566781846142c5565b6040602082015260006118d86040830184614319565b60006040828403121561568f57600080fd5b61569761436e565b825177ffffffffffffffffffffffffffffffffffffffffffffffff811681146156bf57600080fd5b815260208301516156cf8161426c565b60208201529392505050565b602081526000610fe160208301846150f5565b600082825180855260208086019550808260051b84010181860160005b8481101561573957601f19868403018952615727838351614319565b9884019892509083019060010161570b565b5090979650505050505050565b6040815261576160408201845167ffffffffffffffff169052565b6000602084015161577e606084018267ffffffffffffffff169052565b506040840151608083015260608401516001600160a01b03811660a084015250608084015167ffffffffffffffff811660c08401525060a084015160e083015260c08401516101006157d38185018315159052565b60e086015191506101206157f1818601846001600160a01b03169052565b818701519250610180915061014082818701526158126101c0870185614319565b93508188015191506101607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018188015261585085846150f5565b945081890151925061586c848801846001600160a01b03169052565b8801516101a087015250505082810360208401526124e481856156ee565b60008261589957615899614f39565b500490565b634e487b7160e01b600052603160045260246000fdfea164736f6c6343000813000a",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c806381ff7048116100ee578063b1dc65a411610097578063d3c7c2c711610071578063d3c7c2c71461063f578063d7e2bb5014610647578063e65bf00a1461065a578063f2fde38b1461066d57600080fd5b8063b1dc65a414610606578063b4069b3114610619578063c92b28321461062c57600080fd5b80638da5cb5b116100c85780638da5cb5b146105c2578063afa0d379146105d3578063afcb95d7146105e657600080fd5b806381ff70481461055857806385572ffb14610588578063856c82471461059657600080fd5b8063599f64311161015b578063681fba1611610135578063681fba161461046a578063704b6c021461047f5780637437ff9f1461049257806379ba50971461055057600080fd5b8063599f64311461041d5780635d86f14114610442578063666cab8d1461045557600080fd5b80631ef381741161018c5780631ef38174146103915780633a87ac53146103a6578063546719cd146103b957600080fd5b806306285c69146101b3578063142a98fc14610328578063181f5a7714610348575b600080fd5b6103126040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b60405161031f9190614208565b60405180910390f35b61033b610336366004614292565b610680565b60405161031f91906142e7565b6103846040518060400160405280601481526020017f45564d3245564d4f666652616d7020312e302e3000000000000000000000000081525081565b60405161031f9190614345565b6103a461039f366004614551565b6106fb565b005b6103a46103b4366004614663565b610b2f565b6103c1610ed7565b60405161031f919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b03909116815260200161031f565b61042a6104503660046146cf565b610f8c565b61045d610fe8565b60405161031f9190614730565b61047261104a565b60405161031f9190614743565b6103a461048d3660046146cf565b6110f6565b6105436040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff80821683526001600160a01b0364010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000009004909116608082015290565b60405161031f9190614790565b6103a46111bf565b6007546005546040805163ffffffff8085168252640100000000909404909316602084015282015260600161031f565b6103a46101ae3660046147e6565b6105a96105a43660046146cf565b6112a2565b60405167ffffffffffffffff909116815260200161031f565b6000546001600160a01b031661042a565b6103a46105e1366004614a50565b6113a3565b60408051600181526000602082018190529181019190915260600161031f565b6103a4610614366004614af9565b61159d565b61042a6106273660046146cf565b611821565b6103a461063a366004614bfe565b6118e0565b61047261194b565b61042a6106553660046146cf565b6119f3565b6103a4610668366004614e55565b611a02565b6103a461067b3660046146cf565b611b84565b600061068e60016004614f26565b600261069b608085614f4f565b67ffffffffffffffff166106af9190614f76565b601360006106be608087614f8d565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156106f5576106f56142af565b92915050565b84518460ff16601f821115610771576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b806000036107db576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f73697469766500000000000000000000000000006044820152606401610768565b6107e3611b95565b6107ec85611c0b565b60095460005b8181101561084e57600860006009838154811061081157610811614fb4565b60009182526020808320909101546001600160a01b031683528201929092526040019020805461ffff1916905561084781614fca565b90506107f2565b50875160005b81811015610a065760008a828151811061087057610870614fb4565b602002602001015190506000600281111561088d5761088d6142af565b6001600160a01b038216600090815260086020526040902054610100900460ff1660028111156108bf576108bf6142af565b14610926576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d69747465722061646472657373000000006044820152606401610768565b6001600160a01b038116610966576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821681178355928401519192839161ffff1916176101008360028111156109ec576109ec6142af565b021790555090505050806109ff90614fca565b9050610854565b508851610a1a9060099060208c019061417f565b506006805460ff8381166101000261ffff19909216908b161717905560078054610a83914691309190600090610a559063ffffffff16615002565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d611e9e565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610b1a99989796959493929190615025565b60405180910390a15050505050505050505050565b610b37611b95565b60005b83811015610d02576000858583818110610b5657610b56614fb4565b610b6c92602060409092020190810191506146cf565b90506000868684818110610b8257610b82614fb4565b9050604002016020016020810190610b9a91906146cf565b9050610ba7600c83611f2b565b610bdd576040517f9c8787c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610bf2600c84611f40565b6001600160a01b031614610c32576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c3d600c83611f55565b50610cab816001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca391906150bb565b600f90611f55565b50604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a1505080610cfb90614fca565b9050610b3a565b5060005b81811015610ed0576000838383818110610d2257610d22614fb4565b610d3892602060409092020190810191506146cf565b90506000848484818110610d4e57610d4e614fb4565b9050604002016020016020810190610d6691906146cf565b90506001600160a01b0382161580610d8557506001600160a01b038116155b15610dbc576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dc7600c83611f2b565b15610dfe576040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0a600c8383611f6a565b50610e79816001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7091906150bb565b600f9083611f6a565b50604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1505080610ec990614fca565b9050610d06565b5050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610f8790611f80565b905090565b60008080610f9b600c85612032565b9150915081610fe1576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610768565b9392505050565b6060600980548060200260200160405190810160405280929190818152602001828054801561104057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611022575b5050505050905090565b6060611056600f612054565b67ffffffffffffffff81111561106e5761106e614358565b604051908082528060200260200182016040528015611097578160200160208202803683370190505b50905060005b81518110156110f25760006110b3600f8361205f565b509050808383815181106110c9576110c9614fb4565b6001600160a01b0390921660209283029190910190910152506110eb81614fca565b905061109d565b5090565b6000546001600160a01b0316331480159061111c57506002546001600160a01b03163314155b15611153576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b6001546001600160a01b03163314611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610768565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b03811660009081526012602052604081205467ffffffffffffffff16801580156112fb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b156106f5576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa15801561137f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe191906150d8565b3330146113dc576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611419565b60408051808201909152600080825260208201528152602001906001900390816113f25790505b50610120840151519091501561146b576101208301516060840151604080516001600160a01b0390921660208301526114689291016040516020818303038152906040528560e001518561207b565b90505b60e08301516001600160a01b03163b15806114bb575060e08301516114b9906001600160a01b03167f85572ffb000000000000000000000000000000000000000000000000000000006124ed565b155b156114c557505050565b600a54600090819064010000000090046001600160a01b0316633cf979836114ed8786612509565b6113888860a001518960e001516040518563ffffffff1660e01b81526004016115199493929190615139565b6000604051808303816000875af1158015611538573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261156091908101906151fe565b9150915081610ed057806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107689190614345565b6115a787876125ac565b6005548835908082146115f0576040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610768565b467f000000000000000000000000000000000000000000000000000000000000000014611671576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610768565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff808216845292939192918401916101009091041660028111156116f9576116f96142af565b600281111561170a5761170a6142af565b9052509050600281602001516002811115611727576117276142af565b14801561176157506009816000015160ff168154811061174957611749614fb4565b6000918252602090912001546001600160a01b031633145b611797576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060006117a5856020614f76565b6117b0886020614f76565b6117bc8b61014461528b565b6117c6919061528b565b6117d0919061528b565b9050368114611814576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610768565b5050505050505050505050565b60008080611830600c85612032565b9150915081611876576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610768565b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d891906150bb565b949350505050565b6000546001600160a01b0316331480159061190657506002546001600160a01b03163314155b1561193d576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119486003826125d3565b50565b6060611957600c612054565b67ffffffffffffffff81111561196f5761196f614358565b604051908082528060200260200182016040528015611998578160200160208202803683370190505b50905060005b81518110156110f25760006119b4600c8361205f565b509050808383815181106119ca576119ca614fb4565b6001600160a01b0390921660209283029190910190910152506119ec81614fca565b905061199e565b60008080610f9b600f85612032565b467f000000000000000000000000000000000000000000000000000000000000000014611a8d576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff46166024820152604401610768565b81515181518114611aca576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015611b74576000838281518110611ae957611ae9614fb4565b6020026020010151905080600014158015611b2257508451805183908110611b1357611b13614fb4565b602002602001015160a0015181105b15611b63576040517f085e39cf0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610768565b50611b6d81614fca565b9050611acd565b50611b7f83836127b8565b505050565b611b8c611b95565b61194881613172565b6000546001600160a01b03163314611c09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610768565b565b600081806020019051810190611c2191906152b2565b60208101519091506001600160a01b0316611c68576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a80546020808501516001600160a01b03908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b0151909916760100000000000000000000000000000000000000000000027fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90921674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909416958816959095179290921791909116929092179055815160c0810183527f00000000000000000000000000000000000000000000000000000000000000008416815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848301527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000008216938301939093527f00000000000000000000000000000000000000000000000000000000000000001660a082015290517f737ef22d3f6615e342ed21c69e06620dbc5c8a261ed7cfb2ce214806b1f76eda91611e9291849061534d565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611ec299989796959493929190615402565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b6000610fe1836001600160a01b03841661324d565b6000610fe1836001600160a01b038416613259565b6000610fe1836001600160a01b038416613265565b60006118d8846001600160a01b03851684613271565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261200e82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611ff29190614f26565b85608001516fffffffffffffffffffffffffffffffff16613287565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b600080612048846001600160a01b0385166132a6565b915091505b9250929050565b60006106f5826132b5565b600080808061206e86866132c0565b9097909650945050505050565b60606000855167ffffffffffffffff81111561209957612099614358565b6040519080825280602002602001820160405280156120de57816020015b60408051808201909152600080825260208201528152602001906001900390816120b75790505b50905060005b86518110156124cc57600061211588838151811061210457612104614fb4565b602002602001015160000151610f8c565b9050806001600160a01b0316638627fad688888b868151811061213a5761213a614fb4565b6020026020010151602001517f00000000000000000000000000000000000000000000000000000000000000008a888151811061217957612179614fb4565b60200260200101516040518663ffffffff1660e01b81526004016121a195949392919061548a565b600060405180830381600087803b1580156121bb57600080fd5b505af19250505080156121cc575060015b6123ef573d8080156121fa576040519150601f19603f3d011682016040523d82523d6000602084013e6121ff565b606091505b50600061220b826154e0565b90507f9725942a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216148061229e57507ff94ebcd1000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b806122ea57507f15279c08000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061233657507f1a76572a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061238257507fd0c8d23a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b156123bb57816040517f30dabb590000000000000000000000000000000000000000000000000000000081526004016107689190614345565b816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107689190614345565b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561242d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245191906150bb565b83838151811061246357612463614fb4565b60209081029190910101516001600160a01b039091169052875188908390811061248f5761248f614fb4565b6020026020010151602001518383815181106124ad576124ad614fb4565b6020908102919091018101510152506124c581614fca565b90506120e4565b50600b546124e49082906001600160a01b03166132cf565b95945050505050565b60006124f883613488565b8015610fe15750610fe183836134ec565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461016001518152602001846000015167ffffffffffffffff168152602001846060015160405160200161258191906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001846101000151815260200183815250905092915050565b6125cf6125bb82840184615530565b6040805160008152602081019091526127b8565b5050565b81546000906125fc90700100000000000000000000000000000000900463ffffffff1642614f26565b9050801561269e5760018301548354612644916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613287565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546126c4916fffffffffffffffffffffffffffffffff90811691166135bb565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906127ab9084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612816573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283a9190615565565b15612871576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81515160008190036128ae576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001515181146128ec576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561290757612907614358565b604051908082528060200260200182016040528015612930578160200160208202803683370190505b50905060005b82811015612a105760008560000151828151811061295657612956614fb4565b6020026020010151905061298a817f00000000000000000000000000000000000000000000000000000000000000006135d1565b83838151811061299c5761299c614fb4565b6020026020010181815250508061016001518383815181106129c0576129c0614fb4565b6020026020010151146129ff576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612a0981614fca565b9050612936565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692633204887592612a84928792916004016155b2565b602060405180830381865afa158015612aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac591906155e8565b905080600003612b01576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b8481101561316957600087600001518281518110612b2857612b28614fb4565b602002602001015190506000612b418260200151610680565b90506000816003811115612b5757612b576142af565b1480612b7457506003816003811115612b7257612b726142af565b145b612bbc5760208201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610768565b8315612c7957600a5460009063ffffffff16612bd88742614f26565b1190508080612bf857506003826003811115612bf657612bf66142af565b145b612c2e576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b888481518110612c4057612c40614fb4565b6020026020010151600014612c7357888481518110612c6157612c61614fb4565b60200260200101518360a00181815250505b50612cd6565b6000816003811115612c8d57612c8d6142af565b14612cd65760208201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610768565b60608201516001600160a01b031660009081526012602052604090205467ffffffffffffffff1680158015612d3357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15612eae5760608301516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa158015612dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de291906150d8565b608084015190915067ffffffffffffffff16612dff826001615601565b67ffffffffffffffff1614612e5f5782606001516001600160a01b0316836080015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050613159565b60608301516001600160a01b0316600090815260126020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b6000826003811115612ec257612ec26142af565b03612f4157608083015167ffffffffffffffff16612ee1826001615601565b67ffffffffffffffff1614612f415782606001516001600160a01b0316836080015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050613159565b60008a602001518581518110612f5957612f59614fb4565b60200260200101519050612f6e8482516136db565b612f7d846020015160016138b1565b600080612f8a868461395b565b91509150612f9c8660200151836138b1565b6003826003811115612fb057612fb06142af565b14158015612fd057506002826003811115612fcd57612fcd6142af565b14155b1561300f578560200151826040517f9e261603000000000000000000000000000000000000000000000000000000008152600401610768929190615622565b8560c001511561309157600282600381111561302d5761302d6142af565b0361308c5760608601516001600160a01b03166000908152601260205260408120805467ffffffffffffffff169161306483615640565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b613104565b60008560038111156130a5576130a56142af565b036131045760608601516001600160a01b03166000908152601260205260408120805467ffffffffffffffff16916130dc83615640565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101600151866020015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef65848460405161314a92919061565d565b60405180910390a35050505050505b61316281614fca565b9050612b08565b50505050505050565b336001600160a01b038216036131e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610768565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000610fe18383613afe565b6000610fe18383613b0a565b6000610fe18383613b94565b60006118d884846001600160a01b038516613bb1565b60006124e4856132978486614f76565b6132a1908761528b565b6135bb565b600080808061206e8686613bce565b60006106f582613c08565b600080808061206e8686613c13565b81516000805b82811015613474576000846001600160a01b031663d02641a087848151811061330057613300614fb4565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016040805180830381865afa158015613367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338b919061567d565b51905077ffffffffffffffffffffffffffffffffffffffffffffffff811660000361340c578582815181106133c2576133c2614fb4565b6020908102919091010151516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610768565b61345686838151811061342157613421614fb4565b6020026020010151602001518277ffffffffffffffffffffffffffffffffffffffffffffffff16613c3e90919063ffffffff16565b613460908461528b565b9250508061346d90614fca565b90506132d5565b506134826003826000613c77565b50505050565b60006134b4827f01ffc9a7000000000000000000000000000000000000000000000000000000006134ec565b80156106f557506134e5827fffffffff000000000000000000000000000000000000000000000000000000006134ec565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156135a4575060208210155b80156135b05750600081115b979650505050505050565b60008183106135ca5781610fe1565b5090919050565b60008060001b828460200151856080015186606001518760e001518861010001518051906020012089610120015160405160200161360f91906156db565b604051602081830303815290604052805190602001208a60a001518b60c001518c61014001518d604001516040516020016136bd9c9b9a999897969594939291909b8c5260208c019a909a5267ffffffffffffffff98891660408c01529690971660608a01526001600160a01b0394851660808a015292841660a089015260c088019190915260e0870152610100860152911515610120850152166101408301526101608201526101800190565b60405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16826000015167ffffffffffffffff161461375b5781516040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610768565b600b54610120830151517401000000000000000000000000000000000000000090910461ffff1610156137cc5760208201516040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610768565b80826101200151511461381d5760208201516040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610768565b600b546101008301515176010000000000000000000000000000000000000000000090910463ffffffff1610156125cf57600b54610100830151516040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090920463ffffffff1660048301526024820152604401610768565b600060026138c0608085614f4f565b67ffffffffffffffff166138d49190614f76565b905060006013816138e6608087614f8d565b67ffffffffffffffff16815260208101919091526040016000205490508161391060016004614f26565b901b191681836003811115613927576139276142af565b901b17806013600061393a608088614f8d565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517fafa0d379000000000000000000000000000000000000000000000000000000008152600090606090309063afa0d3799061399f9087908790600401615746565b600060405180830381600087803b1580156139b957600080fd5b505af19250505080156139ca575060015b613ae3573d8080156139f8576040519150601f19603f3d011682016040523d82523d6000602084013e6139fd565b606091505b50613a07816154e0565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c000000000000000000000000000000000000000000000000000000001480613a9f5750613a5a816154e0565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b15613aaf5760039250905061204d565b806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107689190614345565b50506040805160208101909152600081526002909250929050565b6000610fe18383613fc6565b600081815260028301602052604081205480151580613b2e5750613b2e8484613afe565b610fe1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610768565b60008181526002830160205260408120819055610fe18383613fde565b600082815260028401602052604081208290556118d88484613fea565b6000818152600283016020526040812054819080613bfd57613bf08585613afe565b92506000915061204d9050565b60019250905061204d565b60006106f582613ff6565b60008080613c218585614000565b600081815260029690960160205260409095205494959350505050565b6000670de0b6b3a7640000613c6d8377ffffffffffffffffffffffffffffffffffffffffffffffff8616614f76565b610fe1919061588a565b825474010000000000000000000000000000000000000000900460ff161580613c9e575081155b15613ca857505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090613cee90700100000000000000000000000000000000900463ffffffff1642614f26565b90508015613dae5781831115613d30576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613d6a9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613287565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015613e4b576001600160a01b038416613e00576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610768565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610768565b84831015613f445760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613e8f9082614f26565b613e99878a614f26565b613ea3919061528b565b613ead919061588a565b90506001600160a01b038616613ef9576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610768565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610768565b613f4e8584614f26565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60008181526001830160205260408120541515610fe1565b6000610fe1838361400c565b6000610fe18383614106565b60006106f5825490565b6000610fe18383614155565b600081815260018301602052604081205480156140f5576000614030600183614f26565b855490915060009061404490600190614f26565b90508181146140a957600086600001828154811061406457614064614fb4565b906000526020600020015490508087600001848154811061408757614087614fb4565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806140ba576140ba61589e565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106f5565b60009150506106f5565b5092915050565b600081815260018301602052604081205461414d575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106f5565b5060006106f5565b600082600001828154811061416c5761416c614fb4565b9060005260206000200154905092915050565b8280548282559060005260206000209081019282156141ec579160200282015b828111156141ec57825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0390911617825560209092019160019091019061419f565b506110f29291505b808211156110f257600081556001016141f4565b60c081016106f582846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff8116811461194857600080fd5b803561428d8161426c565b919050565b6000602082840312156142a457600080fd5b8135610fe18161426c565b634e487b7160e01b600052602160045260246000fd5b600481106142e357634e487b7160e01b600052602160045260246000fd5b9052565b602081016106f582846142c5565b60005b838110156143105781810151838201526020016142f8565b50506000910152565b600081518084526143318160208601602086016142f5565b601f01601f19169290920160200192915050565b602081526000610fe16020830184614319565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561439157614391614358565b60405290565b604051610180810167ffffffffffffffff8111828210171561439157614391614358565b6040516080810167ffffffffffffffff8111828210171561439157614391614358565b604051601f8201601f1916810167ffffffffffffffff8111828210171561440757614407614358565b604052919050565b600067ffffffffffffffff82111561442957614429614358565b5060051b60200190565b6001600160a01b038116811461194857600080fd5b803561428d81614433565b600082601f83011261446457600080fd5b813560206144796144748361440f565b6143de565b82815260059290921b8401810191818101908684111561449857600080fd5b8286015b848110156144bc5780356144af81614433565b835291830191830161449c565b509695505050505050565b803560ff8116811461428d57600080fd5b600067ffffffffffffffff8211156144f2576144f2614358565b50601f01601f191660200190565b600082601f83011261451157600080fd5b813561451f614474826144d8565b81815284602083860101111561453457600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561456a57600080fd5b863567ffffffffffffffff8082111561458257600080fd5b61458e8a838b01614453565b975060208901359150808211156145a457600080fd5b6145b08a838b01614453565b96506145be60408a016144c7565b955060608901359150808211156145d457600080fd5b6145e08a838b01614500565b94506145ee60808a01614282565b935060a089013591508082111561460457600080fd5b5061461189828a01614500565b9150509295509295509295565b60008083601f84011261463057600080fd5b50813567ffffffffffffffff81111561464857600080fd5b6020830191508360208260061b850101111561204d57600080fd5b6000806000806040858703121561467957600080fd5b843567ffffffffffffffff8082111561469157600080fd5b61469d8883890161461e565b909650945060208701359150808211156146b657600080fd5b506146c38782880161461e565b95989497509550505050565b6000602082840312156146e157600080fd5b8135610fe181614433565b600081518084526020808501945080840160005b838110156147255781516001600160a01b031687529582019590820190600101614700565b509495945050505050565b602081526000610fe160208301846146ec565b6020808252825182820181905260009190848201906040850190845b818110156147845783516001600160a01b03168352928401929184019160010161475f565b50909695505050505050565b60a081016106f5828463ffffffff80825116835260208201516001600160a01b038082166020860152806040850151166040860152505061ffff6060830151166060840152806080830151166080840152505050565b6000602082840312156147f857600080fd5b813567ffffffffffffffff81111561480f57600080fd5b820160a08185031215610fe157600080fd5b801515811461194857600080fd5b803561428d81614821565b600082601f83011261484b57600080fd5b8135602061485b6144748361440f565b82815260069290921b8401810191818101908684111561487a57600080fd5b8286015b848110156144bc57604081890312156148975760008081fd5b61489f61436e565b81356148aa81614433565b8152818501358582015283529183019160400161487e565b600061018082840312156148d557600080fd5b6148dd614397565b90506148e882614282565b81526148f660208301614282565b60208201526040820135604082015261491160608301614448565b606082015261492260808301614282565b608082015260a082013560a082015261493d60c0830161482f565b60c082015261494e60e08301614448565b60e08201526101008083013567ffffffffffffffff8082111561497057600080fd5b61497c86838701614500565b8385015261012092508285013591508082111561499857600080fd5b506149a58582860161483a565b8284015250506101406149b9818401614448565b818301525061016080830135818301525092915050565b600082601f8301126149e157600080fd5b813560206149f16144748361440f565b82815260059290921b84018101918181019086841115614a1057600080fd5b8286015b848110156144bc57803567ffffffffffffffff811115614a345760008081fd5b614a428986838b0101614500565b845250918301918301614a14565b60008060408385031215614a6357600080fd5b823567ffffffffffffffff80821115614a7b57600080fd5b614a87868387016148c2565b93506020850135915080821115614a9d57600080fd5b50614aaa858286016149d0565b9150509250929050565b60008083601f840112614ac657600080fd5b50813567ffffffffffffffff811115614ade57600080fd5b6020830191508360208260051b850101111561204d57600080fd5b60008060008060008060008060e0898b031215614b1557600080fd5b606089018a811115614b2657600080fd5b8998503567ffffffffffffffff80821115614b4057600080fd5b818b0191508b601f830112614b5457600080fd5b813581811115614b6357600080fd5b8c6020828501011115614b7557600080fd5b6020830199508098505060808b0135915080821115614b9357600080fd5b614b9f8c838d01614ab4565b909750955060a08b0135915080821115614bb857600080fd5b50614bc58b828c01614ab4565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff8116811461428d57600080fd5b600060608284031215614c1057600080fd5b6040516060810181811067ffffffffffffffff82111715614c3357614c33614358565b6040528235614c4181614821565b8152614c4f60208401614bde565b6020820152614c6060408401614bde565b60408201529392505050565b600082601f830112614c7d57600080fd5b81356020614c8d6144748361440f565b82815260059290921b84018101918181019086841115614cac57600080fd5b8286015b848110156144bc57803567ffffffffffffffff811115614cd05760008081fd5b614cde8986838b01016149d0565b845250918301918301614cb0565b600082601f830112614cfd57600080fd5b81356020614d0d6144748361440f565b82815260059290921b84018101918181019086841115614d2c57600080fd5b8286015b848110156144bc5780358352918301918301614d30565b600060808284031215614d5957600080fd5b614d616143bb565b9050813567ffffffffffffffff80821115614d7b57600080fd5b818401915084601f830112614d8f57600080fd5b81356020614d9f6144748361440f565b82815260059290921b84018101918181019088841115614dbe57600080fd5b8286015b84811015614df657803586811115614dda5760008081fd5b614de88b86838b01016148c2565b845250918301918301614dc2565b5086525085810135935082841115614e0d57600080fd5b614e1987858801614c6c565b90850152506040840135915080821115614e3257600080fd5b50614e3f84828501614cec565b6040830152506060820135606082015292915050565b60008060408385031215614e6857600080fd5b823567ffffffffffffffff80821115614e8057600080fd5b614e8c86838701614d47565b9350602091508185013581811115614ea357600080fd5b85019050601f81018613614eb657600080fd5b8035614ec46144748261440f565b81815260059190911b82018301908381019088831115614ee357600080fd5b928401925b82841015614f0157833582529284019290840190614ee8565b80955050505050509250929050565b634e487b7160e01b600052601160045260246000fd5b818103818111156106f5576106f5614f10565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff80841680614f6a57614f6a614f39565b92169190910692915050565b80820281158282048414176106f5576106f5614f10565b600067ffffffffffffffff80841680614fa857614fa8614f39565b92169190910492915050565b634e487b7160e01b600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614ffb57614ffb614f10565b5060010190565b600063ffffffff80831681810361501b5761501b614f10565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526150558184018a6146ec565b9050828103608084015261506981896146ec565b905060ff871660a084015282810360c08401526150868187614319565b905067ffffffffffffffff851660e08401528281036101008401526150ab8185614319565b9c9b505050505050505050505050565b6000602082840312156150cd57600080fd5b8151610fe181614433565b6000602082840312156150ea57600080fd5b8151610fe18161426c565b600081518084526020808501945080840160005b8381101561472557815180516001600160a01b031688528301518388015260409096019590820190600101615109565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152615174610120840182614319565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e08601526151b08383614319565b9250608089015191508085840301610100860152506151cf82826150f5565b925050506151e3602083018661ffff169052565b8360408301526124e460608301846001600160a01b03169052565b6000806040838503121561521157600080fd5b825161521c81614821565b602084015190925067ffffffffffffffff81111561523957600080fd5b8301601f8101851361524a57600080fd5b8051615258614474826144d8565b81815286602083850101111561526d57600080fd5b61527e8260208301602086016142f5565b8093505050509250929050565b808201808211156106f5576106f5614f10565b805163ffffffff8116811461428d57600080fd5b600060a082840312156152c457600080fd5b60405160a0810181811067ffffffffffffffff821117156152e7576152e7614358565b6040526152f38361529e565b8152602083015161530381614433565b6020820152604083015161531681614433565b6040820152606083015161ffff8116811461533057600080fd5b60608201526153416080840161529e565b60808201529392505050565b61016081016153b282856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c084015260208401516001600160a01b0390811660e0850152604085015116610100840152606084015161ffff16610120840152608084015116610140830152610fe1565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b16604085015281606085015261543c8285018b6146ec565b91508382036080850152615450828a6146ec565b915060ff881660a085015283820360c085015261546d8288614319565b90861660e085015283810361010085015290506150ab8185614319565b60a08152600061549d60a0830188614319565b6001600160a01b038716602084015285604084015267ffffffffffffffff8516606084015282810360808401526154d48185614319565b98975050505050505050565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156155285780818460040360031b1b83161693505b505050919050565b60006020828403121561554257600080fd5b813567ffffffffffffffff81111561555957600080fd5b6118d884828501614d47565b60006020828403121561557757600080fd5b8151610fe181614821565b600081518084526020808501945080840160005b8381101561472557815187529582019590820190600101615596565b6060815260006155c56060830186615582565b82810360208401526155d78186615582565b915050826040830152949350505050565b6000602082840312156155fa57600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156140ff576140ff614f10565b67ffffffffffffffff8316815260408101610fe160208301846142c5565b600067ffffffffffffffff80831681810361501b5761501b614f10565b61566781846142c5565b6040602082015260006118d86040830184614319565b60006040828403121561568f57600080fd5b61569761436e565b825177ffffffffffffffffffffffffffffffffffffffffffffffff811681146156bf57600080fd5b815260208301516156cf8161426c565b60208201529392505050565b602081526000610fe160208301846150f5565b600082825180855260208086019550808260051b84010181860160005b8481101561573957601f19868403018952615727838351614319565b9884019892509083019060010161570b565b5090979650505050505050565b6040815261576160408201845167ffffffffffffffff169052565b6000602084015161577e606084018267ffffffffffffffff169052565b506040840151608083015260608401516001600160a01b03811660a084015250608084015167ffffffffffffffff811660c08401525060a084015160e083015260c08401516101006157d38185018315159052565b60e086015191506101206157f1818601846001600160a01b03169052565b818701519250610180915061014082818701526158126101c0870185614319565b93508188015191506101607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878603018188015261585085846150f5565b945081890151925061586c848801846001600160a01b03169052565b8801516101a087015250505082810360208401526124e481856156ee565b60008261589957615899614f39565b500490565b634e487b7160e01b600052603160045260246000fdfea164736f6c6343000813000a",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
