{
  "_format": "hh-sol-artifact-1",
  "contractName": "TwabRewards",
  "sourceName": "@pooltogether/v4-periphery/contracts/TwabRewards.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract ITicket",
          "name": "_ticket",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "promotionId",
          "type": "uint256"
        }
      ],
      "name": "PromotionCreated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "promotionId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "PromotionDestroyed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "promotionId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "epochNumber",
          "type": "uint8"
        }
      ],
      "name": "PromotionEnded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "promotionId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "numberOfEpochs",
          "type": "uint256"
        }
      ],
      "name": "PromotionExtended",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "promotionId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint8[]",
          "name": "epochIds",
          "type": "uint8[]"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "RewardsClaimed",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "GRACE_PERIOD",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_promotionId",
          "type": "uint256"
        },
        {
          "internalType": "uint8[]",
          "name": "_epochIds",
          "type": "uint8[]"
        }
      ],
      "name": "claimRewards",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint64",
          "name": "_startTimestamp",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "_tokensPerEpoch",
          "type": "uint256"
        },
        {
          "internalType": "uint48",
          "name": "_epochDuration",
          "type": "uint48"
        },
        {
          "internalType": "uint8",
          "name": "_numberOfEpochs",
          "type": "uint8"
        }
      ],
      "name": "createPromotion",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_promotionId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        }
      ],
      "name": "destroyPromotion",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_promotionId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        }
      ],
      "name": "endPromotion",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_promotionId",
          "type": "uint256"
        },
        {
          "internalType": "uint8",
          "name": "_numberOfEpochs",
          "type": "uint8"
        }
      ],
      "name": "extendPromotion",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_promotionId",
          "type": "uint256"
        }
      ],
      "name": "getCurrentEpochId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_promotionId",
          "type": "uint256"
        }
      ],
      "name": "getPromotion",
      "outputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "creator",
              "type": "address"
            },
            {
              "internalType": "uint64",
              "name": "startTimestamp",
              "type": "uint64"
            },
            {
              "internalType": "uint8",
              "name": "numberOfEpochs",
              "type": "uint8"
            },
            {
              "internalType": "uint48",
              "name": "epochDuration",
              "type": "uint48"
            },
            {
              "internalType": "uint48",
              "name": "createdAt",
              "type": "uint48"
            },
            {
              "internalType": "contract IERC20",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "tokensPerEpoch",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "rewardsUnclaimed",
              "type": "uint256"
            }
          ],
          "internalType": "struct ITwabRewards.Promotion",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_promotionId",
          "type": "uint256"
        }
      ],
      "name": "getRemainingRewards",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_promotionId",
          "type": "uint256"
        },
        {
          "internalType": "uint8[]",
          "name": "_epochIds",
          "type": "uint8[]"
        }
      ],
      "name": "getRewardsAmount",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ticket",
      "outputs": [
        {
          "internalType": "contract ITicket",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60a06040523480156200001157600080fd5b5060405162002123380380620021238339810160408190526200003491620001c3565b6200003f8162000055565b60601b6001600160601b03191660805262000241565b6001600160a01b038116620000b15760405162461bcd60e51b815260206004820181905260248201527f54776162526577617264732f7469636b65742d6e6f742d7a65726f2d6164647260448201526064015b60405180910390fd5b60405163f77c479160e01b602082015260009081906001600160a01b0384169060240160408051601f1981840301815290829052620000f091620001ea565b600060405180830381855afa9150503d80600081146200012d576040519150601f19603f3d011682016040523d82523d6000602084013e62000132565b606091505b509150915081801562000146575060008151115b801562000170575080806020019051810190620001649190620001c3565b6001600160a01b031615155b620001be5760405162461bcd60e51b815260206004820152601a60248201527f54776162526577617264732f696e76616c69642d7469636b65740000000000006044820152606401620000a8565b505050565b600060208284031215620001d657600080fd5b8151620001e38162000228565b9392505050565b6000825160005b818110156200020d5760208186018101518583015201620001f1565b818111156200021d576000828501525b509190910192915050565b6001600160a01b03811681146200023e57600080fd5b50565b60805160601c611eb56200026e600039600081816101820152818161121a01526113720152611eb56000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c806366cfae5e11610081578063b2456c3a1161005b578063b2456c3a146101cf578063c1a287e2146101e2578063f824d0fb1461020157600080fd5b806366cfae5e1461015c5780636cc25db71461017d578063a4958845146101bc57600080fd5b8063120468a0116100b2578063120468a01461011657806314fdecca1461012957806320555db11461014957600080fd5b8063096fe668146100ce5780630b011a16146100f6575b600080fd5b6100e16100dc366004611a84565b610214565b60405190151581526020015b60405180910390f35b610109610104366004611833565b610386565b6040516100ed9190611b2c565b6100e1610124366004611a54565b6104ae565b61013c610137366004611a22565b6105eb565b6040516100ed9190611c1f565b6100e1610157366004611a54565b61063b565b61016f61016a3660046119a6565b61080b565b6040519081526020016100ed565b6101a47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100ed565b61016f6101ca366004611a22565b610c42565b61016f6101dd366004611833565b610c55565b6101ec624f1a0081565b60405163ffffffff90911681526020016100ed565b61016f61020f366004611a22565b610e00565b600061021f82610e13565b600061022a84610e69565b905061023581610fa9565b60408101516102458160ff611da8565b60ff168460ff16111561029f5760405162461bcd60e51b815260206004820152601d60248201527f54776162526577617264732f65706f6368732d6f7665722d6c696d697400000060448201526064015b60405180910390fd5b6102a98482611cfb565b600086815260208190526040812080547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b60ff9485160217905560c084015190916102fc91908716611d42565b90508060008088815260200190815260200160002060030160008282546103239190611cb7565b909155505060a0830151610342906001600160a01b0316333084611020565b60405160ff8616815286907fa9527ed49c1c2ab5449cfef5b611076ce228a0a0de4534874963b83abb6e7b469060200160405180910390a250600195945050505050565b6060600061039385610e69565b90508260008167ffffffffffffffff8111156103b1576103b1611e54565b6040519080825280602002602001820160405280156103da578160200160208202803683370190505b50905060005b828110156104a25760008881526002602090815260408083206001600160a01b038d16845290915290205460ff82161c6001908116141561044057600082828151811061042f5761042f611e3e565b602002602001018181525050610490565b610471898589898581811061045757610457611e3e565b905060200201602081019061046c9190611ab0565b6110d7565b82828151811061048357610483611e3e565b6020026020010181815250505b8061049a81611df7565b9150506103e0565b50979650505050505050565b60006001600160a01b0382166105065760405162461bcd60e51b815260206004820152601f60248201527f54776162526577617264732f70617965652d6e6f742d7a65726f2d61646472006044820152606401610296565b600061051184610e69565b905061051c81611452565b61052581610fa9565b6000610530826114ab565b600086815260208190526040812080547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b60ff85160217905590915061057b836114f7565b60a0840151909150610597906001600160a01b0316868361155b565b6040805182815260ff841660208201526001600160a01b0387169188917f98f89153fa6ee40b2edcd2e1ce4a5a9edfb2f74818016fc24e6cfe7b6fcd12a9910160405180910390a350600195945050505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915261063582610e69565b92915050565b60006001600160a01b0382166106935760405162461bcd60e51b815260206004820152601f60248201527f54776162526577617264732f70617965652d6e6f742d7a65726f2d61646472006044820152606401610296565b600061069e84610e69565b90506106a981611452565b60408101516060820151602083015160009260ff1690910265ffffffffffff160167ffffffffffffffff16608083015190915065ffffffffffff166000624f1a008284106106f757836106f9565b825b6107039190611cb7565b9050804210156107555760405162461bcd60e51b815260206004820152601f60248201527f54776162526577617264732f67726163652d706572696f642d616374697665006044820152606401610296565b60e0840151600088815260208190526040812080547fffffff000000000000000000000000000000000000000000000000000000000016815560018101829055600281018290556003015560a08501516107b9906001600160a01b0316888361155b565b866001600160a01b0316887f6f804f2ef186cd4b2a6740c084b86f557a497a1fcf3a6b073068a55c51187b6f836040516107f591815260200190565b60405180910390a3506001979650505050505050565b600080841161085c5760405162461bcd60e51b815260206004820152601b60248201527f54776162526577617264732f746f6b656e732d6e6f742d7a65726f00000000006044820152606401610296565b60008365ffffffffffff16116108b45760405162461bcd60e51b815260206004820152601d60248201527f54776162526577617264732f6475726174696f6e2d6e6f742d7a65726f0000006044820152606401610296565b6108bd82610e13565b600060015460016108ce9190611cb7565b6001819055905060006108e460ff851687611d42565b9050604051806101000160405280336001600160a01b031681526020018867ffffffffffffffff1681526020018560ff1681526020018665ffffffffffff1681526020014265ffffffffffff168152602001896001600160a01b031681526020018781526020018281525060008084815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550604082015181600001601c6101000a81548160ff021916908360ff16021790555060608201518160010160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060808201518160010160066101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a082015181600101600c6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c0820151816002015560e082015181600301559050506000886001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610ab591906001600160a01b0391909116815260200190565b60206040518083038186803b158015610acd57600080fd5b505afa158015610ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b059190611a3b565b9050610b1c6001600160a01b038a16333085611020565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038b16906370a082319060240160206040518083038186803b158015610b7757600080fd5b505afa158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf9190611a3b565b905080610bbc8484611cb7565b14610c095760405162461bcd60e51b815260206004820152601d60248201527f54776162526577617264732f70726f6d6f2d616d6f756e742d646966660000006044820152606401610296565b60405184907faedc1797e973574eb0e43205c473287ca44eb1c9d0f677dbb0ec8cfc72bb68f390600090a2509198975050505050505050565b6000610635610c5083610e69565b6114f7565b600080610c6185610e69565b60008681526002602090815260408083206001600160a01b038b1684529091528120549192509084825b81811015610d4d576000888883818110610ca757610ca7611e3e565b9050602002016020810190610cbc9190611ab0565b9050600160ff821685901c81161415610d175760405162461bcd60e51b815260206004820152601b60248201527f54776162526577617264732f726577617264732d636c61696d656400000000006044820152606401610296565b610d228b87836110d7565b610d2c9086611cb7565b9450600160ff82161b84179350508080610d4590611df7565b915050610c8b565b5060008881526002602090815260408083206001600160a01b038d16845282528083208590558a83529082905281206003018054859290610d8f908490611d91565b909155505060a0840151610dad906001600160a01b03168a8561155b565b886001600160a01b0316887f446a5bb69110f4fa9a5802e85237a4281d1d27dbe989b22da4a75d9deae8c778898987604051610deb93929190611b9e565b60405180910390a35090979650505050505050565b6000610635610e0e83610e69565b6114ab565b60008160ff1611610e665760405162461bcd60e51b815260206004820152601b60248201527f54776162526577617264732f65706f6368732d6e6f742d7a65726f00000000006044820152606401610296565b50565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091526000828152602081815260409182902082516101008101845281546001600160a01b0380821680845274010000000000000000000000000000000000000000830467ffffffffffffffff1695840195909552600160e01b90910460ff1694820194909452600182015465ffffffffffff8082166060840152660100000000000082041660808301526c01000000000000000000000000900490931660a0840152600281015460c08401526003015460e08301526106355760405162461bcd60e51b815260206004820152601d60248201527f54776162526577617264732f696e76616c69642d70726f6d6f74696f6e0000006044820152606401610296565b604081015160608201516020830151429260ff1690910265ffffffffffff160167ffffffffffffffff1611610e665760405162461bcd60e51b815260206004820152601e60248201527f54776162526577617264732f70726f6d6f74696f6e2d696e61637469766500006044820152606401610296565b6040516001600160a01b03808516602483015283166044820152606481018290526110d19085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526115a9565b50505050565b606082015160009065ffffffffffff16816110f560ff851683611d61565b85602001516111049190611ccf565b905060006111128383611ccf565b90508067ffffffffffffffff1642101561116e5760405162461bcd60e51b815260206004820152601a60248201527f54776162526577617264732f65706f63682d6e6f742d6f7665720000000000006044820152606401610296565b856040015160ff168560ff16106111c75760405162461bcd60e51b815260206004820152601c60248201527f54776162526577617264732f696e76616c69642d65706f63682d6964000000006044820152606401610296565b6040517f98b16f360000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015267ffffffffffffffff8085166024840152831660448301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906398b16f369060640160206040518083038186803b15801561125e57600080fd5b505afa158015611272573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112969190611a3b565b90508015611442576040805160018082528183019092526000916020808301908036833701905050905083816000815181106112d4576112d4611e3e565b67ffffffffffffffff9290921660209283029190910190910152604080516001808252818301909252600091816020016020820280368337019050509050838160008151811061132657611326611e3e565b67ffffffffffffffff909216602092830291909101909101526040517f8e6d536a0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638e6d536a906113a99086908690600401611b70565b60006040518083038186803b1580156113c157600080fd5b505afa1580156113d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113fd91908101906118bf565b60008151811061140f5761140f611e3e565b6020026020010151905080848b60c0015161142a9190611d42565b6114349190611d20565b97505050505050505061144b565b60009450505050505b9392505050565b80516001600160a01b03163314610e665760405162461bcd60e51b815260206004820152601e60248201527f54776162526577617264732f6f6e6c792d70726f6d6f2d63726561746f7200006044820152606401610296565b600080826020015167ffffffffffffffff1642111561063557826060015165ffffffffffff16836020015167ffffffffffffffff164203816114ef576114ef611e28565b049392505050565b60408101516060820151602083015160009260ff1690910265ffffffffffff160167ffffffffffffffff1642111561153157506000919050565b61153a826114ab565b826040015160ff1661154c9190611d91565b8260c001516106359190611d42565b6040516001600160a01b0383166024820152604481018290526115a49084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161106d565b505050565b60006115fe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661168e9092919063ffffffff16565b8051909150156115a4578080602001905181019061161c9190611984565b6115a45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610296565b606061169d84846000856116a5565b949350505050565b60608247101561171d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610296565b843b61176b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610296565b600080866001600160a01b031685876040516117879190611b10565b60006040518083038185875af1925050503d80600081146117c4576040519150601f19603f3d011682016040523d82523d6000602084013e6117c9565b606091505b50915091506117d98282866117e4565b979650505050505050565b606083156117f357508161144b565b8251156118035782518084602001fd5b8160405162461bcd60e51b81526004016102969190611bec565b803560ff8116811461182e57600080fd5b919050565b6000806000806060858703121561184957600080fd5b843561185481611e6a565b935060208501359250604085013567ffffffffffffffff8082111561187857600080fd5b818701915087601f83011261188c57600080fd5b81358181111561189b57600080fd5b8860208260051b85010111156118b057600080fd5b95989497505060200194505050565b600060208083850312156118d257600080fd5b825167ffffffffffffffff808211156118ea57600080fd5b818501915085601f8301126118fe57600080fd5b81518181111561191057611910611e54565b8060051b604051601f19603f8301168101818110858211171561193557611935611e54565b604052828152858101935084860182860187018a101561195457600080fd5b600095505b83861015611977578051855260019590950194938601938601611959565b5098975050505050505050565b60006020828403121561199657600080fd5b8151801515811461144b57600080fd5b600080600080600060a086880312156119be57600080fd5b85356119c981611e6a565b9450602086013567ffffffffffffffff811681146119e657600080fd5b935060408601359250606086013565ffffffffffff81168114611a0857600080fd5b9150611a166080870161181d565b90509295509295909350565b600060208284031215611a3457600080fd5b5035919050565b600060208284031215611a4d57600080fd5b5051919050565b60008060408385031215611a6757600080fd5b823591506020830135611a7981611e6a565b809150509250929050565b60008060408385031215611a9757600080fd5b82359150611aa76020840161181d565b90509250929050565b600060208284031215611ac257600080fd5b61144b8261181d565b600081518084526020808501945080840160005b83811015611b0557815167ffffffffffffffff1687529582019590820190600101611adf565b509495945050505050565b60008251611b22818460208701611dcb565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b81811015611b6457835183529284019291840191600101611b48565b50909695505050505050565b604081526000611b836040830185611acb565b8281036020840152611b958185611acb565b95945050505050565b6040808252810183905260008460608301825b86811015611bd95760ff611bc48461181d565b16825260209283019290910190600101611bb1565b5060209390930193909352509392505050565b6020815260008251806020840152611c0b816040850160208701611dcb565b601f01601f19169190910160400192915050565b6000610100820190506001600160a01b03835116825267ffffffffffffffff602084015116602083015260ff604084015116604083015265ffffffffffff60608401511660608301526080830151611c81608084018265ffffffffffff169052565b5060a0830151611c9c60a08401826001600160a01b03169052565b5060c083015160c083015260e083015160e083015292915050565b60008219821115611cca57611cca611e12565b500190565b600067ffffffffffffffff808316818516808303821115611cf257611cf2611e12565b01949350505050565b600060ff821660ff84168060ff03821115611d1857611d18611e12565b019392505050565b600082611d3d57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611d5c57611d5c611e12565b500290565b600067ffffffffffffffff80831681851681830481118215151615611d8857611d88611e12565b02949350505050565b600082821015611da357611da3611e12565b500390565b600060ff821660ff841680821015611dc257611dc2611e12565b90039392505050565b60005b83811015611de6578181015183820152602001611dce565b838111156110d15750506000910152565b6000600019821415611e0b57611e0b611e12565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e6657600080fdfea264697066735822122093aebe8126842f77adfcf2f93bf5a68a510897332a4a90f97601a16656e11e6a64736f6c63430008060033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c806366cfae5e11610081578063b2456c3a1161005b578063b2456c3a146101cf578063c1a287e2146101e2578063f824d0fb1461020157600080fd5b806366cfae5e1461015c5780636cc25db71461017d578063a4958845146101bc57600080fd5b8063120468a0116100b2578063120468a01461011657806314fdecca1461012957806320555db11461014957600080fd5b8063096fe668146100ce5780630b011a16146100f6575b600080fd5b6100e16100dc366004611a84565b610214565b60405190151581526020015b60405180910390f35b610109610104366004611833565b610386565b6040516100ed9190611b2c565b6100e1610124366004611a54565b6104ae565b61013c610137366004611a22565b6105eb565b6040516100ed9190611c1f565b6100e1610157366004611a54565b61063b565b61016f61016a3660046119a6565b61080b565b6040519081526020016100ed565b6101a47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100ed565b61016f6101ca366004611a22565b610c42565b61016f6101dd366004611833565b610c55565b6101ec624f1a0081565b60405163ffffffff90911681526020016100ed565b61016f61020f366004611a22565b610e00565b600061021f82610e13565b600061022a84610e69565b905061023581610fa9565b60408101516102458160ff611da8565b60ff168460ff16111561029f5760405162461bcd60e51b815260206004820152601d60248201527f54776162526577617264732f65706f6368732d6f7665722d6c696d697400000060448201526064015b60405180910390fd5b6102a98482611cfb565b600086815260208190526040812080547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b60ff9485160217905560c084015190916102fc91908716611d42565b90508060008088815260200190815260200160002060030160008282546103239190611cb7565b909155505060a0830151610342906001600160a01b0316333084611020565b60405160ff8616815286907fa9527ed49c1c2ab5449cfef5b611076ce228a0a0de4534874963b83abb6e7b469060200160405180910390a250600195945050505050565b6060600061039385610e69565b90508260008167ffffffffffffffff8111156103b1576103b1611e54565b6040519080825280602002602001820160405280156103da578160200160208202803683370190505b50905060005b828110156104a25760008881526002602090815260408083206001600160a01b038d16845290915290205460ff82161c6001908116141561044057600082828151811061042f5761042f611e3e565b602002602001018181525050610490565b610471898589898581811061045757610457611e3e565b905060200201602081019061046c9190611ab0565b6110d7565b82828151811061048357610483611e3e565b6020026020010181815250505b8061049a81611df7565b9150506103e0565b50979650505050505050565b60006001600160a01b0382166105065760405162461bcd60e51b815260206004820152601f60248201527f54776162526577617264732f70617965652d6e6f742d7a65726f2d61646472006044820152606401610296565b600061051184610e69565b905061051c81611452565b61052581610fa9565b6000610530826114ab565b600086815260208190526040812080547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b60ff85160217905590915061057b836114f7565b60a0840151909150610597906001600160a01b0316868361155b565b6040805182815260ff841660208201526001600160a01b0387169188917f98f89153fa6ee40b2edcd2e1ce4a5a9edfb2f74818016fc24e6cfe7b6fcd12a9910160405180910390a350600195945050505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915261063582610e69565b92915050565b60006001600160a01b0382166106935760405162461bcd60e51b815260206004820152601f60248201527f54776162526577617264732f70617965652d6e6f742d7a65726f2d61646472006044820152606401610296565b600061069e84610e69565b90506106a981611452565b60408101516060820151602083015160009260ff1690910265ffffffffffff160167ffffffffffffffff16608083015190915065ffffffffffff166000624f1a008284106106f757836106f9565b825b6107039190611cb7565b9050804210156107555760405162461bcd60e51b815260206004820152601f60248201527f54776162526577617264732f67726163652d706572696f642d616374697665006044820152606401610296565b60e0840151600088815260208190526040812080547fffffff000000000000000000000000000000000000000000000000000000000016815560018101829055600281018290556003015560a08501516107b9906001600160a01b0316888361155b565b866001600160a01b0316887f6f804f2ef186cd4b2a6740c084b86f557a497a1fcf3a6b073068a55c51187b6f836040516107f591815260200190565b60405180910390a3506001979650505050505050565b600080841161085c5760405162461bcd60e51b815260206004820152601b60248201527f54776162526577617264732f746f6b656e732d6e6f742d7a65726f00000000006044820152606401610296565b60008365ffffffffffff16116108b45760405162461bcd60e51b815260206004820152601d60248201527f54776162526577617264732f6475726174696f6e2d6e6f742d7a65726f0000006044820152606401610296565b6108bd82610e13565b600060015460016108ce9190611cb7565b6001819055905060006108e460ff851687611d42565b9050604051806101000160405280336001600160a01b031681526020018867ffffffffffffffff1681526020018560ff1681526020018665ffffffffffff1681526020014265ffffffffffff168152602001896001600160a01b031681526020018781526020018281525060008084815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550604082015181600001601c6101000a81548160ff021916908360ff16021790555060608201518160010160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060808201518160010160066101000a81548165ffffffffffff021916908365ffffffffffff16021790555060a082015181600101600c6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060c0820151816002015560e082015181600301559050506000886001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610ab591906001600160a01b0391909116815260200190565b60206040518083038186803b158015610acd57600080fd5b505afa158015610ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b059190611a3b565b9050610b1c6001600160a01b038a16333085611020565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038b16906370a082319060240160206040518083038186803b158015610b7757600080fd5b505afa158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf9190611a3b565b905080610bbc8484611cb7565b14610c095760405162461bcd60e51b815260206004820152601d60248201527f54776162526577617264732f70726f6d6f2d616d6f756e742d646966660000006044820152606401610296565b60405184907faedc1797e973574eb0e43205c473287ca44eb1c9d0f677dbb0ec8cfc72bb68f390600090a2509198975050505050505050565b6000610635610c5083610e69565b6114f7565b600080610c6185610e69565b60008681526002602090815260408083206001600160a01b038b1684529091528120549192509084825b81811015610d4d576000888883818110610ca757610ca7611e3e565b9050602002016020810190610cbc9190611ab0565b9050600160ff821685901c81161415610d175760405162461bcd60e51b815260206004820152601b60248201527f54776162526577617264732f726577617264732d636c61696d656400000000006044820152606401610296565b610d228b87836110d7565b610d2c9086611cb7565b9450600160ff82161b84179350508080610d4590611df7565b915050610c8b565b5060008881526002602090815260408083206001600160a01b038d16845282528083208590558a83529082905281206003018054859290610d8f908490611d91565b909155505060a0840151610dad906001600160a01b03168a8561155b565b886001600160a01b0316887f446a5bb69110f4fa9a5802e85237a4281d1d27dbe989b22da4a75d9deae8c778898987604051610deb93929190611b9e565b60405180910390a35090979650505050505050565b6000610635610e0e83610e69565b6114ab565b60008160ff1611610e665760405162461bcd60e51b815260206004820152601b60248201527f54776162526577617264732f65706f6368732d6e6f742d7a65726f00000000006044820152606401610296565b50565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091526000828152602081815260409182902082516101008101845281546001600160a01b0380821680845274010000000000000000000000000000000000000000830467ffffffffffffffff1695840195909552600160e01b90910460ff1694820194909452600182015465ffffffffffff8082166060840152660100000000000082041660808301526c01000000000000000000000000900490931660a0840152600281015460c08401526003015460e08301526106355760405162461bcd60e51b815260206004820152601d60248201527f54776162526577617264732f696e76616c69642d70726f6d6f74696f6e0000006044820152606401610296565b604081015160608201516020830151429260ff1690910265ffffffffffff160167ffffffffffffffff1611610e665760405162461bcd60e51b815260206004820152601e60248201527f54776162526577617264732f70726f6d6f74696f6e2d696e61637469766500006044820152606401610296565b6040516001600160a01b03808516602483015283166044820152606481018290526110d19085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526115a9565b50505050565b606082015160009065ffffffffffff16816110f560ff851683611d61565b85602001516111049190611ccf565b905060006111128383611ccf565b90508067ffffffffffffffff1642101561116e5760405162461bcd60e51b815260206004820152601a60248201527f54776162526577617264732f65706f63682d6e6f742d6f7665720000000000006044820152606401610296565b856040015160ff168560ff16106111c75760405162461bcd60e51b815260206004820152601c60248201527f54776162526577617264732f696e76616c69642d65706f63682d6964000000006044820152606401610296565b6040517f98b16f360000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015267ffffffffffffffff8085166024840152831660448301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906398b16f369060640160206040518083038186803b15801561125e57600080fd5b505afa158015611272573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112969190611a3b565b90508015611442576040805160018082528183019092526000916020808301908036833701905050905083816000815181106112d4576112d4611e3e565b67ffffffffffffffff9290921660209283029190910190910152604080516001808252818301909252600091816020016020820280368337019050509050838160008151811061132657611326611e3e565b67ffffffffffffffff909216602092830291909101909101526040517f8e6d536a0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638e6d536a906113a99086908690600401611b70565b60006040518083038186803b1580156113c157600080fd5b505afa1580156113d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113fd91908101906118bf565b60008151811061140f5761140f611e3e565b6020026020010151905080848b60c0015161142a9190611d42565b6114349190611d20565b97505050505050505061144b565b60009450505050505b9392505050565b80516001600160a01b03163314610e665760405162461bcd60e51b815260206004820152601e60248201527f54776162526577617264732f6f6e6c792d70726f6d6f2d63726561746f7200006044820152606401610296565b600080826020015167ffffffffffffffff1642111561063557826060015165ffffffffffff16836020015167ffffffffffffffff164203816114ef576114ef611e28565b049392505050565b60408101516060820151602083015160009260ff1690910265ffffffffffff160167ffffffffffffffff1642111561153157506000919050565b61153a826114ab565b826040015160ff1661154c9190611d91565b8260c001516106359190611d42565b6040516001600160a01b0383166024820152604481018290526115a49084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161106d565b505050565b60006115fe826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661168e9092919063ffffffff16565b8051909150156115a4578080602001905181019061161c9190611984565b6115a45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610296565b606061169d84846000856116a5565b949350505050565b60608247101561171d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610296565b843b61176b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610296565b600080866001600160a01b031685876040516117879190611b10565b60006040518083038185875af1925050503d80600081146117c4576040519150601f19603f3d011682016040523d82523d6000602084013e6117c9565b606091505b50915091506117d98282866117e4565b979650505050505050565b606083156117f357508161144b565b8251156118035782518084602001fd5b8160405162461bcd60e51b81526004016102969190611bec565b803560ff8116811461182e57600080fd5b919050565b6000806000806060858703121561184957600080fd5b843561185481611e6a565b935060208501359250604085013567ffffffffffffffff8082111561187857600080fd5b818701915087601f83011261188c57600080fd5b81358181111561189b57600080fd5b8860208260051b85010111156118b057600080fd5b95989497505060200194505050565b600060208083850312156118d257600080fd5b825167ffffffffffffffff808211156118ea57600080fd5b818501915085601f8301126118fe57600080fd5b81518181111561191057611910611e54565b8060051b604051601f19603f8301168101818110858211171561193557611935611e54565b604052828152858101935084860182860187018a101561195457600080fd5b600095505b83861015611977578051855260019590950194938601938601611959565b5098975050505050505050565b60006020828403121561199657600080fd5b8151801515811461144b57600080fd5b600080600080600060a086880312156119be57600080fd5b85356119c981611e6a565b9450602086013567ffffffffffffffff811681146119e657600080fd5b935060408601359250606086013565ffffffffffff81168114611a0857600080fd5b9150611a166080870161181d565b90509295509295909350565b600060208284031215611a3457600080fd5b5035919050565b600060208284031215611a4d57600080fd5b5051919050565b60008060408385031215611a6757600080fd5b823591506020830135611a7981611e6a565b809150509250929050565b60008060408385031215611a9757600080fd5b82359150611aa76020840161181d565b90509250929050565b600060208284031215611ac257600080fd5b61144b8261181d565b600081518084526020808501945080840160005b83811015611b0557815167ffffffffffffffff1687529582019590820190600101611adf565b509495945050505050565b60008251611b22818460208701611dcb565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b81811015611b6457835183529284019291840191600101611b48565b50909695505050505050565b604081526000611b836040830185611acb565b8281036020840152611b958185611acb565b95945050505050565b6040808252810183905260008460608301825b86811015611bd95760ff611bc48461181d565b16825260209283019290910190600101611bb1565b5060209390930193909352509392505050565b6020815260008251806020840152611c0b816040850160208701611dcb565b601f01601f19169190910160400192915050565b6000610100820190506001600160a01b03835116825267ffffffffffffffff602084015116602083015260ff604084015116604083015265ffffffffffff60608401511660608301526080830151611c81608084018265ffffffffffff169052565b5060a0830151611c9c60a08401826001600160a01b03169052565b5060c083015160c083015260e083015160e083015292915050565b60008219821115611cca57611cca611e12565b500190565b600067ffffffffffffffff808316818516808303821115611cf257611cf2611e12565b01949350505050565b600060ff821660ff84168060ff03821115611d1857611d18611e12565b019392505050565b600082611d3d57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611d5c57611d5c611e12565b500290565b600067ffffffffffffffff80831681851681830481118215151615611d8857611d88611e12565b02949350505050565b600082821015611da357611da3611e12565b500390565b600060ff821660ff841680821015611dc257611dc2611e12565b90039392505050565b60005b83811015611de6578181015183820152602001611dce565b838111156110d15750506000910152565b6000600019821415611e0b57611e0b611e12565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e6657600080fdfea264697066735822122093aebe8126842f77adfcf2f93bf5a68a510897332a4a90f97601a16656e11e6a64736f6c63430008060033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
