{
  "_format": "hh-sol-artifact-1",
  "contractName": "TwabLibExposed",
  "sourceName": "contracts/test/TwabLibraryExposed.sol",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint208",
              "name": "balance",
              "type": "uint208"
            },
            {
              "internalType": "uint24",
              "name": "nextTwabIndex",
              "type": "uint24"
            },
            {
              "internalType": "uint24",
              "name": "cardinality",
              "type": "uint24"
            }
          ],
          "indexed": false,
          "internalType": "struct TwabLib.AccountDetails",
          "name": "accountDetails",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint224",
              "name": "amount",
              "type": "uint224"
            },
            {
              "internalType": "uint32",
              "name": "timestamp",
              "type": "uint32"
            }
          ],
          "indexed": false,
          "internalType": "struct ObservationLib.Observation",
          "name": "twab",
          "type": "tuple"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "isNew",
          "type": "bool"
        }
      ],
      "name": "Updated",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "MAX_CARDINALITY",
      "outputs": [
        {
          "internalType": "uint24",
          "name": "",
          "type": "uint24"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "string",
          "name": "_revertMessage",
          "type": "string"
        },
        {
          "internalType": "uint32",
          "name": "_currentTime",
          "type": "uint32"
        }
      ],
      "name": "decreaseBalance",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint208",
              "name": "balance",
              "type": "uint208"
            },
            {
              "internalType": "uint24",
              "name": "nextTwabIndex",
              "type": "uint24"
            },
            {
              "internalType": "uint24",
              "name": "cardinality",
              "type": "uint24"
            }
          ],
          "internalType": "struct TwabLib.AccountDetails",
          "name": "accountDetails",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint224",
              "name": "amount",
              "type": "uint224"
            },
            {
              "internalType": "uint32",
              "name": "timestamp",
              "type": "uint32"
            }
          ],
          "internalType": "struct ObservationLib.Observation",
          "name": "twab",
          "type": "tuple"
        },
        {
          "internalType": "bool",
          "name": "isNew",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "details",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint208",
              "name": "balance",
              "type": "uint208"
            },
            {
              "internalType": "uint24",
              "name": "nextTwabIndex",
              "type": "uint24"
            },
            {
              "internalType": "uint24",
              "name": "cardinality",
              "type": "uint24"
            }
          ],
          "internalType": "struct TwabLib.AccountDetails",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_startTime",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "_endTime",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "_currentTime",
          "type": "uint32"
        }
      ],
      "name": "getAverageBalanceBetween",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_target",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "_currentTime",
          "type": "uint32"
        }
      ],
      "name": "getBalanceAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "_currentTime",
          "type": "uint32"
        }
      ],
      "name": "increaseBalance",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint208",
              "name": "balance",
              "type": "uint208"
            },
            {
              "internalType": "uint24",
              "name": "nextTwabIndex",
              "type": "uint24"
            },
            {
              "internalType": "uint24",
              "name": "cardinality",
              "type": "uint24"
            }
          ],
          "internalType": "struct TwabLib.AccountDetails",
          "name": "accountDetails",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint224",
              "name": "amount",
              "type": "uint224"
            },
            {
              "internalType": "uint32",
              "name": "timestamp",
              "type": "uint32"
            }
          ],
          "internalType": "struct ObservationLib.Observation",
          "name": "twab",
          "type": "tuple"
        },
        {
          "internalType": "bool",
          "name": "isNew",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "newestTwab",
      "outputs": [
        {
          "internalType": "uint24",
          "name": "index",
          "type": "uint24"
        },
        {
          "components": [
            {
              "internalType": "uint224",
              "name": "amount",
              "type": "uint224"
            },
            {
              "internalType": "uint32",
              "name": "timestamp",
              "type": "uint32"
            }
          ],
          "internalType": "struct ObservationLib.Observation",
          "name": "twab",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oldestTwab",
      "outputs": [
        {
          "internalType": "uint24",
          "name": "index",
          "type": "uint24"
        },
        {
          "components": [
            {
              "internalType": "uint224",
              "name": "amount",
              "type": "uint224"
            },
            {
              "internalType": "uint32",
              "name": "timestamp",
              "type": "uint32"
            }
          ],
          "internalType": "struct ObservationLib.Observation",
          "name": "twab",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint208",
              "name": "balance",
              "type": "uint208"
            },
            {
              "internalType": "uint24",
              "name": "nextTwabIndex",
              "type": "uint24"
            },
            {
              "internalType": "uint24",
              "name": "cardinality",
              "type": "uint24"
            }
          ],
          "internalType": "struct TwabLib.AccountDetails",
          "name": "_accountDetails",
          "type": "tuple"
        }
      ],
      "name": "push",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint208",
              "name": "balance",
              "type": "uint208"
            },
            {
              "internalType": "uint24",
              "name": "nextTwabIndex",
              "type": "uint24"
            },
            {
              "internalType": "uint24",
              "name": "cardinality",
              "type": "uint24"
            }
          ],
          "internalType": "struct TwabLib.AccountDetails",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "twabs",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint224",
              "name": "amount",
              "type": "uint224"
            },
            {
              "internalType": "uint32",
              "name": "timestamp",
              "type": "uint32"
            }
          ],
          "internalType": "struct ObservationLib.Observation[]",
          "name": "",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b506118d4806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80637c2014c6116100765780638ca0b7711161005b5780638ca0b771146101ca578063c3c191fd146101df578063ff429279146101f257600080fd5b80637c2014c61461018a5780638200d873146101ac57600080fd5b8063565974d3116100a7578063565974d3146101025780636126af6e1461016157806363ee94761461018257600080fd5b806339095bcb146100c35780633c4e9c1e146100ec575b600080fd5b6100d66100d136600461131f565b610205565b6040516100e39190611593565b60405180910390f35b6100f4610231565b6040516100e392919061162e565b6100d6604080516060810182526000808252602082018190529181019190915250604080516060810182526000546001600160d01b038116825262ffffff600160d01b820481166020840152600160e81b909104169181019190915290565b61017461016f36600461149e565b610297565b6040519081526020016100e3565b6100f46102ec565b61019d610198366004611399565b61034a565b6040516100e3939291906115c9565b6101b662ffffff81565b60405162ffffff90911681526020016100e3565b6101d2610456565b6040516100e391906114d8565b6101746101ed366004611474565b61054e565b61019d610200366004611448565b610598565b604080516060810182526000808252602082018190529181019190915261022b826106a1565b92915050565b6040805180820190915260008082526020820181905290604080516060810182526000546001600160d01b038116825262ffffff600160d01b820481166020840152600160e81b909104169181019190915261028f9060019061070a565b915091509091565b60408051606081018252600080546001600160d01b038116835262ffffff600160d01b820481166020850152600160e81b90910416928201929092526102e29060019086868661078a565b90505b9392505050565b6040805180820190915260008082526020820181905290604080516060810182526000546001600160d01b038116825262ffffff600160d01b820481166020840152600160e81b909104169181019190915261028f906001906107c2565b60408051606081018252600080825260208201819052918101919091526040805180820190915260008082526020820152600061038a600087878761083f565b82516000805460208601516040808801516001600160d01b039095167fffffff000000000000000000000000000000000000000000000000000000000090931692909217600160d01b62ffffff92831602177cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e81b91909416029290921790555192955090935091507f883fc20cc248074e2c1dd4a19bf6d2004d023d0be047378761fd6925810f381a90610445908590859085906115c9565b60405180910390a193509350939050565b6000805460609190600160e81b900462ffffff1667ffffffffffffffff81111561048257610482611888565b6040519080825280602002602001820160405280156104c757816020015b60408051808201909152600080825260208201528152602001906001900390816104a05790505b50905060005b81518110156105485760018162ffffff81106104eb576104eb611872565b604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff166020820152825183908390811061052a5761052a611872565b60200260200101819052508080610540906117f9565b9150506104cd565b50919050565b60408051606081018252600080546001600160d01b038116835262ffffff600160d01b820481166020850152600160e81b90910416928201929092526102e5906001908585610926565b6040805160608101825260008082526020820181905291810191909152604080518082019091526000808252602082015260006105d76000868661095e565b82516000805460208601516040808801516001600160d01b039095167fffffff000000000000000000000000000000000000000000000000000000000090931692909217600160d01b62ffffff92831602177cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e81b91909416029290921790555192955090935091507f883fc20cc248074e2c1dd4a19bf6d2004d023d0be047378761fd6925810f381a90610692908590859085906115c9565b60405180910390a19250925092565b604080516060810182526000808252602080830182905292820152908201516106d19062ffffff90811690610a07565b62ffffff9081166020840152604083015181161015610706576001826040018181516106fd91906116de565b62ffffff169052505b5090565b6040805180820190915260008082526020820181905290610739836020015162ffffff1662ffffff8016610a1d565b9150838262ffffff1662ffffff811061075457610754611872565b604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff166020820152919491935090915050565b6000808263ffffffff168463ffffffff16116107a657836107a8565b825b90506107b78787878487610a45565b979650505050505050565b604080518082019091526000808252602082018190529082602001519150838262ffffff1662ffffff81106107f9576107f9611872565b604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff166020820181905290915061083857600091508382610754565b9250929050565b604080516060810182526000808252602082018190529181019190915260408051808201909152600080825260208201526040805160608101825287546001600160d01b0380821680845262ffffff600160d01b840481166020860152600160e81b90930490921693830193909352600092879190891611156108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef919061153e565b60405180910390fd5b50610907886001018287610ae1565b8251999099036001600160d01b03168252909990985095505050505050565b6000808263ffffffff168463ffffffff16116109425783610944565b825b905061095286868386610bc8565b9150505b949350505050565b604080516060810182526000808252602082018190529181019190915260408051808201909152600080825260208201526040805160608101825286546001600160d01b038116825262ffffff600160d01b820481166020840152600160e81b90910416918101919091526000906109da600188018287610ae1565b835192965090945092506109ef908790611691565b6001600160d01b031684525091959094509092509050565b60006102e5610a178460016116fc565b83610ce1565b600081610a2c5750600061022b565b6102e56001610a3b84866116fc565b610a1791906117c5565b6000806000610a5488886107c2565b91509150600080610a658a8a61070a565b915091506000610a7b8b8b8487878a8f8e610ced565b90506000610a8f8c8c8588888b8f8f610ced565b9050610aa4816020015183602001518a610e37565b63ffffffff1682600001518260000151610abe919061179d565b610ac89190611734565b6001600160e01b03169c9b505050505050505050505050565b60408051606081018252600080825260208201819052918101919091526040805180820190915260008082526020820152600080610b1f878761070a565b9150508463ffffffff16816020015163ffffffff161415610b4857859350915060009050610bbf565b6000610b628288600001516001600160d01b031688610f0b565b90508088886020015162ffffff1662ffffff8110610b8257610b82611872565b825160209093015163ffffffff16600160e01b026001600160e01b03909316929092179101556000610bb3886106a1565b95509093506001925050505b93509350939050565b604080518082019091526000808252602082018190529081906040805180820190915260008082526020820152610bff888861070a565b60208101519194509150610c209063ffffffff9081169088908890610f8616565b15610c3b57505084516001600160d01b031691506109569050565b6000610c4789896107c2565b6020810151909350909150610c689063ffffffff808a169190899061105716565b15610c7a576000945050505050610956565b610c8c8985838a8c604001518b611126565b8094508193505050610ca78360200151836020015188610e37565b63ffffffff1682600001518460000151610cc1919061179d565b610ccb9190611734565b6001600160e01b03169998505050505050505050565b60006102e58284611832565b6040805180820190915260008082526020820152610d208383896020015163ffffffff166110579092919063ffffffff16565b15610d4457610d3d8789600001516001600160d01b031685610f0b565b9050610e2b565b8263ffffffff16876020015163ffffffff161415610d63575085610e2b565b8263ffffffff16866020015163ffffffff161415610d82575084610e2b565b610da18660200151838563ffffffff166110579092919063ffffffff16565b15610dc65750604080518082019091526000815263ffffffff83166020820152610e2b565b600080610ddb8b8888888e6040015189611126565b915091506000610df48260200151846020015187610e37565b63ffffffff1683600001518360000151610e0e919061179d565b610e189190611734565b9050610e25838288610f0b565b93505050505b98975050505050505050565b60008163ffffffff168463ffffffff1611158015610e6157508163ffffffff168363ffffffff1611155b15610e7757610e7083856117dc565b90506102e5565b60008263ffffffff168563ffffffff1611610ea657610ea163ffffffff8616640100000000611714565b610eae565b8463ffffffff165b64ffffffffff16905060008363ffffffff168563ffffffff1611610ee657610ee163ffffffff8616640100000000611714565b610eee565b8463ffffffff165b64ffffffffff169050610f0181836117c5565b9695505050505050565b60408051808201909152600080825260208201526040518060400160405280610f498660200151858663ffffffff16610e379092919063ffffffff16565b610f599063ffffffff168661176e565b8651610f6591906116bc565b6001600160e01b031681526020018363ffffffff1681525090509392505050565b60008163ffffffff168463ffffffff1611158015610fb057508163ffffffff168363ffffffff1611155b15610fcc578263ffffffff168463ffffffff16111590506102e5565b60008263ffffffff168563ffffffff1611610ffb57610ff663ffffffff8616640100000000611714565b611003565b8463ffffffff165b64ffffffffff16905060008363ffffffff168563ffffffff161161103b5761103663ffffffff8616640100000000611714565b611043565b8463ffffffff165b64ffffffffff169091111595945050505050565b60008163ffffffff168463ffffffff161115801561108157508163ffffffff168363ffffffff1611155b1561109c578263ffffffff168463ffffffff161090506102e5565b60008263ffffffff168563ffffffff16116110cb576110c663ffffffff8616640100000000611714565b6110d3565b8463ffffffff165b64ffffffffff16905060008363ffffffff168563ffffffff161161110b5761110663ffffffff8616640100000000611714565b611113565b8463ffffffff165b64ffffffffff1690911095945050505050565b6040805180820190915260008082526020820152604080518082019091526000808252602082015260008662ffffff1690506000818962ffffff1610611171578862ffffff1661118c565b600161118262ffffff8816846116fc565b61118c91906117c5565b905060005b600261119d83856116fc565b6111a7919061175a565b90508a6111b9828962ffffff16610ce1565b62ffffff1662ffffff81106111d0576111d0611872565b604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff166020820181905290955080611218576112108260016116fc565b935050611191565b8b611228838a62ffffff16610a07565b62ffffff1662ffffff811061123f5761123f611872565b604080518082019091529101546001600160e01b038116825263ffffffff600160e01b9091048116602083015290955060009061128490838116908c908b90610f8616565b90508080156112ad57506112ad8660200151898c63ffffffff16610f869092919063ffffffff16565b156112b95750506112e5565b806112d0576112c96001846117c5565b93506112de565b6112db8360016116fc565b94505b5050611191565b505050965096945050505050565b803562ffffff8116811461130657600080fd5b919050565b803563ffffffff8116811461130657600080fd5b60006060828403121561133157600080fd5b6040516060810181811067ffffffffffffffff8211171561135457611354611888565b60405282356001600160d01b038116811461136e57600080fd5b815261137c602084016112f3565b602082015261138d604084016112f3565b60408201529392505050565b6000806000606084860312156113ae57600080fd5b8335925060208085013567ffffffffffffffff808211156113ce57600080fd5b818701915087601f8301126113e257600080fd5b8135818111156113f4576113f4611888565b61140684601f19601f84011601611660565b9150808252888482850101111561141c57600080fd5b808484018584013760008482840101525080945050505061143f6040850161130b565b90509250925092565b6000806040838503121561145b57600080fd5b8235915061146b6020840161130b565b90509250929050565b6000806040838503121561148757600080fd5b6114908361130b565b915061146b6020840161130b565b6000806000606084860312156114b357600080fd5b6114bc8461130b565b92506114ca6020850161130b565b915061143f6040850161130b565b602080825282518282018190526000919060409081850190868401855b828110156115315761152184835180516001600160e01b0316825260209081015163ffffffff16910152565b92840192908501906001016114f5565b5091979650505050505050565b600060208083528351808285015260005b8181101561156b5785810183015185820160400152820161154f565b8181111561157d576000604083870101525b50601f01601f1916929092016040019392505050565b6060810161022b828480516001600160d01b0316825260208082015162ffffff9081169184019190915260409182015116910152565b60c081016115ff828680516001600160d01b0316825260208082015162ffffff9081169184019190915260409182015116910152565b83516001600160e01b0316606083015260209093015163ffffffff16608082015290151560a090910152919050565b62ffffff83168152606081016102e5602083018480516001600160e01b0316825260209081015163ffffffff16910152565b604051601f8201601f1916810167ffffffffffffffff8111828210171561168957611689611888565b604052919050565b60006001600160d01b038083168185168083038211156116b3576116b3611846565b01949350505050565b60006001600160e01b038083168185168083038211156116b3576116b3611846565b600062ffffff8083168185168083038211156116b3576116b3611846565b6000821982111561170f5761170f611846565b500190565b600064ffffffffff8083168185168083038211156116b3576116b3611846565b60006001600160e01b038084168061174e5761174e61185c565b92169190910492915050565b6000826117695761176961185c565b500490565b60006001600160e01b038083168185168183048111821515161561179457611794611846565b02949350505050565b60006001600160e01b03838116908316818110156117bd576117bd611846565b039392505050565b6000828210156117d7576117d7611846565b500390565b600063ffffffff838116908316818110156117bd576117bd611846565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561182b5761182b611846565b5060010190565b6000826118415761184161185c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220a62f1f64d7907c4cecdbe9b8530f7d1f04aaf82cc37e9f8ed3a5d8d23b75e3c964736f6c63430008060033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c80637c2014c6116100765780638ca0b7711161005b5780638ca0b771146101ca578063c3c191fd146101df578063ff429279146101f257600080fd5b80637c2014c61461018a5780638200d873146101ac57600080fd5b8063565974d3116100a7578063565974d3146101025780636126af6e1461016157806363ee94761461018257600080fd5b806339095bcb146100c35780633c4e9c1e146100ec575b600080fd5b6100d66100d136600461131f565b610205565b6040516100e39190611593565b60405180910390f35b6100f4610231565b6040516100e392919061162e565b6100d6604080516060810182526000808252602082018190529181019190915250604080516060810182526000546001600160d01b038116825262ffffff600160d01b820481166020840152600160e81b909104169181019190915290565b61017461016f36600461149e565b610297565b6040519081526020016100e3565b6100f46102ec565b61019d610198366004611399565b61034a565b6040516100e3939291906115c9565b6101b662ffffff81565b60405162ffffff90911681526020016100e3565b6101d2610456565b6040516100e391906114d8565b6101746101ed366004611474565b61054e565b61019d610200366004611448565b610598565b604080516060810182526000808252602082018190529181019190915261022b826106a1565b92915050565b6040805180820190915260008082526020820181905290604080516060810182526000546001600160d01b038116825262ffffff600160d01b820481166020840152600160e81b909104169181019190915261028f9060019061070a565b915091509091565b60408051606081018252600080546001600160d01b038116835262ffffff600160d01b820481166020850152600160e81b90910416928201929092526102e29060019086868661078a565b90505b9392505050565b6040805180820190915260008082526020820181905290604080516060810182526000546001600160d01b038116825262ffffff600160d01b820481166020840152600160e81b909104169181019190915261028f906001906107c2565b60408051606081018252600080825260208201819052918101919091526040805180820190915260008082526020820152600061038a600087878761083f565b82516000805460208601516040808801516001600160d01b039095167fffffff000000000000000000000000000000000000000000000000000000000090931692909217600160d01b62ffffff92831602177cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e81b91909416029290921790555192955090935091507f883fc20cc248074e2c1dd4a19bf6d2004d023d0be047378761fd6925810f381a90610445908590859085906115c9565b60405180910390a193509350939050565b6000805460609190600160e81b900462ffffff1667ffffffffffffffff81111561048257610482611888565b6040519080825280602002602001820160405280156104c757816020015b60408051808201909152600080825260208201528152602001906001900390816104a05790505b50905060005b81518110156105485760018162ffffff81106104eb576104eb611872565b604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff166020820152825183908390811061052a5761052a611872565b60200260200101819052508080610540906117f9565b9150506104cd565b50919050565b60408051606081018252600080546001600160d01b038116835262ffffff600160d01b820481166020850152600160e81b90910416928201929092526102e5906001908585610926565b6040805160608101825260008082526020820181905291810191909152604080518082019091526000808252602082015260006105d76000868661095e565b82516000805460208601516040808801516001600160d01b039095167fffffff000000000000000000000000000000000000000000000000000000000090931692909217600160d01b62ffffff92831602177cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e81b91909416029290921790555192955090935091507f883fc20cc248074e2c1dd4a19bf6d2004d023d0be047378761fd6925810f381a90610692908590859085906115c9565b60405180910390a19250925092565b604080516060810182526000808252602080830182905292820152908201516106d19062ffffff90811690610a07565b62ffffff9081166020840152604083015181161015610706576001826040018181516106fd91906116de565b62ffffff169052505b5090565b6040805180820190915260008082526020820181905290610739836020015162ffffff1662ffffff8016610a1d565b9150838262ffffff1662ffffff811061075457610754611872565b604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff166020820152919491935090915050565b6000808263ffffffff168463ffffffff16116107a657836107a8565b825b90506107b78787878487610a45565b979650505050505050565b604080518082019091526000808252602082018190529082602001519150838262ffffff1662ffffff81106107f9576107f9611872565b604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff166020820181905290915061083857600091508382610754565b9250929050565b604080516060810182526000808252602082018190529181019190915260408051808201909152600080825260208201526040805160608101825287546001600160d01b0380821680845262ffffff600160d01b840481166020860152600160e81b90930490921693830193909352600092879190891611156108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef919061153e565b60405180910390fd5b50610907886001018287610ae1565b8251999099036001600160d01b03168252909990985095505050505050565b6000808263ffffffff168463ffffffff16116109425783610944565b825b905061095286868386610bc8565b9150505b949350505050565b604080516060810182526000808252602082018190529181019190915260408051808201909152600080825260208201526040805160608101825286546001600160d01b038116825262ffffff600160d01b820481166020840152600160e81b90910416918101919091526000906109da600188018287610ae1565b835192965090945092506109ef908790611691565b6001600160d01b031684525091959094509092509050565b60006102e5610a178460016116fc565b83610ce1565b600081610a2c5750600061022b565b6102e56001610a3b84866116fc565b610a1791906117c5565b6000806000610a5488886107c2565b91509150600080610a658a8a61070a565b915091506000610a7b8b8b8487878a8f8e610ced565b90506000610a8f8c8c8588888b8f8f610ced565b9050610aa4816020015183602001518a610e37565b63ffffffff1682600001518260000151610abe919061179d565b610ac89190611734565b6001600160e01b03169c9b505050505050505050505050565b60408051606081018252600080825260208201819052918101919091526040805180820190915260008082526020820152600080610b1f878761070a565b9150508463ffffffff16816020015163ffffffff161415610b4857859350915060009050610bbf565b6000610b628288600001516001600160d01b031688610f0b565b90508088886020015162ffffff1662ffffff8110610b8257610b82611872565b825160209093015163ffffffff16600160e01b026001600160e01b03909316929092179101556000610bb3886106a1565b95509093506001925050505b93509350939050565b604080518082019091526000808252602082018190529081906040805180820190915260008082526020820152610bff888861070a565b60208101519194509150610c209063ffffffff9081169088908890610f8616565b15610c3b57505084516001600160d01b031691506109569050565b6000610c4789896107c2565b6020810151909350909150610c689063ffffffff808a169190899061105716565b15610c7a576000945050505050610956565b610c8c8985838a8c604001518b611126565b8094508193505050610ca78360200151836020015188610e37565b63ffffffff1682600001518460000151610cc1919061179d565b610ccb9190611734565b6001600160e01b03169998505050505050505050565b60006102e58284611832565b6040805180820190915260008082526020820152610d208383896020015163ffffffff166110579092919063ffffffff16565b15610d4457610d3d8789600001516001600160d01b031685610f0b565b9050610e2b565b8263ffffffff16876020015163ffffffff161415610d63575085610e2b565b8263ffffffff16866020015163ffffffff161415610d82575084610e2b565b610da18660200151838563ffffffff166110579092919063ffffffff16565b15610dc65750604080518082019091526000815263ffffffff83166020820152610e2b565b600080610ddb8b8888888e6040015189611126565b915091506000610df48260200151846020015187610e37565b63ffffffff1683600001518360000151610e0e919061179d565b610e189190611734565b9050610e25838288610f0b565b93505050505b98975050505050505050565b60008163ffffffff168463ffffffff1611158015610e6157508163ffffffff168363ffffffff1611155b15610e7757610e7083856117dc565b90506102e5565b60008263ffffffff168563ffffffff1611610ea657610ea163ffffffff8616640100000000611714565b610eae565b8463ffffffff165b64ffffffffff16905060008363ffffffff168563ffffffff1611610ee657610ee163ffffffff8616640100000000611714565b610eee565b8463ffffffff165b64ffffffffff169050610f0181836117c5565b9695505050505050565b60408051808201909152600080825260208201526040518060400160405280610f498660200151858663ffffffff16610e379092919063ffffffff16565b610f599063ffffffff168661176e565b8651610f6591906116bc565b6001600160e01b031681526020018363ffffffff1681525090509392505050565b60008163ffffffff168463ffffffff1611158015610fb057508163ffffffff168363ffffffff1611155b15610fcc578263ffffffff168463ffffffff16111590506102e5565b60008263ffffffff168563ffffffff1611610ffb57610ff663ffffffff8616640100000000611714565b611003565b8463ffffffff165b64ffffffffff16905060008363ffffffff168563ffffffff161161103b5761103663ffffffff8616640100000000611714565b611043565b8463ffffffff165b64ffffffffff169091111595945050505050565b60008163ffffffff168463ffffffff161115801561108157508163ffffffff168363ffffffff1611155b1561109c578263ffffffff168463ffffffff161090506102e5565b60008263ffffffff168563ffffffff16116110cb576110c663ffffffff8616640100000000611714565b6110d3565b8463ffffffff165b64ffffffffff16905060008363ffffffff168563ffffffff161161110b5761110663ffffffff8616640100000000611714565b611113565b8463ffffffff165b64ffffffffff1690911095945050505050565b6040805180820190915260008082526020820152604080518082019091526000808252602082015260008662ffffff1690506000818962ffffff1610611171578862ffffff1661118c565b600161118262ffffff8816846116fc565b61118c91906117c5565b905060005b600261119d83856116fc565b6111a7919061175a565b90508a6111b9828962ffffff16610ce1565b62ffffff1662ffffff81106111d0576111d0611872565b604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff166020820181905290955080611218576112108260016116fc565b935050611191565b8b611228838a62ffffff16610a07565b62ffffff1662ffffff811061123f5761123f611872565b604080518082019091529101546001600160e01b038116825263ffffffff600160e01b9091048116602083015290955060009061128490838116908c908b90610f8616565b90508080156112ad57506112ad8660200151898c63ffffffff16610f869092919063ffffffff16565b156112b95750506112e5565b806112d0576112c96001846117c5565b93506112de565b6112db8360016116fc565b94505b5050611191565b505050965096945050505050565b803562ffffff8116811461130657600080fd5b919050565b803563ffffffff8116811461130657600080fd5b60006060828403121561133157600080fd5b6040516060810181811067ffffffffffffffff8211171561135457611354611888565b60405282356001600160d01b038116811461136e57600080fd5b815261137c602084016112f3565b602082015261138d604084016112f3565b60408201529392505050565b6000806000606084860312156113ae57600080fd5b8335925060208085013567ffffffffffffffff808211156113ce57600080fd5b818701915087601f8301126113e257600080fd5b8135818111156113f4576113f4611888565b61140684601f19601f84011601611660565b9150808252888482850101111561141c57600080fd5b808484018584013760008482840101525080945050505061143f6040850161130b565b90509250925092565b6000806040838503121561145b57600080fd5b8235915061146b6020840161130b565b90509250929050565b6000806040838503121561148757600080fd5b6114908361130b565b915061146b6020840161130b565b6000806000606084860312156114b357600080fd5b6114bc8461130b565b92506114ca6020850161130b565b915061143f6040850161130b565b602080825282518282018190526000919060409081850190868401855b828110156115315761152184835180516001600160e01b0316825260209081015163ffffffff16910152565b92840192908501906001016114f5565b5091979650505050505050565b600060208083528351808285015260005b8181101561156b5785810183015185820160400152820161154f565b8181111561157d576000604083870101525b50601f01601f1916929092016040019392505050565b6060810161022b828480516001600160d01b0316825260208082015162ffffff9081169184019190915260409182015116910152565b60c081016115ff828680516001600160d01b0316825260208082015162ffffff9081169184019190915260409182015116910152565b83516001600160e01b0316606083015260209093015163ffffffff16608082015290151560a090910152919050565b62ffffff83168152606081016102e5602083018480516001600160e01b0316825260209081015163ffffffff16910152565b604051601f8201601f1916810167ffffffffffffffff8111828210171561168957611689611888565b604052919050565b60006001600160d01b038083168185168083038211156116b3576116b3611846565b01949350505050565b60006001600160e01b038083168185168083038211156116b3576116b3611846565b600062ffffff8083168185168083038211156116b3576116b3611846565b6000821982111561170f5761170f611846565b500190565b600064ffffffffff8083168185168083038211156116b3576116b3611846565b60006001600160e01b038084168061174e5761174e61185c565b92169190910492915050565b6000826117695761176961185c565b500490565b60006001600160e01b038083168185168183048111821515161561179457611794611846565b02949350505050565b60006001600160e01b03838116908316818110156117bd576117bd611846565b039392505050565b6000828210156117d7576117d7611846565b500390565b600063ffffffff838116908316818110156117bd576117bd611846565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561182b5761182b611846565b5060010190565b6000826118415761184161185c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220a62f1f64d7907c4cecdbe9b8530f7d1f04aaf82cc37e9f8ed3a5d8d23b75e3c964736f6c63430008060033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
