{
  "_format": "hh-sol-artifact-1",
  "contractName": "PangolinStakingPositions",
  "sourceName": "contracts/staking-positions/PangolinStakingPositions.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newRewardsToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        },
        {
          "internalType": "contract ITokenMetadata",
          "name": "newTokenMetadata",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "FailedTransfer",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "HighSlippage",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InsufficientBalance",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidAmount",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidToken",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidType",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "Locked",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MismatchedArrayLengths",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoEffect",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NonExistentToken",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NullInput",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OutOfBounds",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "Overflow",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TooEarly",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TooLate",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "Underflow",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnprivilegedCaller",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "approved",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "ApprovalForAll",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newApprovalPauseDuration",
          "type": "uint256"
        }
      ],
      "name": "PauseDurationSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newDuration",
          "type": "uint256"
        }
      ],
      "name": "PeriodDurationUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [],
      "name": "PeriodEnded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "reward",
          "type": "uint256"
        }
      ],
      "name": "RewardAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "previousAdminRole",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "newAdminRole",
          "type": "bytes32"
        }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "positionId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "reward",
          "type": "uint256"
        }
      ],
      "name": "Staked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "contract ITokenMetadata",
          "name": "newTokenMetadata",
          "type": "address"
        }
      ],
      "name": "TokenMetadataSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "positionId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "reward",
          "type": "uint256"
        }
      ],
      "name": "Withdrawn",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "addReward",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "approvalPauseDuration",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "positionId",
          "type": "uint256"
        }
      ],
      "name": "burn",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "positionId",
          "type": "uint256"
        }
      ],
      "name": "compound",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "positionId",
          "type": "uint256"
        }
      ],
      "name": "emergencyExit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "endPeriod",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getApproved",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        }
      ],
      "name": "getRoleMember",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleMemberCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "positionId",
          "type": "uint256"
        }
      ],
      "name": "harvest",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "isApprovedForAll",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lastUpdate",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "positionId",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256[]",
          "name": "positionIds",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256[]",
          "name": "amounts",
          "type": "uint256[]"
        }
      ],
      "name": "multiStake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256[]",
          "name": "positionIds",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256[]",
          "name": "amounts",
          "type": "uint256[]"
        }
      ],
      "name": "multiWithdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "ownerOf",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "periodDuration",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "periodFinish",
      "outputs": [
        {
          "internalType": "uint40",
          "name": "",
          "type": "uint40"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "positionId",
          "type": "uint256"
        }
      ],
      "name": "positionPendingRewards",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "positionId",
          "type": "uint256"
        }
      ],
      "name": "positionRewardRate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "positions",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint96",
              "name": "balance",
              "type": "uint96"
            },
            {
              "internalType": "uint160",
              "name": "sumOfEntryTimes",
              "type": "uint160"
            }
          ],
          "internalType": "struct PangolinStakingPositions.ValueVariables",
          "name": "valueVariables",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "idealPosition",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "rewardPerValue",
              "type": "uint256"
            }
          ],
          "internalType": "struct PangolinStakingPositions.RewardSummations",
          "name": "rewardSummationsPaid",
          "type": "tuple"
        },
        {
          "internalType": "uint160",
          "name": "previousValues",
          "type": "uint160"
        },
        {
          "internalType": "uint48",
          "name": "lastUpdate",
          "type": "uint48"
        },
        {
          "internalType": "uint48",
          "name": "lastDevaluation",
          "type": "uint48"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rewardRate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rewardSummationsStored",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "idealPosition",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "rewardPerValue",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rewardsToken",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "setApprovalForAll",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "newApprovalPauseDuration",
          "type": "uint256"
        }
      ],
      "name": "setApprovalPauseDuration",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "newDuration",
          "type": "uint256"
        }
      ],
      "name": "setPeriodDuration",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ITokenMetadata",
          "name": "newTokenMetadata",
          "type": "address"
        }
      ],
      "name": "setTokenMetadata",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "positionId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "stake",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        }
      ],
      "name": "tokenByIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "tokenMetadata",
      "outputs": [
        {
          "internalType": "contract ITokenMetadata",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        }
      ],
      "name": "tokenOfOwnerByIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "tokenURI",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "from",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "to",
          "type": "uint256"
        }
      ],
      "name": "tokensOfOwnerByIndex",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalRewardAdded",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "",
          "type": "uint96"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalValueVariables",
      "outputs": [
        {
          "internalType": "uint96",
          "name": "balance",
          "type": "uint96"
        },
        {
          "internalType": "uint160",
          "name": "sumOfEntryTimes",
          "type": "uint160"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "positionId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "withdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60a060405262127500600d55611c206013553480156200001e57600080fd5b5060405162004398380380620043988339810160408190526200004191620002f4565b82826040518060400160405280601a81526020017f50616e676f6c696e205374616b696e6720506f736974696f6e7300000000000081525060405180604001604052806007815260200166504e472d504f5360c81b8152508160009081620000aa9190620003ec565b506001620000b98282620003ec565b5050506001600160a01b038116620000e457604051632505ecc360e11b815260040160405180910390fd5b816001600160a01b03163b600003620001105760405163c1ab6dc160e01b815260040160405180910390fd5b6001600160a01b0382166080526200012a60008262000181565b620001567f0914bb97ca83e85ef385857d9d418f187ff630589e0c9f44db92976d8e4519cb8262000181565b5050600f80546001600160a01b0319166001600160a01b039290921691909117905550620004b89050565b620001988282620001c460201b620018f41760201c565b6000828152600b60209081526040909120620001bf9183906200199662000269821b17901c565b505050565b6000828152600a602090815260408083206001600160a01b038516845290915290205460ff1662000265576000828152600a602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620002243390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000280836001600160a01b03841662000289565b90505b92915050565b6000818152600183016020526040812054620002d25750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000283565b50600062000283565b6001600160a01b0381168114620002f157600080fd5b50565b6000806000606084860312156200030a57600080fd5b83516200031781620002db565b60208501519093506200032a81620002db565b60408501519092506200033d81620002db565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200037357607f821691505b6020821081036200039457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001bf57600081815260208120601f850160051c81016020861015620003c35750805b601f850160051c820191505b81811015620003e457828155600101620003cf565b505050505050565b81516001600160401b0381111562000408576200040862000348565b62000420816200041984546200035e565b846200039a565b602080601f8311600181146200045857600084156200043f5750858301515b600019600386901b1c1916600185901b178555620003e4565b600085815260208120601f198616915b82811015620004895788860151825594840194600190910190840162000468565b5085821015620004a85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051613eb6620004e2600039600081816108050152818161261901526127000152613eb66000f3fe608060405234801561001057600080fd5b506004361061034c5760003560e01c80637b0472f0116101bd578063b88d4fde116100f9578063d547741f116100a2578063e985e9c51161007c578063e985e9c5146108ac578063ebe2b12b146108e8578063f5b2cad714610900578063f5c455001461091357600080fd5b8063d547741f14610827578063ddc632621461083a578063df3e1aa41461084d57600080fd5b8063ca15c873116100d3578063ca15c873146107cd578063ce9e2daa146107e0578063d1af0c7d1461080057600080fd5b8063b88d4fde14610772578063c046371114610785578063c87b56dd146107ba57600080fd5b806399fbab8811610166578063a22cb46511610140578063a22cb46514610730578063aa5f7e2614610743578063aea62e3f14610756578063b470aade1461076957600080fd5b806399fbab8814610615578063a0712d6814610715578063a217fddf1461072857600080fd5b80639010d07c116101975780639010d07c146105c157806391d14854146105d457806395d89b411461060d57600080fd5b80637b0472f0146105935780637b0a47ee146105a65780637c2d6e01146105ae57600080fd5b806342842e0e1161028c5780635e4c911f116102355780636fdff40f1161020f5780636fdff40f1461054757806370a082311461055a57806374de4ec41461056d57806375c3fd3f1461058057600080fd5b80635e4c911f146105195780635faa65ff1461052c5780636352211e1461053457600080fd5b8063468cc41e11610266578063468cc41e146104e0578063496cea98146104f35780634f6ccce71461050657600080fd5b806342842e0e146104a757806342966c68146104ba578063441a3e70146104cd57600080fd5b806323b872dd116102f95780632f745c59116102d35780632f745c5914610465578063340b13361461047857806336568abe146104815780634231b0bd1461049457600080fd5b806323b872dd1461041c578063248a9ca31461042f5780632f2ff15d1461045257600080fd5b8063095ea7b31161032a578063095ea7b3146103b9578063098b8858146103ce57806318160ddd1461040a57600080fd5b806301ffc9a71461035157806306fdde0314610379578063081812fc1461038e575b600080fd5b61036461035f36600461376d565b610936565b60405190151581526020015b60405180910390f35b610381610956565b60405161037091906137e2565b6103a161039c3660046137f5565b6109e8565b6040516001600160a01b039091168152602001610370565b6103cc6103c7366004613823565b610a0f565b005b600c546103ed90600160a01b90046bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff9091168152602001610370565b6008545b604051908152602001610370565b6103cc61042a36600461384f565b610b45565b61040e61043d3660046137f5565b6000908152600a602052604090206001015490565b6103cc610460366004613890565b610bcc565b61040e610473366004613823565b610bf1565b61040e60135481565b6103cc61048f366004613890565b610c99565b6103cc6104a23660046137f5565b610d25565b6103cc6104b536600461384f565b610d31565b6103cc6104c83660046137f5565b610d4c565b6103cc6104db3660046138c0565b610da9565b61040e6104ee3660046137f5565b610dbb565b61040e6105013660046137f5565b610e19565b61040e6105143660046137f5565b610e3f565b6103cc61052736600461392e565b610ee3565b6103cc610f7a565b6103a16105423660046137f5565b61108c565b6103cc61055536600461399a565b6110f1565b61040e61056836600461399a565b61115f565b6103cc61057b3660046137f5565b6111f9565b6103cc61058e3660046137f5565b611413565b6103cc6105a13660046138c0565b611477565b61040e611489565b6103cc6105bc3660046137f5565b6114cc565b6103a16105cf3660046138c0565b6115a1565b6103646105e2366004613890565b6000918252600a602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6103816115c0565b6106b16106233660046137f5565b600e602090815260009182526040918290208251808401845281546bffffffffffffffffffffffff811682526001600160a01b036c0100000000000000000000000090910481168285015284518086019095526001830154855260028301549385019390935260039091015490929181169065ffffffffffff600160a01b8204811691600160d01b90041685565b6040805186516bffffffffffffffffffffffff1681526020968701516001600160a01b03908116888301528651928201929092529590940151606086015292909116608084015265ffffffffffff90811660a08401521660c082015260e001610370565b61040e6107233660046137f5565b6115cf565b61040e600081565b6103cc61073e3660046139c5565b611608565b6103cc6107513660046137f5565b611613565b6103cc61076436600461392e565b611626565b61040e600d5481565b6103cc610780366004613a62565b6116b5565b600c546107a4906a0100000000000000000000900464ffffffffff1681565b60405164ffffffffff9091168152602001610370565b6103816107c83660046137f5565b611743565b61040e6107db3660046137f5565b6117de565b6107f36107ee366004613b11565b6117f5565b6040516103709190613b46565b6103a17f000000000000000000000000000000000000000000000000000000000000000081565b6103cc610835366004613890565b6118bc565b6103cc6108483660046137f5565b6118e1565b601054610880906bffffffffffffffffffffffff8116906c0100000000000000000000000090046001600160a01b031682565b604080516bffffffffffffffffffffffff90931683526001600160a01b03909116602083015201610370565b6103646108ba366004613b8a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600c546107a490600160781b900464ffffffffff1681565b600f546103a1906001600160a01b031681565b601154601254610921919082565b60408051928352602083019190915201610370565b6000610941826119ab565b806109505750610950826119e9565b92915050565b60606000805461096590613bb8565b80601f016020809104026020016040519081016040528092919081815260200182805461099190613bb8565b80156109de5780601f106109b3576101008083540402835291602001916109de565b820191906000526020600020905b8154815290600101906020018083116109c157829003601f168201915b5050505050905090565b60006109f382611a27565b506000908152600460205260409020546001600160a01b031690565b6000610a1a8261108c565b9050806001600160a01b0316836001600160a01b031603610aa85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b0382161480610ac45750610ac481336108ba565b610b365760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610a9f565b610b408383611a8b565b505050565b610b4f3382611b06565b610bc15760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152608401610a9f565b610b40838383611b84565b6000828152600a6020526040902060010154610be781611dc7565b610b408383611dd1565b6000610bfc8361115f565b8210610c705760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a9f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381163314610d175760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a9f565b610d218282611df3565b5050565b610d2e81611e15565b50565b610b40838383604051806020016040528060008152506116b5565b6000818152600e60205260409020546bffffffffffffffffffffffff1615610da0576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d2e81611f2c565b610db1611f8a565b610d218282611fdf565b600080610dc860106121af565b6000848152600e6020526040812091925090610de3906121af565b90508015610e0e578181610df5611489565b610dff9190613c08565b610e099190613c27565b610e11565b60005b949350505050565b6000818152600e6020526040812081610e338260016121f0565b9050610e1181836122fb565b6000610e4a60085490565b8210610ebe5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610a9f565b60088281548110610ed157610ed1613c49565b90600052602060002001549050919050565b610eeb611f8a565b82818114610f25576040517f568efce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610f7257610f6a868683818110610f4557610f45613c49565b90506020020135858584818110610f5e57610f5e613c49565b905060200201356123b7565b600101610f28565b505050505050565b6000610f8581611dc7565b600c54600160781b900464ffffffffff16428111610fcf576040517fecdd1c2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c805464ffffffffff42908116600160781b027fffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff91850369ffffffffffffffffffff8416026bffffffffffffffffffffffff600160a01b808604821683900390911602929092166effffffffffffffffffffffffffffff909316929092179190911790915561105e816125e4565b6040517fac02d07d013ae7c7e3ee940f8df0877c2ab1103bf87ab258ce31665f7111f09290600090a1505050565b6000818152600260205260408120546001600160a01b0316806109505760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610a9f565b60006110fc81611dc7565b600f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091556040519081527f8a1803707dfd67114623e59e8141ee8d109332da42c6c3e8212724807e140a6b906020015b60405180910390a15050565b60006001600160a01b0382166111dd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610a9f565b506001600160a01b031660009081526003602052604090205490565b7f0914bb97ca83e85ef385857d9d418f187ff630589e0c9f44db92976d8e4519cb61122381611dc7565b600d546bffffffffffffffffffffffff83111561126c576040517f35278d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600c60148282829054906101000a90046bffffffffffffffffffffffff166112959190613c5f565b82546bffffffffffffffffffffffff9182166101009390930a928302919092021990911617905550600c5460009064ffffffffff600160781b820481166a010000000000000000000090920416106112f0575080830461132a565b50600c5464ffffffffff6a010000000000000000000082048116600160781b83049091160369ffffffffffffffffffff9091160283018190045b8060000361134b576040516324d0659d60e11b815260040160405180910390fd5b600c80544284810164ffffffffff908116600160781b027fffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff919092166a0100000000000000000000027fffffffffffffffffffffffffffffffffff00000000000000000000000000000090931669ffffffffffffffffffff86161792909217919091161790556113da846126c5565b6040518481527fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9060200160405180910390a150505050565b600061141e81611dc7565b6202a30082111561144257604051632d0483c560e21b815260040160405180910390fd5b60138290556040518281527fa959cb2cc91580147f93f66fb85db8f308cfdaef3989ab5265408ff80ef6fa6690602001611153565b61147f611f8a565b610d2182826123b7565b600c5460009042600160781b90910464ffffffffff16106114b857600c5469ffffffffffffffffffff166114bb565b60005b69ffffffffffffffffffff16905090565b60006114d781611dc7565b600c5442600160781b90910464ffffffffff161115611522576040517f085de62500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201000182101561154657604051632d0483c560e21b815260040160405180910390fd5b64010000000082111561156c57604051632d0483c560e21b815260040160405180910390fd5b600d8290556040518281527fbd6eb9cf4d6e2902587c57e3163aaafdb46e3b3f2086bdfa75c790228930a9d790602001611153565b6000828152600b602052604081206115b99083612737565b9392505050565b60606001805461096590613bb8565b60006115d9611f8a565b6014600081546115e890613c8f565b918290555090506115f93382612743565b61160381836123b7565b919050565b610d213383836128e9565b61161b611f8a565b610d2e8160006123b7565b61162e611f8a565b82818114611668576040517f568efce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610f72576116ad86868381811061168857611688613c49565b905060200201358585848181106116a1576116a1613c49565b90506020020135611fdf565b60010161166b565b6116bf3383611b06565b6117315760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152608401610a9f565b61173d848484846129b7565b50505050565b606061174e82611a27565b600f546040517fe9dc6375000000000000000000000000000000000000000000000000000000008152306004820152602481018490526001600160a01b039091169063e9dc637590604401600060405180830381865afa1580156117b6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109509190810190613ca9565b6000818152600b6020526040812061095090612a40565b60608183111561181857604051632d0483c560e21b815260040160405180910390fd5b60006118248484613d17565b61182f906001613d2e565b905060008167ffffffffffffffff81111561184c5761184c6139f3565b604051908082528060200260200182016040528015611875578160200160208202803683370190505b5090505b8385116118b35761188a8686610bf1565b81868151811061189c5761189c613c49565b602002602001018181525050846001019450611879565b95945050505050565b6000828152600a60205260409020600101546118d781611dc7565b610b408383611df3565b6118e9611f8a565b610d2e816000611fdf565b6000828152600a602090815260408083206001600160a01b038516845290915290205460ff16610d21576000828152600a602090815260408083206001600160a01b03851684529091529020805460ff191660011790556119523390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006115b9836001600160a01b038416612a4a565b60006001600160e01b031982167f5a05180f000000000000000000000000000000000000000000000000000000001480610950575061095082612a99565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610950575061095082612ad7565b6000818152600260205260409020546001600160a01b0316610d2e5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610a9f565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190611acd8261108c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611b128361108c565b9050806001600160a01b0316846001600160a01b03161480611b5957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610e115750836001600160a01b0316611b72846109e8565b6001600160a01b031614949350505050565b826001600160a01b0316611b978261108c565b6001600160a01b031614611c135760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a9f565b6001600160a01b038216611c8e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a9f565b611c9b8383836001612b72565b826001600160a01b0316611cae8261108c565b6001600160a01b031614611d2a5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a9f565b6000818152600460209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d2e8133612bfa565b611ddb82826118f4565b6000828152600b60205260409020610b409082611996565b611dfd8282612c6f565b6000828152600b60205260409020610b409082612cf2565b8033611e208261108c565b6001600160a01b031614611e4757604051631c62c2b160e11b815260040160405180910390fd5b6000828152600e60209081526040918290208251808401909352546bffffffffffffffffffffffff8082168085526001600160a01b036c01000000000000000000000000938490048116948601859052601080548085168490039094166bffffffffffffffffffffffff1990941684178590048216959095031690920217909155611ed184611f2c565b611ee8816bffffffffffffffffffffffff166125e4565b6000816bffffffffffffffffffffffff16857fabd2ab552bc04cdbfa4a54107fa44ac8c9cb06f6d21da11933ac05a653be19e960405160405180910390a450505050565b8033611f378261108c565b6001600160a01b031614611f5e57604051631c62c2b160e11b815260040160405180910390fd5b6000828152600e60205260408120818155600181018290556002810182905560030155610d2182612d07565b6000611f94612db7565b9050600080611fa283612e04565b915091508160116000016000828254611fbb9190613d2e565b909155505060128054829190600090611fd5908490613d2e565b9091555050505050565b8133611fea8261108c565b6001600160a01b03161461201157604051631c62c2b160e11b815260040160405180910390fd5b6000838152600e6020526040902080546bffffffffffffffffffffffff1680841115612069576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061207483612e7d565b905060006120828287613d2e565b9050806000036120a5576040516324d0659d60e11b815260040160405180910390fd5b601080546bffffffffffffffffffffffff1981166bffffffffffffffffffffffff918216899003821690811780845587546c01000000000000000000000000908190046001600160a01b039081168c8a0342818102958590048416860192909203831684029095179096559290931691169091021785557fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff600160d01b65ffffffffffff90921691820216600160a01b90910217600385015560115460018501556012546002850155612177816125e4565b8186887fabd2ab552bc04cdbfa4a54107fa44ac8c9cb06f6d21da11933ac05a653be19e960405160405180910390a450505050505050565b80546000906001600160a01b036c01000000000000000000000000820416906121e6906bffffffffffffffffffffffff1642613c08565b6109509190613d17565b60408051808201909152600080825260208201526003830154600160a01b900465ffffffffffff1660000361223957506040805180820190915260008082526020820152610950565b6001830182156122bd57600061224d612e97565b905060008061225b83612e04565b9150915060405180604001604052808560000154846011600001546122809190613d2e565b61228a9190613d17565b81526020018560010154836011600101546122a59190613d2e565b6122af9190613d17565b815250945050505050610950565b60408051808201909152815460115482916122d791613d17565b815260200182600101546011600101546122f19190613d17565b9052949350505050565b6003810154600090600160a01b900465ffffffffffff16156123ae576003820154602084015170010000000000000000000000000000000091612349916001600160a01b0390911690613c08565b8354600385015460208701516bffffffffffffffffffffffff9092169161237f91600160a01b900465ffffffffffff1690613c08565b865161238b9190613d17565b6123959190613c08565b61239f9190613d2e565b6123a99190613c27565b6115b9565b50600092915050565b81336123c28261108c565b6001600160a01b0316146123e957604051631c62c2b160e11b815260040160405180910390fd5b6000838152600e602052604081209061240182612e7d565b9050600061240f8286613d2e565b905080600003612432576040516324d0659d60e11b815260040160405180910390fd5b6010546000906124519083906bffffffffffffffffffffffff16613d2e565b90506bffffffffffffffffffffffff811115612499576040517f35278d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601080546bffffffffffffffffffffffff8381166001600160a01b036c0100000000000000000000000093849004811642808902918201831686026bffffffffffffffffffffffff19908116949094179096558954808516808a0190951693168317859004821601811690930217875560038701805480841665ffffffffffff600160a01b8304169095039092029390930190911673ffffffffffffffffffffffffffffffffffffffff1990911617905561259d8460038101805465ffffffffffff4216600160a01b027fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff9091161790556011546001820155601254600290910155565b85156125ac576125ac866126c5565b8286887fc8acfabcfb3af3df23b7b8a1aa1371d042bee71e137eeedc881ffa8f3c44626160405160405180910390a450505050505050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044015b6020604051808303816000875af115801561266b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268f9190613d46565b610d2e576040517fbfa871c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd9060640161264c565b60006115b98383612f16565b6001600160a01b0382166127995760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a9f565b6000818152600260205260409020546001600160a01b0316156127fe5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a9f565b61280c600083836001612b72565b6000818152600260205260409020546001600160a01b0316156128715760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a9f565b6001600160a01b0382166000818152600360209081526040808320805460010190558483526002909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b03160361294a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a9f565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129c2848484611b84565b6129ce84848484612f40565b61173d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a9f565b6000610950825490565b6000818152600183016020526040812054612a9157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610950565b506000610950565b60006001600160e01b031982167f7965db0b0000000000000000000000000000000000000000000000000000000014806109505750610950826119e9565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480612b3a57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061095057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610950565b336001600160a01b03851614612bee576013546000838152600e60205260408120600301549091612bb191600160d01b900465ffffffffffff16613d2e565b9050804211612bec576040517f085de62500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61173d848484846130c9565b6000828152600a602090815260408083206001600160a01b038516845290915290205460ff16610d2157612c2d81613211565b612c38836020613223565b604051602001612c49929190613d63565b60408051601f198184030181529082905262461bcd60e51b8252610a9f916004016137e2565b6000828152600a602090815260408083206001600160a01b038516845290915290205460ff1615610d21576000828152600a602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006115b9836001600160a01b03841661344c565b6000612d128261108c565b9050612d22816000846001612b72565b612d2b8261108c565b6000838152600460209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000612dc1612e97565b600c80547fffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff166a01000000000000000000004264ffffffffff1602179055919050565b6000806000612e1360106121af565b90508015612e775780700100000000000000000000000000000000612e384287613c08565b612e429190613c08565b612e4c9190613c27565b925080612e6a70010000000000000000000000000000000086613c08565b612e749190613c27565b91505b50915091565b600080612e8b8360006121f0565b90506115b981846122fb565b600c54600090600160781b900464ffffffffff1681428210612eb95742612ebb565b815b600c549091506a0100000000000000000000900464ffffffffff1680821115612ef457600c5469ffffffffffffffffffff168183030293505b6bffffffffffffffffffffffff841115612f1057612f10613de4565b50505090565b6000826000018281548110612f2d57612f2d613c49565b9060005260206000200154905092915050565b60006001600160a01b0384163b156130be576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612f9d903390899088908890600401613dfa565b6020604051808303816000875af1925050508015612fd8575060408051601f3d908101601f19168201909252612fd591810190613e36565b60015b61308b573d808015613006576040519150601f19603f3d011682016040523d82523d6000602084013e61300b565b606091505b5080516000036130835760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a9f565b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050610e11565b506001949350505050565b6130d58484848461353f565b600181111561314c5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e736563757469766520747260448201527f616e7366657273206e6f7420737570706f7274656400000000000000000000006064820152608401610a9f565b816001600160a01b0385166131a8576131a381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6131cb565b836001600160a01b0316856001600160a01b0316146131cb576131cb85826135c7565b6001600160a01b0384166131e7576131e281613664565b61320a565b846001600160a01b0316846001600160a01b03161461320a5761320a8482613713565b5050505050565b60606109506001600160a01b03831660145b60606000613232836002613c08565b61323d906002613d2e565b67ffffffffffffffff811115613255576132556139f3565b6040519080825280601f01601f19166020018201604052801561327f576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106132b6576132b6613c49565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061331957613319613c49565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000613355846002613c08565b613360906001613d2e565b90505b60018111156133fd577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106133a1576133a1613c49565b1a60f81b8282815181106133b7576133b7613c49565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936133f681613e53565b9050613363565b5083156115b95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a9f565b60008181526001830160205260408120548015613535576000613470600183613d17565b855490915060009061348490600190613d17565b90508181146134e95760008660000182815481106134a4576134a4613c49565b90600052602060002001549050808760000184815481106134c7576134c7613c49565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806134fa576134fa613e6a565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610950565b6000915050610950565b600181111561173d576001600160a01b03841615613585576001600160a01b0384166000908152600360205260408120805483929061357f908490613d17565b90915550505b6001600160a01b0383161561173d576001600160a01b038316600090815260036020526040812080548392906135bc908490613d2e565b909155505050505050565b600060016135d48461115f565b6135de9190613d17565b600083815260076020526040902054909150808214613631576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061367690600190613d17565b6000838152600960205260408120546008805493945090928490811061369e5761369e613c49565b9060005260206000200154905080600883815481106136bf576136bf613c49565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806136f7576136f7613e6a565b6001900381819060005260206000200160009055905550505050565b600061371e8361115f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114610d2e57600080fd5b60006020828403121561377f57600080fd5b81356115b981613757565b60005b838110156137a557818101518382015260200161378d565b8381111561173d5750506000910152565b600081518084526137ce81602086016020860161378a565b601f01601f19169290920160200192915050565b6020815260006115b960208301846137b6565b60006020828403121561380757600080fd5b5035919050565b6001600160a01b0381168114610d2e57600080fd5b6000806040838503121561383657600080fd5b82356138418161380e565b946020939093013593505050565b60008060006060848603121561386457600080fd5b833561386f8161380e565b9250602084013561387f8161380e565b929592945050506040919091013590565b600080604083850312156138a357600080fd5b8235915060208301356138b58161380e565b809150509250929050565b600080604083850312156138d357600080fd5b50508035926020909101359150565b60008083601f8401126138f457600080fd5b50813567ffffffffffffffff81111561390c57600080fd5b6020830191508360208260051b850101111561392757600080fd5b9250929050565b6000806000806040858703121561394457600080fd5b843567ffffffffffffffff8082111561395c57600080fd5b613968888389016138e2565b9096509450602087013591508082111561398157600080fd5b5061398e878288016138e2565b95989497509550505050565b6000602082840312156139ac57600080fd5b81356115b98161380e565b8015158114610d2e57600080fd5b600080604083850312156139d857600080fd5b82356139e38161380e565b915060208301356138b5816139b7565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613a3257613a326139f3565b604052919050565b600067ffffffffffffffff821115613a5457613a546139f3565b50601f01601f191660200190565b60008060008060808587031215613a7857600080fd5b8435613a838161380e565b93506020850135613a938161380e565b925060408501359150606085013567ffffffffffffffff811115613ab657600080fd5b8501601f81018713613ac757600080fd5b8035613ada613ad582613a3a565b613a09565b818152886020838501011115613aef57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080600060608486031215613b2657600080fd5b8335613b318161380e565b95602085013595506040909401359392505050565b6020808252825182820181905260009190848201906040850190845b81811015613b7e57835183529284019291840191600101613b62565b50909695505050505050565b60008060408385031215613b9d57600080fd5b8235613ba88161380e565b915060208301356138b58161380e565b600181811c90821680613bcc57607f821691505b602082108103613bec57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613c2257613c22613bf2565b500290565b600082613c4457634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006bffffffffffffffffffffffff808316818516808303821115613c8657613c86613bf2565b01949350505050565b60006000198203613ca257613ca2613bf2565b5060010190565b600060208284031215613cbb57600080fd5b815167ffffffffffffffff811115613cd257600080fd5b8201601f81018413613ce357600080fd5b8051613cf1613ad582613a3a565b818152856020838501011115613d0657600080fd5b6118b382602083016020860161378a565b600082821015613d2957613d29613bf2565b500390565b60008219821115613d4157613d41613bf2565b500190565b600060208284031215613d5857600080fd5b81516115b9816139b7565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613d9b81601785016020880161378a565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351613dd881602884016020880161378a565b01602801949350505050565b634e487b7160e01b600052600160045260246000fd5b60006001600160a01b03808716835280861660208401525083604083015260806060830152613e2c60808301846137b6565b9695505050505050565b600060208284031215613e4857600080fd5b81516115b981613757565b600081613e6257613e62613bf2565b506000190190565b634e487b7160e01b600052603160045260246000fdfea26469706673582212208466454c916a0f0ba4c38f4e538bca6a31d10def7fc72f12df3d85267271798964736f6c634300080f0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061034c5760003560e01c80637b0472f0116101bd578063b88d4fde116100f9578063d547741f116100a2578063e985e9c51161007c578063e985e9c5146108ac578063ebe2b12b146108e8578063f5b2cad714610900578063f5c455001461091357600080fd5b8063d547741f14610827578063ddc632621461083a578063df3e1aa41461084d57600080fd5b8063ca15c873116100d3578063ca15c873146107cd578063ce9e2daa146107e0578063d1af0c7d1461080057600080fd5b8063b88d4fde14610772578063c046371114610785578063c87b56dd146107ba57600080fd5b806399fbab8811610166578063a22cb46511610140578063a22cb46514610730578063aa5f7e2614610743578063aea62e3f14610756578063b470aade1461076957600080fd5b806399fbab8814610615578063a0712d6814610715578063a217fddf1461072857600080fd5b80639010d07c116101975780639010d07c146105c157806391d14854146105d457806395d89b411461060d57600080fd5b80637b0472f0146105935780637b0a47ee146105a65780637c2d6e01146105ae57600080fd5b806342842e0e1161028c5780635e4c911f116102355780636fdff40f1161020f5780636fdff40f1461054757806370a082311461055a57806374de4ec41461056d57806375c3fd3f1461058057600080fd5b80635e4c911f146105195780635faa65ff1461052c5780636352211e1461053457600080fd5b8063468cc41e11610266578063468cc41e146104e0578063496cea98146104f35780634f6ccce71461050657600080fd5b806342842e0e146104a757806342966c68146104ba578063441a3e70146104cd57600080fd5b806323b872dd116102f95780632f745c59116102d35780632f745c5914610465578063340b13361461047857806336568abe146104815780634231b0bd1461049457600080fd5b806323b872dd1461041c578063248a9ca31461042f5780632f2ff15d1461045257600080fd5b8063095ea7b31161032a578063095ea7b3146103b9578063098b8858146103ce57806318160ddd1461040a57600080fd5b806301ffc9a71461035157806306fdde0314610379578063081812fc1461038e575b600080fd5b61036461035f36600461376d565b610936565b60405190151581526020015b60405180910390f35b610381610956565b60405161037091906137e2565b6103a161039c3660046137f5565b6109e8565b6040516001600160a01b039091168152602001610370565b6103cc6103c7366004613823565b610a0f565b005b600c546103ed90600160a01b90046bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff9091168152602001610370565b6008545b604051908152602001610370565b6103cc61042a36600461384f565b610b45565b61040e61043d3660046137f5565b6000908152600a602052604090206001015490565b6103cc610460366004613890565b610bcc565b61040e610473366004613823565b610bf1565b61040e60135481565b6103cc61048f366004613890565b610c99565b6103cc6104a23660046137f5565b610d25565b6103cc6104b536600461384f565b610d31565b6103cc6104c83660046137f5565b610d4c565b6103cc6104db3660046138c0565b610da9565b61040e6104ee3660046137f5565b610dbb565b61040e6105013660046137f5565b610e19565b61040e6105143660046137f5565b610e3f565b6103cc61052736600461392e565b610ee3565b6103cc610f7a565b6103a16105423660046137f5565b61108c565b6103cc61055536600461399a565b6110f1565b61040e61056836600461399a565b61115f565b6103cc61057b3660046137f5565b6111f9565b6103cc61058e3660046137f5565b611413565b6103cc6105a13660046138c0565b611477565b61040e611489565b6103cc6105bc3660046137f5565b6114cc565b6103a16105cf3660046138c0565b6115a1565b6103646105e2366004613890565b6000918252600a602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6103816115c0565b6106b16106233660046137f5565b600e602090815260009182526040918290208251808401845281546bffffffffffffffffffffffff811682526001600160a01b036c0100000000000000000000000090910481168285015284518086019095526001830154855260028301549385019390935260039091015490929181169065ffffffffffff600160a01b8204811691600160d01b90041685565b6040805186516bffffffffffffffffffffffff1681526020968701516001600160a01b03908116888301528651928201929092529590940151606086015292909116608084015265ffffffffffff90811660a08401521660c082015260e001610370565b61040e6107233660046137f5565b6115cf565b61040e600081565b6103cc61073e3660046139c5565b611608565b6103cc6107513660046137f5565b611613565b6103cc61076436600461392e565b611626565b61040e600d5481565b6103cc610780366004613a62565b6116b5565b600c546107a4906a0100000000000000000000900464ffffffffff1681565b60405164ffffffffff9091168152602001610370565b6103816107c83660046137f5565b611743565b61040e6107db3660046137f5565b6117de565b6107f36107ee366004613b11565b6117f5565b6040516103709190613b46565b6103a17f000000000000000000000000000000000000000000000000000000000000000081565b6103cc610835366004613890565b6118bc565b6103cc6108483660046137f5565b6118e1565b601054610880906bffffffffffffffffffffffff8116906c0100000000000000000000000090046001600160a01b031682565b604080516bffffffffffffffffffffffff90931683526001600160a01b03909116602083015201610370565b6103646108ba366004613b8a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600c546107a490600160781b900464ffffffffff1681565b600f546103a1906001600160a01b031681565b601154601254610921919082565b60408051928352602083019190915201610370565b6000610941826119ab565b806109505750610950826119e9565b92915050565b60606000805461096590613bb8565b80601f016020809104026020016040519081016040528092919081815260200182805461099190613bb8565b80156109de5780601f106109b3576101008083540402835291602001916109de565b820191906000526020600020905b8154815290600101906020018083116109c157829003601f168201915b5050505050905090565b60006109f382611a27565b506000908152600460205260409020546001600160a01b031690565b6000610a1a8261108c565b9050806001600160a01b0316836001600160a01b031603610aa85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b0382161480610ac45750610ac481336108ba565b610b365760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610a9f565b610b408383611a8b565b505050565b610b4f3382611b06565b610bc15760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152608401610a9f565b610b40838383611b84565b6000828152600a6020526040902060010154610be781611dc7565b610b408383611dd1565b6000610bfc8361115f565b8210610c705760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610a9f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6001600160a01b0381163314610d175760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610a9f565b610d218282611df3565b5050565b610d2e81611e15565b50565b610b40838383604051806020016040528060008152506116b5565b6000818152600e60205260409020546bffffffffffffffffffffffff1615610da0576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d2e81611f2c565b610db1611f8a565b610d218282611fdf565b600080610dc860106121af565b6000848152600e6020526040812091925090610de3906121af565b90508015610e0e578181610df5611489565b610dff9190613c08565b610e099190613c27565b610e11565b60005b949350505050565b6000818152600e6020526040812081610e338260016121f0565b9050610e1181836122fb565b6000610e4a60085490565b8210610ebe5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610a9f565b60088281548110610ed157610ed1613c49565b90600052602060002001549050919050565b610eeb611f8a565b82818114610f25576040517f568efce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610f7257610f6a868683818110610f4557610f45613c49565b90506020020135858584818110610f5e57610f5e613c49565b905060200201356123b7565b600101610f28565b505050505050565b6000610f8581611dc7565b600c54600160781b900464ffffffffff16428111610fcf576040517fecdd1c2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c805464ffffffffff42908116600160781b027fffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff91850369ffffffffffffffffffff8416026bffffffffffffffffffffffff600160a01b808604821683900390911602929092166effffffffffffffffffffffffffffff909316929092179190911790915561105e816125e4565b6040517fac02d07d013ae7c7e3ee940f8df0877c2ab1103bf87ab258ce31665f7111f09290600090a1505050565b6000818152600260205260408120546001600160a01b0316806109505760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610a9f565b60006110fc81611dc7565b600f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091556040519081527f8a1803707dfd67114623e59e8141ee8d109332da42c6c3e8212724807e140a6b906020015b60405180910390a15050565b60006001600160a01b0382166111dd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610a9f565b506001600160a01b031660009081526003602052604090205490565b7f0914bb97ca83e85ef385857d9d418f187ff630589e0c9f44db92976d8e4519cb61122381611dc7565b600d546bffffffffffffffffffffffff83111561126c576040517f35278d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600c60148282829054906101000a90046bffffffffffffffffffffffff166112959190613c5f565b82546bffffffffffffffffffffffff9182166101009390930a928302919092021990911617905550600c5460009064ffffffffff600160781b820481166a010000000000000000000090920416106112f0575080830461132a565b50600c5464ffffffffff6a010000000000000000000082048116600160781b83049091160369ffffffffffffffffffff9091160283018190045b8060000361134b576040516324d0659d60e11b815260040160405180910390fd5b600c80544284810164ffffffffff908116600160781b027fffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffffff919092166a0100000000000000000000027fffffffffffffffffffffffffffffffffff00000000000000000000000000000090931669ffffffffffffffffffff86161792909217919091161790556113da846126c5565b6040518481527fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9060200160405180910390a150505050565b600061141e81611dc7565b6202a30082111561144257604051632d0483c560e21b815260040160405180910390fd5b60138290556040518281527fa959cb2cc91580147f93f66fb85db8f308cfdaef3989ab5265408ff80ef6fa6690602001611153565b61147f611f8a565b610d2182826123b7565b600c5460009042600160781b90910464ffffffffff16106114b857600c5469ffffffffffffffffffff166114bb565b60005b69ffffffffffffffffffff16905090565b60006114d781611dc7565b600c5442600160781b90910464ffffffffff161115611522576040517f085de62500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6201000182101561154657604051632d0483c560e21b815260040160405180910390fd5b64010000000082111561156c57604051632d0483c560e21b815260040160405180910390fd5b600d8290556040518281527fbd6eb9cf4d6e2902587c57e3163aaafdb46e3b3f2086bdfa75c790228930a9d790602001611153565b6000828152600b602052604081206115b99083612737565b9392505050565b60606001805461096590613bb8565b60006115d9611f8a565b6014600081546115e890613c8f565b918290555090506115f93382612743565b61160381836123b7565b919050565b610d213383836128e9565b61161b611f8a565b610d2e8160006123b7565b61162e611f8a565b82818114611668576040517f568efce200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610f72576116ad86868381811061168857611688613c49565b905060200201358585848181106116a1576116a1613c49565b90506020020135611fdf565b60010161166b565b6116bf3383611b06565b6117315760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f766564000000000000000000000000000000000000006064820152608401610a9f565b61173d848484846129b7565b50505050565b606061174e82611a27565b600f546040517fe9dc6375000000000000000000000000000000000000000000000000000000008152306004820152602481018490526001600160a01b039091169063e9dc637590604401600060405180830381865afa1580156117b6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109509190810190613ca9565b6000818152600b6020526040812061095090612a40565b60608183111561181857604051632d0483c560e21b815260040160405180910390fd5b60006118248484613d17565b61182f906001613d2e565b905060008167ffffffffffffffff81111561184c5761184c6139f3565b604051908082528060200260200182016040528015611875578160200160208202803683370190505b5090505b8385116118b35761188a8686610bf1565b81868151811061189c5761189c613c49565b602002602001018181525050846001019450611879565b95945050505050565b6000828152600a60205260409020600101546118d781611dc7565b610b408383611df3565b6118e9611f8a565b610d2e816000611fdf565b6000828152600a602090815260408083206001600160a01b038516845290915290205460ff16610d21576000828152600a602090815260408083206001600160a01b03851684529091529020805460ff191660011790556119523390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006115b9836001600160a01b038416612a4a565b60006001600160e01b031982167f5a05180f000000000000000000000000000000000000000000000000000000001480610950575061095082612a99565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610950575061095082612ad7565b6000818152600260205260409020546001600160a01b0316610d2e5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610a9f565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190611acd8261108c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611b128361108c565b9050806001600160a01b0316846001600160a01b03161480611b5957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610e115750836001600160a01b0316611b72846109e8565b6001600160a01b031614949350505050565b826001600160a01b0316611b978261108c565b6001600160a01b031614611c135760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a9f565b6001600160a01b038216611c8e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a9f565b611c9b8383836001612b72565b826001600160a01b0316611cae8261108c565b6001600160a01b031614611d2a5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610a9f565b6000818152600460209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d2e8133612bfa565b611ddb82826118f4565b6000828152600b60205260409020610b409082611996565b611dfd8282612c6f565b6000828152600b60205260409020610b409082612cf2565b8033611e208261108c565b6001600160a01b031614611e4757604051631c62c2b160e11b815260040160405180910390fd5b6000828152600e60209081526040918290208251808401909352546bffffffffffffffffffffffff8082168085526001600160a01b036c01000000000000000000000000938490048116948601859052601080548085168490039094166bffffffffffffffffffffffff1990941684178590048216959095031690920217909155611ed184611f2c565b611ee8816bffffffffffffffffffffffff166125e4565b6000816bffffffffffffffffffffffff16857fabd2ab552bc04cdbfa4a54107fa44ac8c9cb06f6d21da11933ac05a653be19e960405160405180910390a450505050565b8033611f378261108c565b6001600160a01b031614611f5e57604051631c62c2b160e11b815260040160405180910390fd5b6000828152600e60205260408120818155600181018290556002810182905560030155610d2182612d07565b6000611f94612db7565b9050600080611fa283612e04565b915091508160116000016000828254611fbb9190613d2e565b909155505060128054829190600090611fd5908490613d2e565b9091555050505050565b8133611fea8261108c565b6001600160a01b03161461201157604051631c62c2b160e11b815260040160405180910390fd5b6000838152600e6020526040902080546bffffffffffffffffffffffff1680841115612069576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061207483612e7d565b905060006120828287613d2e565b9050806000036120a5576040516324d0659d60e11b815260040160405180910390fd5b601080546bffffffffffffffffffffffff1981166bffffffffffffffffffffffff918216899003821690811780845587546c01000000000000000000000000908190046001600160a01b039081168c8a0342818102958590048416860192909203831684029095179096559290931691169091021785557fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff600160d01b65ffffffffffff90921691820216600160a01b90910217600385015560115460018501556012546002850155612177816125e4565b8186887fabd2ab552bc04cdbfa4a54107fa44ac8c9cb06f6d21da11933ac05a653be19e960405160405180910390a450505050505050565b80546000906001600160a01b036c01000000000000000000000000820416906121e6906bffffffffffffffffffffffff1642613c08565b6109509190613d17565b60408051808201909152600080825260208201526003830154600160a01b900465ffffffffffff1660000361223957506040805180820190915260008082526020820152610950565b6001830182156122bd57600061224d612e97565b905060008061225b83612e04565b9150915060405180604001604052808560000154846011600001546122809190613d2e565b61228a9190613d17565b81526020018560010154836011600101546122a59190613d2e565b6122af9190613d17565b815250945050505050610950565b60408051808201909152815460115482916122d791613d17565b815260200182600101546011600101546122f19190613d17565b9052949350505050565b6003810154600090600160a01b900465ffffffffffff16156123ae576003820154602084015170010000000000000000000000000000000091612349916001600160a01b0390911690613c08565b8354600385015460208701516bffffffffffffffffffffffff9092169161237f91600160a01b900465ffffffffffff1690613c08565b865161238b9190613d17565b6123959190613c08565b61239f9190613d2e565b6123a99190613c27565b6115b9565b50600092915050565b81336123c28261108c565b6001600160a01b0316146123e957604051631c62c2b160e11b815260040160405180910390fd5b6000838152600e602052604081209061240182612e7d565b9050600061240f8286613d2e565b905080600003612432576040516324d0659d60e11b815260040160405180910390fd5b6010546000906124519083906bffffffffffffffffffffffff16613d2e565b90506bffffffffffffffffffffffff811115612499576040517f35278d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601080546bffffffffffffffffffffffff8381166001600160a01b036c0100000000000000000000000093849004811642808902918201831686026bffffffffffffffffffffffff19908116949094179096558954808516808a0190951693168317859004821601811690930217875560038701805480841665ffffffffffff600160a01b8304169095039092029390930190911673ffffffffffffffffffffffffffffffffffffffff1990911617905561259d8460038101805465ffffffffffff4216600160a01b027fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff9091161790556011546001820155601254600290910155565b85156125ac576125ac866126c5565b8286887fc8acfabcfb3af3df23b7b8a1aa1371d042bee71e137eeedc881ffa8f3c44626160405160405180910390a450505050505050565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044015b6020604051808303816000875af115801561266b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268f9190613d46565b610d2e576040517fbfa871c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd9060640161264c565b60006115b98383612f16565b6001600160a01b0382166127995760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a9f565b6000818152600260205260409020546001600160a01b0316156127fe5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a9f565b61280c600083836001612b72565b6000818152600260205260409020546001600160a01b0316156128715760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a9f565b6001600160a01b0382166000818152600360209081526040808320805460010190558483526002909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b03160361294a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a9f565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129c2848484611b84565b6129ce84848484612f40565b61173d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a9f565b6000610950825490565b6000818152600183016020526040812054612a9157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610950565b506000610950565b60006001600160e01b031982167f7965db0b0000000000000000000000000000000000000000000000000000000014806109505750610950826119e9565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480612b3a57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061095057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610950565b336001600160a01b03851614612bee576013546000838152600e60205260408120600301549091612bb191600160d01b900465ffffffffffff16613d2e565b9050804211612bec576040517f085de62500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61173d848484846130c9565b6000828152600a602090815260408083206001600160a01b038516845290915290205460ff16610d2157612c2d81613211565b612c38836020613223565b604051602001612c49929190613d63565b60408051601f198184030181529082905262461bcd60e51b8252610a9f916004016137e2565b6000828152600a602090815260408083206001600160a01b038516845290915290205460ff1615610d21576000828152600a602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006115b9836001600160a01b03841661344c565b6000612d128261108c565b9050612d22816000846001612b72565b612d2b8261108c565b6000838152600460209081526040808320805473ffffffffffffffffffffffffffffffffffffffff199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000612dc1612e97565b600c80547fffffffffffffffffffffffffffffffffff0000000000ffffffffffffffffffff166a01000000000000000000004264ffffffffff1602179055919050565b6000806000612e1360106121af565b90508015612e775780700100000000000000000000000000000000612e384287613c08565b612e429190613c08565b612e4c9190613c27565b925080612e6a70010000000000000000000000000000000086613c08565b612e749190613c27565b91505b50915091565b600080612e8b8360006121f0565b90506115b981846122fb565b600c54600090600160781b900464ffffffffff1681428210612eb95742612ebb565b815b600c549091506a0100000000000000000000900464ffffffffff1680821115612ef457600c5469ffffffffffffffffffff168183030293505b6bffffffffffffffffffffffff841115612f1057612f10613de4565b50505090565b6000826000018281548110612f2d57612f2d613c49565b9060005260206000200154905092915050565b60006001600160a01b0384163b156130be576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612f9d903390899088908890600401613dfa565b6020604051808303816000875af1925050508015612fd8575060408051601f3d908101601f19168201909252612fd591810190613e36565b60015b61308b573d808015613006576040519150601f19603f3d011682016040523d82523d6000602084013e61300b565b606091505b5080516000036130835760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a9f565b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050610e11565b506001949350505050565b6130d58484848461353f565b600181111561314c5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e736563757469766520747260448201527f616e7366657273206e6f7420737570706f7274656400000000000000000000006064820152608401610a9f565b816001600160a01b0385166131a8576131a381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6131cb565b836001600160a01b0316856001600160a01b0316146131cb576131cb85826135c7565b6001600160a01b0384166131e7576131e281613664565b61320a565b846001600160a01b0316846001600160a01b03161461320a5761320a8482613713565b5050505050565b60606109506001600160a01b03831660145b60606000613232836002613c08565b61323d906002613d2e565b67ffffffffffffffff811115613255576132556139f3565b6040519080825280601f01601f19166020018201604052801561327f576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106132b6576132b6613c49565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061331957613319613c49565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000613355846002613c08565b613360906001613d2e565b90505b60018111156133fd577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106133a1576133a1613c49565b1a60f81b8282815181106133b7576133b7613c49565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936133f681613e53565b9050613363565b5083156115b95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a9f565b60008181526001830160205260408120548015613535576000613470600183613d17565b855490915060009061348490600190613d17565b90508181146134e95760008660000182815481106134a4576134a4613c49565b90600052602060002001549050808760000184815481106134c7576134c7613c49565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806134fa576134fa613e6a565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610950565b6000915050610950565b600181111561173d576001600160a01b03841615613585576001600160a01b0384166000908152600360205260408120805483929061357f908490613d17565b90915550505b6001600160a01b0383161561173d576001600160a01b038316600090815260036020526040812080548392906135bc908490613d2e565b909155505050505050565b600060016135d48461115f565b6135de9190613d17565b600083815260076020526040902054909150808214613631576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061367690600190613d17565b6000838152600960205260408120546008805493945090928490811061369e5761369e613c49565b9060005260206000200154905080600883815481106136bf576136bf613c49565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806136f7576136f7613e6a565b6001900381819060005260206000200160009055905550505050565b600061371e8361115f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160e01b031981168114610d2e57600080fd5b60006020828403121561377f57600080fd5b81356115b981613757565b60005b838110156137a557818101518382015260200161378d565b8381111561173d5750506000910152565b600081518084526137ce81602086016020860161378a565b601f01601f19169290920160200192915050565b6020815260006115b960208301846137b6565b60006020828403121561380757600080fd5b5035919050565b6001600160a01b0381168114610d2e57600080fd5b6000806040838503121561383657600080fd5b82356138418161380e565b946020939093013593505050565b60008060006060848603121561386457600080fd5b833561386f8161380e565b9250602084013561387f8161380e565b929592945050506040919091013590565b600080604083850312156138a357600080fd5b8235915060208301356138b58161380e565b809150509250929050565b600080604083850312156138d357600080fd5b50508035926020909101359150565b60008083601f8401126138f457600080fd5b50813567ffffffffffffffff81111561390c57600080fd5b6020830191508360208260051b850101111561392757600080fd5b9250929050565b6000806000806040858703121561394457600080fd5b843567ffffffffffffffff8082111561395c57600080fd5b613968888389016138e2565b9096509450602087013591508082111561398157600080fd5b5061398e878288016138e2565b95989497509550505050565b6000602082840312156139ac57600080fd5b81356115b98161380e565b8015158114610d2e57600080fd5b600080604083850312156139d857600080fd5b82356139e38161380e565b915060208301356138b5816139b7565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613a3257613a326139f3565b604052919050565b600067ffffffffffffffff821115613a5457613a546139f3565b50601f01601f191660200190565b60008060008060808587031215613a7857600080fd5b8435613a838161380e565b93506020850135613a938161380e565b925060408501359150606085013567ffffffffffffffff811115613ab657600080fd5b8501601f81018713613ac757600080fd5b8035613ada613ad582613a3a565b613a09565b818152886020838501011115613aef57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080600060608486031215613b2657600080fd5b8335613b318161380e565b95602085013595506040909401359392505050565b6020808252825182820181905260009190848201906040850190845b81811015613b7e57835183529284019291840191600101613b62565b50909695505050505050565b60008060408385031215613b9d57600080fd5b8235613ba88161380e565b915060208301356138b58161380e565b600181811c90821680613bcc57607f821691505b602082108103613bec57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613c2257613c22613bf2565b500290565b600082613c4457634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60006bffffffffffffffffffffffff808316818516808303821115613c8657613c86613bf2565b01949350505050565b60006000198203613ca257613ca2613bf2565b5060010190565b600060208284031215613cbb57600080fd5b815167ffffffffffffffff811115613cd257600080fd5b8201601f81018413613ce357600080fd5b8051613cf1613ad582613a3a565b818152856020838501011115613d0657600080fd5b6118b382602083016020860161378a565b600082821015613d2957613d29613bf2565b500390565b60008219821115613d4157613d41613bf2565b500190565b600060208284031215613d5857600080fd5b81516115b9816139b7565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613d9b81601785016020880161378a565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351613dd881602884016020880161378a565b01602801949350505050565b634e487b7160e01b600052600160045260246000fd5b60006001600160a01b03808716835280861660208401525083604083015260806060830152613e2c60808301846137b6565b9695505050505050565b600060208284031215613e4857600080fd5b81516115b981613757565b600081613e6257613e62613bf2565b506000190190565b634e487b7160e01b600052603160045260246000fdfea26469706673582212208466454c916a0f0ba4c38f4e538bca6a31d10def7fc72f12df3d85267271798964736f6c634300080f0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
