{"matchId":"57132137","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-10-26T17:50:51Z","creationBytecode":{"onchainBytecode":"0x60e060405234801561000f575f80fd5b5060405161548838038061548883398101604081905261002e916101b9565b81604051806040016040528060118152602001704167656e7420466f7267652052656c696360781b8152506040518060400160405280600581526020016452454c494360d81b815250815f908161008591906102a1565b50600161009282826102a1565b5050506001600160a01b0381166100c257604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100cb81610144565b50600780546001600160a01b0319166001600160a01b0386811691909117909155821660a0526080819052604051839061010490610195565b6001600160a01b039091168152602001604051809103905ff08015801561012d573d5f803e3d5ffd5b506001600160a01b031660c0525061035b92505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b61268180612e0783390190565b6001600160a01b03811681146101b6575f80fd5b50565b5f805f80608085870312156101cc575f80fd5b84516101d7816101a2565b60208601519094506101e8816101a2565b60408601519093506101f9816101a2565b6060959095015193969295505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061023157607f821691505b60208210810361024f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561029c57805f5260205f20601f840160051c8101602085101561027a5750805b601f840160051c820191505b81811015610299575f8155600101610286565b50505b505050565b81516001600160401b038111156102ba576102ba610209565b6102ce816102c8845461021d565b84610255565b6020601f821160018114610300575f83156102e95750848201515b5f19600385901b1c1916600184901b178455610299565b5f84815260208120601f198516915b8281101561032f578785015182556020948501946001909201910161030f565b508482101561034c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60805160a05160c051612a746103935f395f81816106cb0152610a0d01525f818161076e0152610d4f01525f6105b40152612a745ff3fe6080604052600436106102bf575f3560e01c806370a082311161016f578063a624c3db116100d8578063d89135cd11610092578063e905182a1161006d578063e905182a14610853578063e985e9c51461087a578063f2fde38b14610899578063fc659491146108b8575f80fd5b8063d89135cd1461080b578063e6b1a3ae14610820578063e8a3d4851461083f575f80fd5b8063a624c3db1461075d578063b88d4fde14610790578063bce6d672146107af578063c87b56dd146107c3578063cd90e5af146107e2578063d21ff494146107f6575f80fd5b806396d597171161012957806396d59717146106ba5780639ba06ab8146106ed578063a0712d6814610702578063a22cb46514610715578063a2309ff814610734578063a475b5dd14610749575f80fd5b806370a082311461061d578063715018a61461063c5780638d859f3e146106505780638da5cb5b1461066a5780638f79306e1461068757806395d89b41146106a6575f80fd5b806324bbd0491161022b57806342842e0e116101e55780636352211e116101c05780636352211e146105845780636373a6b1146105a357806369d2ceb1146105d65780636e303cad146105f2575f80fd5b806342842e0e146105325780634ae23bd7146105515780635183022714610566575f80fd5b806324bbd04914610487578063263f3e7e146104a0578063301bd28e146104bf57806332cb6b0c146104de5780633ccfd60b146104f35780633cef28d214610507575f80fd5b8063193ee7b51161027c578063193ee7b5146103a6578063204aecb1146103d25780632097ac3b146103e757806322acaf04146103fc57806323b872dd1461043757806323f1892014610456575f80fd5b806301ffc9a7146102c357806306fdde03146102f7578063081812fc14610318578063095ea7b31461034f5780630f2cdd6c1461037057806318160ddd14610392575b5f80fd5b3480156102ce575f80fd5b506102e26102dd366004612156565b6108ce565b60405190151581526020015b60405180910390f35b348015610302575f80fd5b5061030b61091f565b6040516102ee91906121be565b348015610323575f80fd5b506103376103323660046121d0565b6109ae565b6040516001600160a01b0390911681526020016102ee565b34801561035a575f80fd5b5061036e610369366004612202565b6109d5565b005b34801561037b575f80fd5b50610384600a81565b6040519081526020016102ee565b34801561039d575f80fd5b506103846109e4565b3480156103b1575f80fd5b506103c56103c036600461222a565b6109fa565b6040516102ee9190612261565b3480156103dd575f80fd5b50610384600c5481565b3480156103f2575f80fd5b50610384600b5481565b348015610407575f80fd5b5061041b6104163660046121d0565b610b67565b6040805160ff909316835261ffff9091166020830152016102ee565b348015610442575f80fd5b5061036e610451366004612294565b610c25565b348015610461575f80fd5b506104756104703660046121d0565b610cae565b60405160ff90911681526020016102ee565b348015610492575f80fd5b50600a546102e29060ff1681565b3480156104ab575f80fd5b506103846104ba3660046121d0565b610cc2565b3480156104ca575f80fd5b50600754610337906001600160a01b031681565b3480156104e9575f80fd5b5061038461138881565b3480156104fe575f80fd5b5061036e610d3e565b348015610512575f80fd5b506103846105213660046122ce565b600d6020525f908152604090205481565b34801561053d575f80fd5b5061036e61054c366004612294565b610e27565b34801561055c575f80fd5b506103846104e281565b348015610571575f80fd5b50600a546102e290610100900460ff1681565b34801561058f575f80fd5b5061033761059e3660046121d0565b610e46565b3480156105ae575f80fd5b506103847f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e1575f80fd5b50600a54610100900460ff166102e2565b3480156105fd575f80fd5b5061038461060c3660046121d0565b600e6020525f908152604090205481565b348015610628575f80fd5b506103846106373660046122ce565b610e50565b348015610647575f80fd5b5061036e610e95565b34801561065b575f80fd5b506103846601c6bf5263400081565b348015610675575f80fd5b506006546001600160a01b0316610337565b348015610692575f80fd5b506103846106a1366004612202565b610ea8565b3480156106b1575f80fd5b5061030b610f10565b3480156106c5575f80fd5b506103377f000000000000000000000000000000000000000000000000000000000000000081565b3480156106f8575f80fd5b5061038461119481565b61036e6107103660046121d0565b610f1f565b348015610720575f80fd5b5061036e61072f3660046122e7565b611108565b34801561073f575f80fd5b5061038460085481565b348015610754575f80fd5b5061036e611113565b348015610768575f80fd5b506103377f000000000000000000000000000000000000000000000000000000000000000081565b34801561079b575f80fd5b5061036e6107aa36600461238c565b61125d565b3480156107ba575f80fd5b5061036e611275565b3480156107ce575f80fd5b5061030b6107dd3660046121d0565b6112b4565b3480156107ed575f80fd5b50610384600281565b348015610801575f80fd5b506103846106c081565b348015610816575f80fd5b5061038460095481565b34801561082b575f80fd5b5061036e61083a3660046122ce565b61152b565b34801561084a575f80fd5b5061030b6115b0565b34801561085e575f80fd5b506103377360b9262456de011f7d15a54cdd8c48baaa8b022f81565b348015610885575f80fd5b506102e2610894366004612430565b611641565b3480156108a4575f80fd5b5061036e6108b33660046122ce565b61166e565b3480156108c3575f80fd5b506103846212750081565b5f6001600160e01b031982166380ac58cd60e01b14806108fe57506001600160e01b03198216635b5e139f60e01b145b8061091957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f805461092d90612461565b80601f016020809104026020016040519081016040528092919081815260200182805461095990612461565b80156109a45780601f1061097b576101008083540402835291602001916109a4565b820191905f5260205f20905b81548152906001019060200180831161098757829003601f168201915b5050505050905090565b5f6109b8826116ab565b505f828152600460205260409020546001600160a01b0316610919565b6109e08282336116e3565b5050565b5f6009546008546109f591906124ad565b905090565b610a02612123565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a4b5760405163f3883b7560e01b815260040160405180910390fd5b600a54610100900460ff16610a7357604051631659379160e31b815260040160405180910390fd5b5f5b6005811015610b4857836001600160a01b0316610abc848360058110610a9d57610a9d6124c0565b60200201355f908152600260205260409020546001600160a01b031690565b6001600160a01b031614610ae3576040516359dc379f60e01b815260040160405180910390fd5b610b02838260058110610af857610af86124c0565b6020020135610cae565b828260058110610b1457610b146124c0565b60ff9092166020929092020152610b40838260058110610b3657610b366124c0565b60200201356116f0565b600101610a75565b50600560095f828254610b5b91906124d4565b90915550909392505050565b5f806113888310610bac5760405162461bcd60e51b8152600401610ba3906020808252600490820152631cdb1bdd60e21b604082015260600190565b60405180910390fd5b6104e2610bb884611728565b610bc291906124fb565b604080517f1d03a41ff33612e152ff5fa34d0d3c0f1e464becfd80c3cf15b9494ac7bc60db60208201529081018590529092506106c090606001604051602081830303815290604052805190602001205f1c610c1e919061250e565b9050915091565b6001600160a01b038216610c4e57604051633250574960e11b81525f6004820152602401610ba3565b5f610c5a8383336117be565b9050836001600160a01b0316816001600160a01b031614610ca8576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610ba3565b50505050565b5f610cbb61041683610cc2565b5092915050565b600a545f90610100900460ff16610cec57604051631659379160e31b815260040160405180910390fd5b811580610cfa575060085482115b15610d18576040516379d93f4960e01b815260040160405180910390fd5b600b5461138890610d2a6001856124ad565b610d3491906124d4565b610919919061250e565b60405147905f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169083908381818185875af1925050503d805f8114610da8576040519150601f19603f3d011682016040523d82523d5f602084013e610dad565b606091505b5050905080610df05760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610ba3565b6040518281527f430648de173157e069201c943adb2d4e340e7cf5b27b1b09c9cb852f03d63b569060200160405180910390a15050565b610e4183838360405180602001604052805f81525061125d565b505050565b5f610919826116ab565b5f6001600160a01b038216610e7a576040516322718ad960e21b81525f6004820152602401610ba3565b506001600160a01b03165f9081526003602052604090205490565b610e9d611818565b610ea65f611845565b565b6001600160a01b0382165f908152600d6020526040812054816002821015610eda57610ed58260026124ad565b610edc565b5f5b9050808411610eeb575f610f07565b6601c6bf52634000610efd82866124ad565b610f079190612521565b95945050505050565b60606001805461092d90612461565b600a5460ff16610f425760405163589ed34b60e01b815260040160405180910390fd5b6040516370a0823160e01b81523360048201527360b9262456de011f7d15a54cdd8c48baaa8b022f906370a0823190602401602060405180830381865afa158015610f8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb39190612538565b5f03610fd257604051630d9ab13f60e01b815260040160405180910390fd5b805f03610ff257604051635caa42ff60e01b815260040160405180910390fd5b60085461138861100283836124d4565b1115611021576040516352df9fe560e01b815260040160405180910390fd5b335f908152600d6020526040902054600a9061103e9084906124d4565b111561105c5760405162a84d4b60e71b815260040160405180910390fd5b6110663383610ea8565b34146110855760405163788a686f60e01b815260040160405180910390fd5b335f908152600d6020526040812080548492906110a39084906124d4565b909155506110b3905082826124d4565b600855600c541580156110d157506111946110ce83836124d4565b10155b156110db5742600c555b60015b828111610e41576110f8336110f383856124d4565b611896565b6111018161254f565b90506110de565b6109e03383836118f7565b600a54610100900460ff161561113c5760405163a89ac15160e01b815260040160405180910390fd5b61119460085410156111615760405163c349402d60e01b815260040160405180910390fd5b6006546001600160a01b0316331480159061117f5750611388600854105b801561119a575062127500600c5461119791906124d4565b42105b156111b85760405163c349402d60e01b815260040160405180910390fd5b611388446111c76001436124ad565b600854604080516020810194909452914091830191909152606082015230608082015260a001604051602081830303815290604052805190602001205f1c61120f919061250e565b600b819055600a805461ff001916610100179055604080519182523360208301527f6e9dac3f3f833c1d527aa989d3a673884ddc11e31fdccc11ccd8aebf1ae069ac910160405180910390a1565b611268848484610c25565b610ca83385858585611995565b61127d611818565b600a805460ff191660011790556040517f4301b55b3d4fd9018308a6bd66bf37880623a9548566d1b12867ab619a993ca1905f90a1565b60606112bf826116ab565b506060806060600a60019054906101000a900460ff16611390576112e285611abd565b6040516020016112f29190612582565b60408051808303601f190181529082905260075463c1b27b6160e01b8352600483018890529094506001600160a01b03169063c1b27b61906024015f60405180830381865afa158015611347573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261136e91908101906125b7565b9150604051806060016040528060288152602001612a176028913990506114d6565b5f8061139e61041688610cc2565b915091506113ae8260ff16611b4d565b6113b788611abd565b6040516020016113c8929190612620565b60408051808303601f19018152908290526007546399faa5b360e01b8352600483018a905260ff8516602484015261ffff841660448401529096506001600160a01b0316906399faa5b3906064015f60405180830381865afa158015611430573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261145791908101906125b7565b6007546040516318f6670d60e21b815260ff8516600482015261ffff841660248201529195506001600160a01b0316906363d99c34906044015f60405180830381865afa1580156114aa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114d191908101906125b7565b925050505b6115028383836040516020016114ee93929190612662565b604051602081830303815290604052611bed565b60405160200161151291906127cf565b6040516020818303038152906040529350505050919050565b611533611818565b600a54610100900460ff161561155c576040516313ef243160e11b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527f89382d75256b43b6826ad8d6cbd8e517eaf5e10f1ef4c8f123c9a25ac4529b559060200160405180910390a150565b60075460405163c1b27b6160e01b81525f60048201526060916001600160a01b03169063c1b27b61906024015f60405180830381865afa1580156115f6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261161d91908101906125b7565b60405160200161162d9190612813565b604051602081830303815290604052905090565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b611676611818565b6001600160a01b03811661169f57604051631e4fbdf760e01b81525f6004820152602401610ba3565b6116a881611845565b50565b5f818152600260205260408120546001600160a01b03168061091957604051637e27328960e01b815260048101849052602401610ba3565b610e418383836001611c13565b5f6116fc5f835f6117be565b90506001600160a01b0381166109e057604051637e27328960e01b815260048101839052602401610ba3565b5f5b600782901c607f83165f5b60048110156117a657604080517f1d03a41ff33612e152ff5fa34d0d3c0f1e464becfd80c3cf15b9494ac7bc60db6020820152908101829052606081018390525f9060800160408051808303601f1901815291905280516020909101209293607f9093169092189150600101611735565b5060079190911b17915061138882101561172a575090565b5f6117ca848484611d17565b90506001600160a01b038116158015906117ec57506001600160a01b03841615155b15611811575f838152600e60205260408120805490919061180c9061254f565b909155505b9392505050565b6006546001600160a01b03163314610ea65760405163118cdaa760e01b8152336004820152602401610ba3565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166118bf57604051633250574960e11b81525f6004820152602401610ba3565b5f6118cb83835f6117be565b90506001600160a01b03811615610e41576040516339e3563760e11b81525f6004820152602401610ba3565b6001600160a01b03821661192957604051630b61174360e31b81526001600160a01b0383166004820152602401610ba3565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b15611ab657604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906119d790889088908790879060040161297f565b6020604051808303815f875af1925050508015611a11575060408051601f3d908101601f19168201909252611a0e918101906129bb565b60015b611a78573d808015611a3e576040519150601f19603f3d011682016040523d82523d5f602084013e611a43565b606091505b5080515f03611a7057604051633250574960e11b81526001600160a01b0385166004820152602401610ba3565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14611ab457604051633250574960e11b81526001600160a01b0385166004820152602401610ba3565b505b5050505050565b60605f611ac983611e09565b60010190505f8167ffffffffffffffff811115611ae857611ae8612320565b6040519080825280601f01601f191660200182016040528015611b12576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611b1c57509392505050565b6060815f03611b765750506040805180820190915260048152634669726560e01b602082015290565b81600103611b9f5750506040805180820190915260058152642bb0ba32b960d91b602082015290565b81600203611bc857505060408051808201909152600581526408ac2e4e8d60db1b602082015290565b50506040805180820190915260098152684c696768746e696e6760b81b602082015290565b6060610919826040518060600160405280604081526020016129d7604091396001611ee0565b8080611c2757506001600160a01b03821615155b15611ce8575f611c36846116ab565b90506001600160a01b03831615801590611c625750826001600160a01b0316816001600160a01b031614155b8015611c755750611c738184611641565b155b15611c9e5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610ba3565b8115611ce65783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f828152600260205260408120546001600160a01b0390811690831615611d4357611d4381848661205b565b6001600160a01b03811615611d7d57611d5e5f855f80611c13565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615611dab576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e475772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611e73576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611e9157662386f26fc10000830492506010015b6305f5e1008310611ea9576305f5e100830492506008015b6127108310611ebd57612710830492506004015b60648310611ecf576064830492506002015b600a83106109195760010192915050565b606083515f03611efe575060408051602081019091525f8152611811565b5f82611f2e57600385516004611f149190612521565b611f1f9060026124d4565b611f2991906124fb565b611f53565b600385516002611f3e91906124d4565b611f4891906124fb565b611f53906004612521565b90505f8167ffffffffffffffff811115611f6f57611f6f612320565b6040519080825280601f01601f191660200182016040528015611f99576020820181803683370190505b509050600185016020820187885189016020810180515f82525b8284101561200e576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450611fb3565b90525050851561204f5760038851066001811461203257600281146120455761204d565b603d6001830353603d600283035361204d565b603d60018303535b505b50909695505050505050565b6120668383836120bf565b610e41576001600160a01b03831661209457604051637e27328960e01b815260048101829052602401610ba3565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610ba3565b5f6001600160a01b0383161580159061211b5750826001600160a01b0316846001600160a01b031614806120f857506120f88484611641565b8061211b57505f828152600460205260409020546001600160a01b038481169116145b949350505050565b6040518060a001604052806005906020820280368337509192915050565b6001600160e01b0319811681146116a8575f80fd5b5f60208284031215612166575f80fd5b813561181181612141565b5f5b8381101561218b578181015183820152602001612173565b50505f910152565b5f81518084526121aa816020860160208601612171565b601f01601f19169290920160200192915050565b602081525f6118116020830184612193565b5f602082840312156121e0575f80fd5b5035919050565b80356001600160a01b03811681146121fd575f80fd5b919050565b5f8060408385031215612213575f80fd5b61221c836121e7565b946020939093013593505050565b5f8060c0838503121561223b575f80fd5b612244836121e7565b91508360c084011115612255575f80fd5b50926020919091019150565b60a0810181835f5b600581101561228b57815160ff16835260209283019290910190600101612269565b50505092915050565b5f805f606084860312156122a6575f80fd5b6122af846121e7565b92506122bd602085016121e7565b929592945050506040919091013590565b5f602082840312156122de575f80fd5b611811826121e7565b5f80604083850312156122f8575f80fd5b612301836121e7565b915060208301358015158114612315575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561235d5761235d612320565b604052919050565b5f67ffffffffffffffff82111561237e5761237e612320565b50601f01601f191660200190565b5f805f806080858703121561239f575f80fd5b6123a8856121e7565b93506123b6602086016121e7565b925060408501359150606085013567ffffffffffffffff8111156123d8575f80fd5b8501601f810187136123e8575f80fd5b80356123fb6123f682612365565b612334565b81815288602083850101111561240f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215612441575f80fd5b61244a836121e7565b9150612458602084016121e7565b90509250929050565b600181811c9082168061247557607f821691505b60208210810361249357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561091957610919612499565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561091957610919612499565b634e487b7160e01b5f52601260045260245ffd5b5f82612509576125096124e7565b500490565b5f8261251c5761251c6124e7565b500690565b808202811582820484141761091957610919612499565b5f60208284031215612548575f80fd5b5051919050565b5f6001820161256057612560612499565b5060010190565b5f8151612578818560208601612171565b9290920192915050565b6d5365616c65642052656c6963202360901b81525f82516125aa81600e850160208701612171565b91909101600e0192915050565b5f602082840312156125c7575f80fd5b815167ffffffffffffffff8111156125dd575f80fd5b8201601f810184136125ed575f80fd5b80516125fb6123f682612365565b81815285602083850101111561260f575f80fd5b610f07826020830160208601612171565b5f8351612631818460208801612171565b672052656c6963202360c01b9083019081528351612656816008840160208801612171565b01600801949350505050565b683d913730b6b2911d1160b91b815283515f90612686816009850160208901612171565b7f222c226465736372697074696f6e223a224167656e7420466f7267653a20352c6009918401918201527f303030206f6e2d636861696e20706978656c2072656c69637320666f72202e6160298201527f69204167656e7420494420686f6c64657273206f6e20424e4220436861696e2e60498201527f20466f72676520352052656c69637320696e746f2031204d696e65722e20556e60698201527f6f6666696369616c2c20636f6c6c65637469626c65206f6e6c792c206e6f207960898201527f69656c642070726f6d697365642e222c22696d616765223a22646174613a696d60a9820152701859d94bdcdd99cade1b5b0edd5d198e0b607a1b60c982015261279560da820186612567565b6f222c2261747472696275746573223a5b60801b815290506127ba6010820185612567565b615d7d60f01b81526002019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161280681601d850160208701612171565b91909101601d0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081527f7b226e616d65223a224167656e7420466f7267652052656c6963222c22646573601b8201527f6372697074696f6e223a22352c303030206f6e2d636861696e20706978656c20603b8201527f72656c69637320696e20666f757220656c656d656e747320666f72202e616920605b8201527f4167656e7420494420686f6c64657273206f6e20424e4220436861696e2e2042607b8201527f75726e203520696e2074686520466f72676520746f206d696e742061204d696e609b8201527f65722e20556e6f6666696369616c2c20636f6c6c65637469626c65206f6e6c7960bb8201527f2e222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b7560db820152631d198e0b60e21b60fb8201525f82516129618160ff850160208701612171565b820161297460ff820161227d60f01b9052565b610101019392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906129b190830184612193565b9695505050505050565b5f602082840312156129cb575f80fd5b81516118118161214156fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f7b2274726169745f74797065223a22537461747573222c2276616c7565223a225365616c6564227da264697066735822122048023ede6f67d3681b9045c99c65b5db0a558760d9abe82b0ee0e395dd37670764736f6c634300081a003360c060405234801561000f575f80fd5b5060405161268138038061268183398101604081905261002e916100ae565b6040518060400160405280601181526020017020b3b2b73a102337b933b29026b4b732b960791b8152506040518060400160405280600581526020016426a4a722a960d91b815250815f90816100849190610173565b5060016100918282610173565b5050600160065550336080526001600160a01b031660a05261022d565b5f602082840312156100be575f80fd5b81516001600160a01b03811681146100d4575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061010357607f821691505b60208210810361012157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561016e57805f5260205f20601f840160051c8101602085101561014c5750805b601f840160051c820191505b8181101561016b575f8155600101610158565b50505b505050565b81516001600160401b0381111561018c5761018c6100db565b6101a08161019a84546100ef565b84610127565b6020601f8211600181146101d2575f83156101bb5750848201515b5f19600385901b1c1916600184901b17845561016b565b5f84815260208120601f198516915b8281101561020157878501518255602094850194600190920191016101e1565b508482101561021e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60805160a05161241761026a5f395f81816104de01528181610f85015261103101525f8181610511015281816109890152610db301526124175ff3fe6080604052600436106101e6575f3560e01c806370a0823111610108578063aa6bb09a1161009d578063dd4bc1011161006d578063dd4bc101146105ba578063df18e047146105e5578063df1c455c14610610578063e985e9c514610625578063ff50abdc14610644575f80fd5b8063aa6bb09a14610552578063b88d4fde14610567578063c87b56dd14610586578063d54ad2a1146105a5575f80fd5b806396c82e57116100d857806396c82e57146104b85780639cb84a01146104cd5780639fe45cb414610500578063a22cb46514610533575f80fd5b806370a08231146104525780638c715407146104715780638da5cb5b1461049057806395d89b41146104a4575f80fd5b806331d7a2621161017e5780634e71d92d1161014e5780634e71d92d146103c95780635873eb9b146103dd5780636352211e146104085780636e303cad14610427575f80fd5b806331d7a2621461034d57806342842e0e1461036c57806348380a101461038b5780634e2a08a7146103aa575f80fd5b8063152111f7116101b9578063152111f71461029757806318160ddd1461029f57806323b872dd146102c25780632e340599146102e1575f80fd5b806301ffc9a7146101ea57806306fdde031461021e578063081812fc1461023f578063095ea7b314610276575b5f80fd5b3480156101f5575f80fd5b50610209610204366004611c2b565b610659565b60405190151581526020015b60405180910390f35b348015610229575f80fd5b506102326106aa565b6040516102159190611c93565b34801561024a575f80fd5b5061025e610259366004611ca5565b610739565b6040516001600160a01b039091168152602001610215565b348015610281575f80fd5b50610295610290366004611cd0565b610760565b005b61029561076f565b3480156102aa575f80fd5b506102b460075481565b604051908152602001610215565b3480156102cd575f80fd5b506102956102dc366004611cfa565b61082f565b3480156102ec575f80fd5b506103276102fb366004611ca5565b60086020525f908152604090205460ff8082169161010081049091169062010000900463ffffffff1683565b6040805160ff948516815293909216602084015263ffffffff1690820152606001610215565b348015610358575f80fd5b506102b4610367366004611d38565b6108bd565b348015610377575f80fd5b50610295610386366004611cfa565b610932565b348015610396575f80fd5b506102b46103a5366004611ca5565b610951565b3480156103b5575f80fd5b506102b46103c4366004611d53565b610967565b3480156103d4575f80fd5b506102b4610c31565b3480156103e8575f80fd5b506102b46103f7366004611d38565b60136020525f908152604090205481565b348015610413575f80fd5b5061025e610422366004611ca5565b610d45565b348015610432575f80fd5b506102b4610441366004611ca5565b600c6020525f908152604090205481565b34801561045d575f80fd5b506102b461046c366004611d38565b610d4f565b34801561047c575f80fd5b506102b461048b366004611ca5565b610d94565b34801561049b575f80fd5b5061025e610db0565b3480156104af575f80fd5b50610232610e36565b3480156104c3575f80fd5b506102b4600e5481565b3480156104d8575f80fd5b5061025e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561050b575f80fd5b5061025e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561053e575f80fd5b5061029561054d366004611d78565b610e45565b34801561055d575f80fd5b506102b4600d5481565b348015610572575f80fd5b50610295610581366004611e1f565b610e50565b348015610591575f80fd5b506102326105a0366004611ca5565b610e68565b3480156105b0575f80fd5b506102b460115481565b3480156105c5575f80fd5b506102b46105d4366004611d38565b60126020525f908152604090205481565b3480156105f0575f80fd5b506102b46105ff366004611d38565b60146020525f908152604090205481565b34801561061b575f80fd5b506102b4600f5481565b348015610630575f80fd5b5061020961063f366004611ec7565b6110f3565b34801561064f575f80fd5b506102b460105481565b5f6001600160e01b031982166380ac58cd60e01b148061068957506001600160e01b03198216635b5e139f60e01b145b806106a457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f80546106b890611ef3565b80601f01602080910402602001604051908101604052809291908181526020018280546106e490611ef3565b801561072f5780601f106107065761010080835404028352916020019161072f565b820191905f5260205f20905b81548152906001019060200180831161071257829003601f168201915b5050505050905090565b5f61074382611120565b505f828152600460205260409020546001600160a01b03166106a4565b61076b828233611158565b5050565b3460105f8282546107809190611f39565b9091555050600e5434905f036107ac5780600f5f8282546107a19190611f39565b909155506107f79050565b600f546107b99082611f39565b5f600f55600e549091506107d769d3c21bcecceda100000083611f4c565b6107e19190611f63565b600d5f8282546107f19190611f39565b90915550505b60405134815233907fb8b27d0db504fa5d914f1fd330347096e88d5ff94b6c612d32797e7c12a8f66f9060200160405180910390a250565b6001600160a01b03821661085d57604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f610869838333611165565b9050836001600160a01b0316816001600160a01b0316146108b7576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610854565b50505050565b6001600160a01b0381165f90815260136020908152604080832054600d54601290935290832054909169d3c21bcecceda1000000916108fc9190611f4c565b6109069190611f63565b6001600160a01b0384165f908152601460205260409020546109289190611f39565b6106a49190611f82565b61094c83838360405180602001604052805f815250610e50565b505050565b60098160038110610960575f80fd5b0154905081565b5f61097061132e565b60405163193ee7b560e01b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063193ee7b5906109c09033908790600401611f95565b60a0604051808303815f875af11580156109dc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a009190611fb4565b9050610a0a611bf5565b5f5b6005811015610a595781838260058110610a2857610a2861203c565b602002015160ff1660048110610a4057610a4061203c565b602002018051610a4f90612050565b9052600101610a0c565b505f805f805f5b6004811015610ad6575f868260048110610a7c57610a7c61203c565b60200201511115610a9357610a9083612050565b92505b81868260048110610aa657610aa661203c565b60200201511115610ace57858160048110610ac357610ac361203c565b602002015191508093505b600101610a60565b5080600503610ae85760029350610af5565b81600403610af557600193505b60075f8154610b0390612050565b919050819055965060405180606001604052808560ff1681526020018460ff168152602001448a8a604051602001610b3d93929190612068565b60408051601f19818403018152918152815160209283012063ffffffff9081169093525f8b81526008835281902084518154938601519590920151909316620100000265ffffffff00001960ff9586166101000261ffff19909416928616929092179290921716179055600990851660038110610bbc57610bbc61203c565b015f8154610bc990612050565b90915550610bd73388611358565b86336001600160a01b03167ed277013b02e1a1b26a701cc2c235f4cacbb71e1b5210bab28f6cb73ffaa3b186868c604051610c1493929190612085565b60405180910390a3505050505050610c2c6001600655565b919050565b5f610c3a61132e565b610c43336113b9565b50335f9081526014602052604081205490819003610c74576040516312d37ee560e31b815260040160405180910390fd5b335f90815260146020526040812081905560118054839290610c97908490611f39565b90915550506040515f90339083908381818185875af1925050503d805f8114610cdb576040519150601f19603f3d011682016040523d82523d5f602084013e610ce0565b606091505b5050905080610d025760405163197121f560e01b815260040160405180910390fd5b60405182815233907fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a9060200160405180910390a250610d426001600655565b90565b5f6106a482611120565b5f6001600160a01b038216610d79576040516322718ad960e21b81525f6004820152602401610854565b506001600160a01b03165f9081526003602052604090205490565b5f818152600860205260408120546106a49060ff166001611f39565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3191906120a7565b905090565b6060600180546106b890611ef3565b61076b338383611467565b610e5b84848461082f565b6108b73385858585611505565b6060610e7382611120565b505f8281526008602090815260408083208151606081018352905460ff80821680845261010083049091169483019490945262010000900463ffffffff1691810191909152919015610f1657815f015160ff16600114610ef457604051806040016040528060098152602001684c6567656e6461727960b81b815250610f36565b604051806040016040528060048152602001635261726560e01b815250610f36565b6040518060400160405280600681526020016521b7b6b6b7b760d11b8152505b90506110cb81610f458661162d565b8451602086015160408088015190516303cf49a760e61b8152600481018b905260ff938416602482015292909116604483015263ffffffff1660648201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f3d269c0906084015f60405180830381865afa158015610fd1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ff891908101906120c2565b85516020870151604080890151905163acafc2cb60e01b815260ff938416600482015292909116602483015263ffffffff1660448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063acafc2cb906064015f60405180830381865afa15801561107d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110a491908101906120c2565b6040516020016110b7949392919061214f565b6040516020818303038152906040526116bd565b6040516020016110db9190612306565b60405160208183030381529060405292505050919050565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b5f818152600260205260408120546001600160a01b0316806106a457604051637e27328960e01b815260048101849052602401610854565b61094c83838360016116e3565b5f6111718484846117e7565b90505f61117d84610d94565b90506001600160a01b0382161561123057611197826113b9565b6001600160a01b0382165f90815260126020526040812080548392906111be908490611f82565b9091555050600d546001600160a01b0383165f9081526012602052604090205469d3c21bcecceda1000000916111f391611f4c565b6111fd9190611f63565b6001600160a01b0383165f90815260136020526040812091909155600e805483929061122a908490611f82565b90915550505b6001600160a01b038516156112e157611248856113b9565b6001600160a01b0385165f908152601260205260408120805483929061126f908490611f39565b9091555050600d546001600160a01b0386165f9081526012602052604090205469d3c21bcecceda1000000916112a491611f4c565b6112ae9190611f63565b6001600160a01b0386165f90815260136020526040812091909155600e80548392906112db908490611f39565b90915550505b6001600160a01b0382161580159061130157506001600160a01b03851615155b15611326575f848152600c60205260408120805490919061132190612050565b909155505b509392505050565b60026006540361135157604051633ee5aeb560e01b815260040160405180910390fd5b6002600655565b6001600160a01b03821661138157604051633250574960e11b81525f6004820152602401610854565b5f61138d83835f611165565b90506001600160a01b0381161561094c576040516339e3563760e11b81525f6004820152602401610854565b6001600160a01b0381165f90815260126020526040812054600d5490919069d3c21bcecceda1000000906113ed9084611f4c565b6113f79190611f63565b6001600160a01b0384165f9081526013602052604090205490915061141c9082611f82565b6001600160a01b0384165f9081526014602052604081208054909190611443908490611f39565b90915550506001600160a01b039092165f9081526013602052604090209190915550565b6001600160a01b03821661149957604051630b61174360e31b81526001600160a01b0383166004820152602401610854565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561162657604051630a85bd0160e11b81526001600160a01b0384169063150b7a029061154790889088908790879060040161234a565b6020604051808303815f875af1925050508015611581575060408051601f3d908101601f1916820190925261157e91810190612386565b60015b6115e8573d8080156115ae576040519150601f19603f3d011682016040523d82523d5f602084013e6115b3565b606091505b5080515f036115e057604051633250574960e11b81526001600160a01b0385166004820152602401610854565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461162457604051633250574960e11b81526001600160a01b0385166004820152602401610854565b505b5050505050565b60605f611639836118db565b60010190505f8167ffffffffffffffff81111561165857611658611db3565b6040519080825280601f01601f191660200182016040528015611682576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461168c57509392505050565b60606106a4826040518060600160405280604081526020016123a26040913960016119b2565b80806116f757506001600160a01b03821615155b156117b8575f61170684611120565b90506001600160a01b038316158015906117325750826001600160a01b0316816001600160a01b031614155b8015611745575061174381846110f3565b155b1561176e5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610854565b81156117b65783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f828152600260205260408120546001600160a01b039081169083161561181357611813818486611b2d565b6001600160a01b0381161561184d5761182e5f855f806116e3565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b0385161561187b576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a490505b9392505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106119195772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611945576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061196357662386f26fc10000830492506010015b6305f5e100831061197b576305f5e100830492506008015b612710831061198f57612710830492506004015b606483106119a1576064830492506002015b600a83106106a45760010192915050565b606083515f036119d0575060408051602081019091525f81526118d4565b5f82611a00576003855160046119e69190611f4c565b6119f1906002611f39565b6119fb9190611f63565b611a25565b600385516002611a109190611f39565b611a1a9190611f63565b611a25906004611f4c565b90505f8167ffffffffffffffff811115611a4157611a41611db3565b6040519080825280601f01601f191660200182016040528015611a6b576020820181803683370190505b509050600185016020820187885189016020810180515f82525b82841015611ae0576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450611a85565b905250508515611b2157600388510660018114611b045760028114611b1757611b1f565b603d6001830353603d6002830353611b1f565b603d60018303535b505b50909695505050505050565b611b38838383611b91565b61094c576001600160a01b038316611b6657604051637e27328960e01b815260048101829052602401610854565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610854565b5f6001600160a01b03831615801590611bed5750826001600160a01b0316846001600160a01b03161480611bca5750611bca84846110f3565b80611bed57505f828152600460205260409020546001600160a01b038481169116145b949350505050565b60405180608001604052806004906020820280368337509192915050565b6001600160e01b031981168114611c28575f80fd5b50565b5f60208284031215611c3b575f80fd5b81356118d481611c13565b5f5b83811015611c60578181015183820152602001611c48565b50505f910152565b5f8151808452611c7f816020860160208601611c46565b601f01601f19169290920160200192915050565b602081525f6118d46020830184611c68565b5f60208284031215611cb5575f80fd5b5035919050565b6001600160a01b0381168114611c28575f80fd5b5f8060408385031215611ce1575f80fd5b8235611cec81611cbc565b946020939093013593505050565b5f805f60608486031215611d0c575f80fd5b8335611d1781611cbc565b92506020840135611d2781611cbc565b929592945050506040919091013590565b5f60208284031215611d48575f80fd5b81356118d481611cbc565b5f60a08284031215611d63575f80fd5b8260a083011115611d72575f80fd5b50919050565b5f8060408385031215611d89575f80fd5b8235611d9481611cbc565b915060208301358015158114611da8575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611df057611df0611db3565b604052919050565b5f67ffffffffffffffff821115611e1157611e11611db3565b50601f01601f191660200190565b5f805f8060808587031215611e32575f80fd5b8435611e3d81611cbc565b93506020850135611e4d81611cbc565b925060408501359150606085013567ffffffffffffffff811115611e6f575f80fd5b8501601f81018713611e7f575f80fd5b8035611e92611e8d82611df8565b611dc7565b818152886020838501011115611ea6575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215611ed8575f80fd5b8235611ee381611cbc565b91506020830135611da881611cbc565b600181811c90821680611f0757607f821691505b602082108103611d7257634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106a4576106a4611f25565b80820281158282048414176106a4576106a4611f25565b5f82611f7d57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156106a4576106a4611f25565b6001600160a01b038316815260c0810160a08360208401379392505050565b5f60a08284031215611fc4575f80fd5b82601f830112611fd2575f80fd5b60405160a0810167ffffffffffffffff81118282101715611ff557611ff5611db3565b6040528060a0840185811115612009575f80fd5b845b8181101561203157805160ff81168114612023575f80fd5b83526020928301920161200b565b509195945050505050565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161206157612061611f25565b5060010190565b83815260e0810160a08460208401378260c0830152949350505050565b60ff84811682528316602082015260e0810160a0836040840137949350505050565b5f602082840312156120b7575f80fd5b81516118d481611cbc565b5f602082840312156120d2575f80fd5b815167ffffffffffffffff8111156120e8575f80fd5b8201601f810184136120f8575f80fd5b8051612106611e8d82611df8565b81815285602083850101111561211a575f80fd5b61212b826020830160208601611c46565b95945050505050565b5f8151612145818560208601611c46565b9290920192915050565b683d913730b6b2911d1160b91b815284515f90612173816009850160208a01611c46565b67204d696e6572202360c01b600991840191820152855161219b816011840160208a01611c46565b6009818301019150507f222c226465736372697074696f6e223a224167656e7420466f726765204d696e60088201527f65722c20666f72676564206f6e2d636861696e2066726f6d20352052656c696360288201527f73206f6e20424e4220436861696e2e2057656967687420436f6d6d6f6e20312c60488201527f205261726520322c204c6567656e64617279203320696e20746865206d61726b60688201527f6574206665652072657761726420706f6f6c2e20556e6f6666696369616c2c2060888201527f636f6c6c65637469626c65206f6e6c792c206e6f207969656c642070726f6d6960a88201527f7365642e222c22696d616765223a22646174613a696d6167652f7376672b786d60c8820152661b0edd5d198e0b60ca1b60e88201526122cb60ef820186612134565b6f222c2261747472696275746573223a5b60801b815290506122f06010820185612134565b615d7d60f01b8152600201979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161233d81601d850160208701611c46565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061237c90830184611c68565b9695505050505050565b5f60208284031215612396575f80fd5b81516118d481611c1356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220f72817b5cb4edfac9be80b9075d6e9fea914ccc1373feb754439aeeac18000e064736f6c634300081a0033000000000000000000000000bdfad8d283361f83e685307d6c2f71b4571c816a000000000000000000000000857f5c85f3a7b3c6d22add0bda2201308a3583c8000000000000000000000000e5310d5288c0f74452fd3b57cc09818b1f498eb0ee44c4b5cf68d276f4fd505172cc9b1f63021d6941a09967c41ec2dc8fdc4bdf","recompiledBytecode":"0x60e060405234801561000f575f80fd5b5060405161548838038061548883398101604081905261002e916101b9565b81604051806040016040528060118152602001704167656e7420466f7267652052656c696360781b8152506040518060400160405280600581526020016452454c494360d81b815250815f908161008591906102a1565b50600161009282826102a1565b5050506001600160a01b0381166100c257604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100cb81610144565b50600780546001600160a01b0319166001600160a01b0386811691909117909155821660a0526080819052604051839061010490610195565b6001600160a01b039091168152602001604051809103905ff08015801561012d573d5f803e3d5ffd5b506001600160a01b031660c0525061035b92505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b61268180612e0783390190565b6001600160a01b03811681146101b6575f80fd5b50565b5f805f80608085870312156101cc575f80fd5b84516101d7816101a2565b60208601519094506101e8816101a2565b60408601519093506101f9816101a2565b6060959095015193969295505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061023157607f821691505b60208210810361024f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561029c57805f5260205f20601f840160051c8101602085101561027a5750805b601f840160051c820191505b81811015610299575f8155600101610286565b50505b505050565b81516001600160401b038111156102ba576102ba610209565b6102ce816102c8845461021d565b84610255565b6020601f821160018114610300575f83156102e95750848201515b5f19600385901b1c1916600184901b178455610299565b5f84815260208120601f198516915b8281101561032f578785015182556020948501946001909201910161030f565b508482101561034c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60805160a05160c051612a746103935f395f81816106cb0152610a0d01525f818161076e0152610d4f01525f6105b40152612a745ff3fe6080604052600436106102bf575f3560e01c806370a082311161016f578063a624c3db116100d8578063d89135cd11610092578063e905182a1161006d578063e905182a14610853578063e985e9c51461087a578063f2fde38b14610899578063fc659491146108b8575f80fd5b8063d89135cd1461080b578063e6b1a3ae14610820578063e8a3d4851461083f575f80fd5b8063a624c3db1461075d578063b88d4fde14610790578063bce6d672146107af578063c87b56dd146107c3578063cd90e5af146107e2578063d21ff494146107f6575f80fd5b806396d597171161012957806396d59717146106ba5780639ba06ab8146106ed578063a0712d6814610702578063a22cb46514610715578063a2309ff814610734578063a475b5dd14610749575f80fd5b806370a082311461061d578063715018a61461063c5780638d859f3e146106505780638da5cb5b1461066a5780638f79306e1461068757806395d89b41146106a6575f80fd5b806324bbd0491161022b57806342842e0e116101e55780636352211e116101c05780636352211e146105845780636373a6b1146105a357806369d2ceb1146105d65780636e303cad146105f2575f80fd5b806342842e0e146105325780634ae23bd7146105515780635183022714610566575f80fd5b806324bbd04914610487578063263f3e7e146104a0578063301bd28e146104bf57806332cb6b0c146104de5780633ccfd60b146104f35780633cef28d214610507575f80fd5b8063193ee7b51161027c578063193ee7b5146103a6578063204aecb1146103d25780632097ac3b146103e757806322acaf04146103fc57806323b872dd1461043757806323f1892014610456575f80fd5b806301ffc9a7146102c357806306fdde03146102f7578063081812fc14610318578063095ea7b31461034f5780630f2cdd6c1461037057806318160ddd14610392575b5f80fd5b3480156102ce575f80fd5b506102e26102dd366004612156565b6108ce565b60405190151581526020015b60405180910390f35b348015610302575f80fd5b5061030b61091f565b6040516102ee91906121be565b348015610323575f80fd5b506103376103323660046121d0565b6109ae565b6040516001600160a01b0390911681526020016102ee565b34801561035a575f80fd5b5061036e610369366004612202565b6109d5565b005b34801561037b575f80fd5b50610384600a81565b6040519081526020016102ee565b34801561039d575f80fd5b506103846109e4565b3480156103b1575f80fd5b506103c56103c036600461222a565b6109fa565b6040516102ee9190612261565b3480156103dd575f80fd5b50610384600c5481565b3480156103f2575f80fd5b50610384600b5481565b348015610407575f80fd5b5061041b6104163660046121d0565b610b67565b6040805160ff909316835261ffff9091166020830152016102ee565b348015610442575f80fd5b5061036e610451366004612294565b610c25565b348015610461575f80fd5b506104756104703660046121d0565b610cae565b60405160ff90911681526020016102ee565b348015610492575f80fd5b50600a546102e29060ff1681565b3480156104ab575f80fd5b506103846104ba3660046121d0565b610cc2565b3480156104ca575f80fd5b50600754610337906001600160a01b031681565b3480156104e9575f80fd5b5061038461138881565b3480156104fe575f80fd5b5061036e610d3e565b348015610512575f80fd5b506103846105213660046122ce565b600d6020525f908152604090205481565b34801561053d575f80fd5b5061036e61054c366004612294565b610e27565b34801561055c575f80fd5b506103846104e281565b348015610571575f80fd5b50600a546102e290610100900460ff1681565b34801561058f575f80fd5b5061033761059e3660046121d0565b610e46565b3480156105ae575f80fd5b506103847f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e1575f80fd5b50600a54610100900460ff166102e2565b3480156105fd575f80fd5b5061038461060c3660046121d0565b600e6020525f908152604090205481565b348015610628575f80fd5b506103846106373660046122ce565b610e50565b348015610647575f80fd5b5061036e610e95565b34801561065b575f80fd5b506103846601c6bf5263400081565b348015610675575f80fd5b506006546001600160a01b0316610337565b348015610692575f80fd5b506103846106a1366004612202565b610ea8565b3480156106b1575f80fd5b5061030b610f10565b3480156106c5575f80fd5b506103377f000000000000000000000000000000000000000000000000000000000000000081565b3480156106f8575f80fd5b5061038461119481565b61036e6107103660046121d0565b610f1f565b348015610720575f80fd5b5061036e61072f3660046122e7565b611108565b34801561073f575f80fd5b5061038460085481565b348015610754575f80fd5b5061036e611113565b348015610768575f80fd5b506103377f000000000000000000000000000000000000000000000000000000000000000081565b34801561079b575f80fd5b5061036e6107aa36600461238c565b61125d565b3480156107ba575f80fd5b5061036e611275565b3480156107ce575f80fd5b5061030b6107dd3660046121d0565b6112b4565b3480156107ed575f80fd5b50610384600281565b348015610801575f80fd5b506103846106c081565b348015610816575f80fd5b5061038460095481565b34801561082b575f80fd5b5061036e61083a3660046122ce565b61152b565b34801561084a575f80fd5b5061030b6115b0565b34801561085e575f80fd5b506103377360b9262456de011f7d15a54cdd8c48baaa8b022f81565b348015610885575f80fd5b506102e2610894366004612430565b611641565b3480156108a4575f80fd5b5061036e6108b33660046122ce565b61166e565b3480156108c3575f80fd5b506103846212750081565b5f6001600160e01b031982166380ac58cd60e01b14806108fe57506001600160e01b03198216635b5e139f60e01b145b8061091957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f805461092d90612461565b80601f016020809104026020016040519081016040528092919081815260200182805461095990612461565b80156109a45780601f1061097b576101008083540402835291602001916109a4565b820191905f5260205f20905b81548152906001019060200180831161098757829003601f168201915b5050505050905090565b5f6109b8826116ab565b505f828152600460205260409020546001600160a01b0316610919565b6109e08282336116e3565b5050565b5f6009546008546109f591906124ad565b905090565b610a02612123565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a4b5760405163f3883b7560e01b815260040160405180910390fd5b600a54610100900460ff16610a7357604051631659379160e31b815260040160405180910390fd5b5f5b6005811015610b4857836001600160a01b0316610abc848360058110610a9d57610a9d6124c0565b60200201355f908152600260205260409020546001600160a01b031690565b6001600160a01b031614610ae3576040516359dc379f60e01b815260040160405180910390fd5b610b02838260058110610af857610af86124c0565b6020020135610cae565b828260058110610b1457610b146124c0565b60ff9092166020929092020152610b40838260058110610b3657610b366124c0565b60200201356116f0565b600101610a75565b50600560095f828254610b5b91906124d4565b90915550909392505050565b5f806113888310610bac5760405162461bcd60e51b8152600401610ba3906020808252600490820152631cdb1bdd60e21b604082015260600190565b60405180910390fd5b6104e2610bb884611728565b610bc291906124fb565b604080517f1d03a41ff33612e152ff5fa34d0d3c0f1e464becfd80c3cf15b9494ac7bc60db60208201529081018590529092506106c090606001604051602081830303815290604052805190602001205f1c610c1e919061250e565b9050915091565b6001600160a01b038216610c4e57604051633250574960e11b81525f6004820152602401610ba3565b5f610c5a8383336117be565b9050836001600160a01b0316816001600160a01b031614610ca8576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610ba3565b50505050565b5f610cbb61041683610cc2565b5092915050565b600a545f90610100900460ff16610cec57604051631659379160e31b815260040160405180910390fd5b811580610cfa575060085482115b15610d18576040516379d93f4960e01b815260040160405180910390fd5b600b5461138890610d2a6001856124ad565b610d3491906124d4565b610919919061250e565b60405147905f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169083908381818185875af1925050503d805f8114610da8576040519150601f19603f3d011682016040523d82523d5f602084013e610dad565b606091505b5050905080610df05760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610ba3565b6040518281527f430648de173157e069201c943adb2d4e340e7cf5b27b1b09c9cb852f03d63b569060200160405180910390a15050565b610e4183838360405180602001604052805f81525061125d565b505050565b5f610919826116ab565b5f6001600160a01b038216610e7a576040516322718ad960e21b81525f6004820152602401610ba3565b506001600160a01b03165f9081526003602052604090205490565b610e9d611818565b610ea65f611845565b565b6001600160a01b0382165f908152600d6020526040812054816002821015610eda57610ed58260026124ad565b610edc565b5f5b9050808411610eeb575f610f07565b6601c6bf52634000610efd82866124ad565b610f079190612521565b95945050505050565b60606001805461092d90612461565b600a5460ff16610f425760405163589ed34b60e01b815260040160405180910390fd5b6040516370a0823160e01b81523360048201527360b9262456de011f7d15a54cdd8c48baaa8b022f906370a0823190602401602060405180830381865afa158015610f8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb39190612538565b5f03610fd257604051630d9ab13f60e01b815260040160405180910390fd5b805f03610ff257604051635caa42ff60e01b815260040160405180910390fd5b60085461138861100283836124d4565b1115611021576040516352df9fe560e01b815260040160405180910390fd5b335f908152600d6020526040902054600a9061103e9084906124d4565b111561105c5760405162a84d4b60e71b815260040160405180910390fd5b6110663383610ea8565b34146110855760405163788a686f60e01b815260040160405180910390fd5b335f908152600d6020526040812080548492906110a39084906124d4565b909155506110b3905082826124d4565b600855600c541580156110d157506111946110ce83836124d4565b10155b156110db5742600c555b60015b828111610e41576110f8336110f383856124d4565b611896565b6111018161254f565b90506110de565b6109e03383836118f7565b600a54610100900460ff161561113c5760405163a89ac15160e01b815260040160405180910390fd5b61119460085410156111615760405163c349402d60e01b815260040160405180910390fd5b6006546001600160a01b0316331480159061117f5750611388600854105b801561119a575062127500600c5461119791906124d4565b42105b156111b85760405163c349402d60e01b815260040160405180910390fd5b611388446111c76001436124ad565b600854604080516020810194909452914091830191909152606082015230608082015260a001604051602081830303815290604052805190602001205f1c61120f919061250e565b600b819055600a805461ff001916610100179055604080519182523360208301527f6e9dac3f3f833c1d527aa989d3a673884ddc11e31fdccc11ccd8aebf1ae069ac910160405180910390a1565b611268848484610c25565b610ca83385858585611995565b61127d611818565b600a805460ff191660011790556040517f4301b55b3d4fd9018308a6bd66bf37880623a9548566d1b12867ab619a993ca1905f90a1565b60606112bf826116ab565b506060806060600a60019054906101000a900460ff16611390576112e285611abd565b6040516020016112f29190612582565b60408051808303601f190181529082905260075463c1b27b6160e01b8352600483018890529094506001600160a01b03169063c1b27b61906024015f60405180830381865afa158015611347573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261136e91908101906125b7565b9150604051806060016040528060288152602001612a176028913990506114d6565b5f8061139e61041688610cc2565b915091506113ae8260ff16611b4d565b6113b788611abd565b6040516020016113c8929190612620565b60408051808303601f19018152908290526007546399faa5b360e01b8352600483018a905260ff8516602484015261ffff841660448401529096506001600160a01b0316906399faa5b3906064015f60405180830381865afa158015611430573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261145791908101906125b7565b6007546040516318f6670d60e21b815260ff8516600482015261ffff841660248201529195506001600160a01b0316906363d99c34906044015f60405180830381865afa1580156114aa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114d191908101906125b7565b925050505b6115028383836040516020016114ee93929190612662565b604051602081830303815290604052611bed565b60405160200161151291906127cf565b6040516020818303038152906040529350505050919050565b611533611818565b600a54610100900460ff161561155c576040516313ef243160e11b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527f89382d75256b43b6826ad8d6cbd8e517eaf5e10f1ef4c8f123c9a25ac4529b559060200160405180910390a150565b60075460405163c1b27b6160e01b81525f60048201526060916001600160a01b03169063c1b27b61906024015f60405180830381865afa1580156115f6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261161d91908101906125b7565b60405160200161162d9190612813565b604051602081830303815290604052905090565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b611676611818565b6001600160a01b03811661169f57604051631e4fbdf760e01b81525f6004820152602401610ba3565b6116a881611845565b50565b5f818152600260205260408120546001600160a01b03168061091957604051637e27328960e01b815260048101849052602401610ba3565b610e418383836001611c13565b5f6116fc5f835f6117be565b90506001600160a01b0381166109e057604051637e27328960e01b815260048101839052602401610ba3565b5f5b600782901c607f83165f5b60048110156117a657604080517f1d03a41ff33612e152ff5fa34d0d3c0f1e464becfd80c3cf15b9494ac7bc60db6020820152908101829052606081018390525f9060800160408051808303601f1901815291905280516020909101209293607f9093169092189150600101611735565b5060079190911b17915061138882101561172a575090565b5f6117ca848484611d17565b90506001600160a01b038116158015906117ec57506001600160a01b03841615155b15611811575f838152600e60205260408120805490919061180c9061254f565b909155505b9392505050565b6006546001600160a01b03163314610ea65760405163118cdaa760e01b8152336004820152602401610ba3565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166118bf57604051633250574960e11b81525f6004820152602401610ba3565b5f6118cb83835f6117be565b90506001600160a01b03811615610e41576040516339e3563760e11b81525f6004820152602401610ba3565b6001600160a01b03821661192957604051630b61174360e31b81526001600160a01b0383166004820152602401610ba3565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b15611ab657604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906119d790889088908790879060040161297f565b6020604051808303815f875af1925050508015611a11575060408051601f3d908101601f19168201909252611a0e918101906129bb565b60015b611a78573d808015611a3e576040519150601f19603f3d011682016040523d82523d5f602084013e611a43565b606091505b5080515f03611a7057604051633250574960e11b81526001600160a01b0385166004820152602401610ba3565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14611ab457604051633250574960e11b81526001600160a01b0385166004820152602401610ba3565b505b5050505050565b60605f611ac983611e09565b60010190505f8167ffffffffffffffff811115611ae857611ae8612320565b6040519080825280601f01601f191660200182016040528015611b12576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611b1c57509392505050565b6060815f03611b765750506040805180820190915260048152634669726560e01b602082015290565b81600103611b9f5750506040805180820190915260058152642bb0ba32b960d91b602082015290565b81600203611bc857505060408051808201909152600581526408ac2e4e8d60db1b602082015290565b50506040805180820190915260098152684c696768746e696e6760b81b602082015290565b6060610919826040518060600160405280604081526020016129d7604091396001611ee0565b8080611c2757506001600160a01b03821615155b15611ce8575f611c36846116ab565b90506001600160a01b03831615801590611c625750826001600160a01b0316816001600160a01b031614155b8015611c755750611c738184611641565b155b15611c9e5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610ba3565b8115611ce65783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f828152600260205260408120546001600160a01b0390811690831615611d4357611d4381848661205b565b6001600160a01b03811615611d7d57611d5e5f855f80611c13565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615611dab576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e475772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611e73576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611e9157662386f26fc10000830492506010015b6305f5e1008310611ea9576305f5e100830492506008015b6127108310611ebd57612710830492506004015b60648310611ecf576064830492506002015b600a83106109195760010192915050565b606083515f03611efe575060408051602081019091525f8152611811565b5f82611f2e57600385516004611f149190612521565b611f1f9060026124d4565b611f2991906124fb565b611f53565b600385516002611f3e91906124d4565b611f4891906124fb565b611f53906004612521565b90505f8167ffffffffffffffff811115611f6f57611f6f612320565b6040519080825280601f01601f191660200182016040528015611f99576020820181803683370190505b509050600185016020820187885189016020810180515f82525b8284101561200e576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450611fb3565b90525050851561204f5760038851066001811461203257600281146120455761204d565b603d6001830353603d600283035361204d565b603d60018303535b505b50909695505050505050565b6120668383836120bf565b610e41576001600160a01b03831661209457604051637e27328960e01b815260048101829052602401610ba3565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610ba3565b5f6001600160a01b0383161580159061211b5750826001600160a01b0316846001600160a01b031614806120f857506120f88484611641565b8061211b57505f828152600460205260409020546001600160a01b038481169116145b949350505050565b6040518060a001604052806005906020820280368337509192915050565b6001600160e01b0319811681146116a8575f80fd5b5f60208284031215612166575f80fd5b813561181181612141565b5f5b8381101561218b578181015183820152602001612173565b50505f910152565b5f81518084526121aa816020860160208601612171565b601f01601f19169290920160200192915050565b602081525f6118116020830184612193565b5f602082840312156121e0575f80fd5b5035919050565b80356001600160a01b03811681146121fd575f80fd5b919050565b5f8060408385031215612213575f80fd5b61221c836121e7565b946020939093013593505050565b5f8060c0838503121561223b575f80fd5b612244836121e7565b91508360c084011115612255575f80fd5b50926020919091019150565b60a0810181835f5b600581101561228b57815160ff16835260209283019290910190600101612269565b50505092915050565b5f805f606084860312156122a6575f80fd5b6122af846121e7565b92506122bd602085016121e7565b929592945050506040919091013590565b5f602082840312156122de575f80fd5b611811826121e7565b5f80604083850312156122f8575f80fd5b612301836121e7565b915060208301358015158114612315575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561235d5761235d612320565b604052919050565b5f67ffffffffffffffff82111561237e5761237e612320565b50601f01601f191660200190565b5f805f806080858703121561239f575f80fd5b6123a8856121e7565b93506123b6602086016121e7565b925060408501359150606085013567ffffffffffffffff8111156123d8575f80fd5b8501601f810187136123e8575f80fd5b80356123fb6123f682612365565b612334565b81815288602083850101111561240f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215612441575f80fd5b61244a836121e7565b9150612458602084016121e7565b90509250929050565b600181811c9082168061247557607f821691505b60208210810361249357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561091957610919612499565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561091957610919612499565b634e487b7160e01b5f52601260045260245ffd5b5f82612509576125096124e7565b500490565b5f8261251c5761251c6124e7565b500690565b808202811582820484141761091957610919612499565b5f60208284031215612548575f80fd5b5051919050565b5f6001820161256057612560612499565b5060010190565b5f8151612578818560208601612171565b9290920192915050565b6d5365616c65642052656c6963202360901b81525f82516125aa81600e850160208701612171565b91909101600e0192915050565b5f602082840312156125c7575f80fd5b815167ffffffffffffffff8111156125dd575f80fd5b8201601f810184136125ed575f80fd5b80516125fb6123f682612365565b81815285602083850101111561260f575f80fd5b610f07826020830160208601612171565b5f8351612631818460208801612171565b672052656c6963202360c01b9083019081528351612656816008840160208801612171565b01600801949350505050565b683d913730b6b2911d1160b91b815283515f90612686816009850160208901612171565b7f222c226465736372697074696f6e223a224167656e7420466f7267653a20352c6009918401918201527f303030206f6e2d636861696e20706978656c2072656c69637320666f72202e6160298201527f69204167656e7420494420686f6c64657273206f6e20424e4220436861696e2e60498201527f20466f72676520352052656c69637320696e746f2031204d696e65722e20556e60698201527f6f6666696369616c2c20636f6c6c65637469626c65206f6e6c792c206e6f207960898201527f69656c642070726f6d697365642e222c22696d616765223a22646174613a696d60a9820152701859d94bdcdd99cade1b5b0edd5d198e0b607a1b60c982015261279560da820186612567565b6f222c2261747472696275746573223a5b60801b815290506127ba6010820185612567565b615d7d60f01b81526002019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161280681601d850160208701612171565b91909101601d0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081527f7b226e616d65223a224167656e7420466f7267652052656c6963222c22646573601b8201527f6372697074696f6e223a22352c303030206f6e2d636861696e20706978656c20603b8201527f72656c69637320696e20666f757220656c656d656e747320666f72202e616920605b8201527f4167656e7420494420686f6c64657273206f6e20424e4220436861696e2e2042607b8201527f75726e203520696e2074686520466f72676520746f206d696e742061204d696e609b8201527f65722e20556e6f6666696369616c2c20636f6c6c65637469626c65206f6e6c7960bb8201527f2e222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b7560db820152631d198e0b60e21b60fb8201525f82516129618160ff850160208701612171565b820161297460ff820161227d60f01b9052565b610101019392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906129b190830184612193565b9695505050505050565b5f602082840312156129cb575f80fd5b81516118118161214156fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f7b2274726169745f74797065223a22537461747573222c2276616c7565223a225365616c6564227da264697066735822122048023ede6f67d3681b9045c99c65b5db0a558760d9abe82b0ee0e395dd37670764736f6c634300081a003360c060405234801561000f575f80fd5b5060405161268138038061268183398101604081905261002e916100ae565b6040518060400160405280601181526020017020b3b2b73a102337b933b29026b4b732b960791b8152506040518060400160405280600581526020016426a4a722a960d91b815250815f90816100849190610173565b5060016100918282610173565b5050600160065550336080526001600160a01b031660a05261022d565b5f602082840312156100be575f80fd5b81516001600160a01b03811681146100d4575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061010357607f821691505b60208210810361012157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561016e57805f5260205f20601f840160051c8101602085101561014c5750805b601f840160051c820191505b8181101561016b575f8155600101610158565b50505b505050565b81516001600160401b0381111561018c5761018c6100db565b6101a08161019a84546100ef565b84610127565b6020601f8211600181146101d2575f83156101bb5750848201515b5f19600385901b1c1916600184901b17845561016b565b5f84815260208120601f198516915b8281101561020157878501518255602094850194600190920191016101e1565b508482101561021e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60805160a05161241761026a5f395f81816104de01528181610f85015261103101525f8181610511015281816109890152610db301526124175ff3fe6080604052600436106101e6575f3560e01c806370a0823111610108578063aa6bb09a1161009d578063dd4bc1011161006d578063dd4bc101146105ba578063df18e047146105e5578063df1c455c14610610578063e985e9c514610625578063ff50abdc14610644575f80fd5b8063aa6bb09a14610552578063b88d4fde14610567578063c87b56dd14610586578063d54ad2a1146105a5575f80fd5b806396c82e57116100d857806396c82e57146104b85780639cb84a01146104cd5780639fe45cb414610500578063a22cb46514610533575f80fd5b806370a08231146104525780638c715407146104715780638da5cb5b1461049057806395d89b41146104a4575f80fd5b806331d7a2621161017e5780634e71d92d1161014e5780634e71d92d146103c95780635873eb9b146103dd5780636352211e146104085780636e303cad14610427575f80fd5b806331d7a2621461034d57806342842e0e1461036c57806348380a101461038b5780634e2a08a7146103aa575f80fd5b8063152111f7116101b9578063152111f71461029757806318160ddd1461029f57806323b872dd146102c25780632e340599146102e1575f80fd5b806301ffc9a7146101ea57806306fdde031461021e578063081812fc1461023f578063095ea7b314610276575b5f80fd5b3480156101f5575f80fd5b50610209610204366004611c2b565b610659565b60405190151581526020015b60405180910390f35b348015610229575f80fd5b506102326106aa565b6040516102159190611c93565b34801561024a575f80fd5b5061025e610259366004611ca5565b610739565b6040516001600160a01b039091168152602001610215565b348015610281575f80fd5b50610295610290366004611cd0565b610760565b005b61029561076f565b3480156102aa575f80fd5b506102b460075481565b604051908152602001610215565b3480156102cd575f80fd5b506102956102dc366004611cfa565b61082f565b3480156102ec575f80fd5b506103276102fb366004611ca5565b60086020525f908152604090205460ff8082169161010081049091169062010000900463ffffffff1683565b6040805160ff948516815293909216602084015263ffffffff1690820152606001610215565b348015610358575f80fd5b506102b4610367366004611d38565b6108bd565b348015610377575f80fd5b50610295610386366004611cfa565b610932565b348015610396575f80fd5b506102b46103a5366004611ca5565b610951565b3480156103b5575f80fd5b506102b46103c4366004611d53565b610967565b3480156103d4575f80fd5b506102b4610c31565b3480156103e8575f80fd5b506102b46103f7366004611d38565b60136020525f908152604090205481565b348015610413575f80fd5b5061025e610422366004611ca5565b610d45565b348015610432575f80fd5b506102b4610441366004611ca5565b600c6020525f908152604090205481565b34801561045d575f80fd5b506102b461046c366004611d38565b610d4f565b34801561047c575f80fd5b506102b461048b366004611ca5565b610d94565b34801561049b575f80fd5b5061025e610db0565b3480156104af575f80fd5b50610232610e36565b3480156104c3575f80fd5b506102b4600e5481565b3480156104d8575f80fd5b5061025e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561050b575f80fd5b5061025e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561053e575f80fd5b5061029561054d366004611d78565b610e45565b34801561055d575f80fd5b506102b4600d5481565b348015610572575f80fd5b50610295610581366004611e1f565b610e50565b348015610591575f80fd5b506102326105a0366004611ca5565b610e68565b3480156105b0575f80fd5b506102b460115481565b3480156105c5575f80fd5b506102b46105d4366004611d38565b60126020525f908152604090205481565b3480156105f0575f80fd5b506102b46105ff366004611d38565b60146020525f908152604090205481565b34801561061b575f80fd5b506102b4600f5481565b348015610630575f80fd5b5061020961063f366004611ec7565b6110f3565b34801561064f575f80fd5b506102b460105481565b5f6001600160e01b031982166380ac58cd60e01b148061068957506001600160e01b03198216635b5e139f60e01b145b806106a457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f80546106b890611ef3565b80601f01602080910402602001604051908101604052809291908181526020018280546106e490611ef3565b801561072f5780601f106107065761010080835404028352916020019161072f565b820191905f5260205f20905b81548152906001019060200180831161071257829003601f168201915b5050505050905090565b5f61074382611120565b505f828152600460205260409020546001600160a01b03166106a4565b61076b828233611158565b5050565b3460105f8282546107809190611f39565b9091555050600e5434905f036107ac5780600f5f8282546107a19190611f39565b909155506107f79050565b600f546107b99082611f39565b5f600f55600e549091506107d769d3c21bcecceda100000083611f4c565b6107e19190611f63565b600d5f8282546107f19190611f39565b90915550505b60405134815233907fb8b27d0db504fa5d914f1fd330347096e88d5ff94b6c612d32797e7c12a8f66f9060200160405180910390a250565b6001600160a01b03821661085d57604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f610869838333611165565b9050836001600160a01b0316816001600160a01b0316146108b7576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610854565b50505050565b6001600160a01b0381165f90815260136020908152604080832054600d54601290935290832054909169d3c21bcecceda1000000916108fc9190611f4c565b6109069190611f63565b6001600160a01b0384165f908152601460205260409020546109289190611f39565b6106a49190611f82565b61094c83838360405180602001604052805f815250610e50565b505050565b60098160038110610960575f80fd5b0154905081565b5f61097061132e565b60405163193ee7b560e01b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063193ee7b5906109c09033908790600401611f95565b60a0604051808303815f875af11580156109dc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a009190611fb4565b9050610a0a611bf5565b5f5b6005811015610a595781838260058110610a2857610a2861203c565b602002015160ff1660048110610a4057610a4061203c565b602002018051610a4f90612050565b9052600101610a0c565b505f805f805f5b6004811015610ad6575f868260048110610a7c57610a7c61203c565b60200201511115610a9357610a9083612050565b92505b81868260048110610aa657610aa661203c565b60200201511115610ace57858160048110610ac357610ac361203c565b602002015191508093505b600101610a60565b5080600503610ae85760029350610af5565b81600403610af557600193505b60075f8154610b0390612050565b919050819055965060405180606001604052808560ff1681526020018460ff168152602001448a8a604051602001610b3d93929190612068565b60408051601f19818403018152918152815160209283012063ffffffff9081169093525f8b81526008835281902084518154938601519590920151909316620100000265ffffffff00001960ff9586166101000261ffff19909416928616929092179290921716179055600990851660038110610bbc57610bbc61203c565b015f8154610bc990612050565b90915550610bd73388611358565b86336001600160a01b03167ed277013b02e1a1b26a701cc2c235f4cacbb71e1b5210bab28f6cb73ffaa3b186868c604051610c1493929190612085565b60405180910390a3505050505050610c2c6001600655565b919050565b5f610c3a61132e565b610c43336113b9565b50335f9081526014602052604081205490819003610c74576040516312d37ee560e31b815260040160405180910390fd5b335f90815260146020526040812081905560118054839290610c97908490611f39565b90915550506040515f90339083908381818185875af1925050503d805f8114610cdb576040519150601f19603f3d011682016040523d82523d5f602084013e610ce0565b606091505b5050905080610d025760405163197121f560e01b815260040160405180910390fd5b60405182815233907fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a9060200160405180910390a250610d426001600655565b90565b5f6106a482611120565b5f6001600160a01b038216610d79576040516322718ad960e21b81525f6004820152602401610854565b506001600160a01b03165f9081526003602052604090205490565b5f818152600860205260408120546106a49060ff166001611f39565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3191906120a7565b905090565b6060600180546106b890611ef3565b61076b338383611467565b610e5b84848461082f565b6108b73385858585611505565b6060610e7382611120565b505f8281526008602090815260408083208151606081018352905460ff80821680845261010083049091169483019490945262010000900463ffffffff1691810191909152919015610f1657815f015160ff16600114610ef457604051806040016040528060098152602001684c6567656e6461727960b81b815250610f36565b604051806040016040528060048152602001635261726560e01b815250610f36565b6040518060400160405280600681526020016521b7b6b6b7b760d11b8152505b90506110cb81610f458661162d565b8451602086015160408088015190516303cf49a760e61b8152600481018b905260ff938416602482015292909116604483015263ffffffff1660648201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f3d269c0906084015f60405180830381865afa158015610fd1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ff891908101906120c2565b85516020870151604080890151905163acafc2cb60e01b815260ff938416600482015292909116602483015263ffffffff1660448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063acafc2cb906064015f60405180830381865afa15801561107d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110a491908101906120c2565b6040516020016110b7949392919061214f565b6040516020818303038152906040526116bd565b6040516020016110db9190612306565b60405160208183030381529060405292505050919050565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b5f818152600260205260408120546001600160a01b0316806106a457604051637e27328960e01b815260048101849052602401610854565b61094c83838360016116e3565b5f6111718484846117e7565b90505f61117d84610d94565b90506001600160a01b0382161561123057611197826113b9565b6001600160a01b0382165f90815260126020526040812080548392906111be908490611f82565b9091555050600d546001600160a01b0383165f9081526012602052604090205469d3c21bcecceda1000000916111f391611f4c565b6111fd9190611f63565b6001600160a01b0383165f90815260136020526040812091909155600e805483929061122a908490611f82565b90915550505b6001600160a01b038516156112e157611248856113b9565b6001600160a01b0385165f908152601260205260408120805483929061126f908490611f39565b9091555050600d546001600160a01b0386165f9081526012602052604090205469d3c21bcecceda1000000916112a491611f4c565b6112ae9190611f63565b6001600160a01b0386165f90815260136020526040812091909155600e80548392906112db908490611f39565b90915550505b6001600160a01b0382161580159061130157506001600160a01b03851615155b15611326575f848152600c60205260408120805490919061132190612050565b909155505b509392505050565b60026006540361135157604051633ee5aeb560e01b815260040160405180910390fd5b6002600655565b6001600160a01b03821661138157604051633250574960e11b81525f6004820152602401610854565b5f61138d83835f611165565b90506001600160a01b0381161561094c576040516339e3563760e11b81525f6004820152602401610854565b6001600160a01b0381165f90815260126020526040812054600d5490919069d3c21bcecceda1000000906113ed9084611f4c565b6113f79190611f63565b6001600160a01b0384165f9081526013602052604090205490915061141c9082611f82565b6001600160a01b0384165f9081526014602052604081208054909190611443908490611f39565b90915550506001600160a01b039092165f9081526013602052604090209190915550565b6001600160a01b03821661149957604051630b61174360e31b81526001600160a01b0383166004820152602401610854565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561162657604051630a85bd0160e11b81526001600160a01b0384169063150b7a029061154790889088908790879060040161234a565b6020604051808303815f875af1925050508015611581575060408051601f3d908101601f1916820190925261157e91810190612386565b60015b6115e8573d8080156115ae576040519150601f19603f3d011682016040523d82523d5f602084013e6115b3565b606091505b5080515f036115e057604051633250574960e11b81526001600160a01b0385166004820152602401610854565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461162457604051633250574960e11b81526001600160a01b0385166004820152602401610854565b505b5050505050565b60605f611639836118db565b60010190505f8167ffffffffffffffff81111561165857611658611db3565b6040519080825280601f01601f191660200182016040528015611682576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461168c57509392505050565b60606106a4826040518060600160405280604081526020016123a26040913960016119b2565b80806116f757506001600160a01b03821615155b156117b8575f61170684611120565b90506001600160a01b038316158015906117325750826001600160a01b0316816001600160a01b031614155b8015611745575061174381846110f3565b155b1561176e5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610854565b81156117b65783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f828152600260205260408120546001600160a01b039081169083161561181357611813818486611b2d565b6001600160a01b0381161561184d5761182e5f855f806116e3565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b0385161561187b576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a490505b9392505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106119195772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611945576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061196357662386f26fc10000830492506010015b6305f5e100831061197b576305f5e100830492506008015b612710831061198f57612710830492506004015b606483106119a1576064830492506002015b600a83106106a45760010192915050565b606083515f036119d0575060408051602081019091525f81526118d4565b5f82611a00576003855160046119e69190611f4c565b6119f1906002611f39565b6119fb9190611f63565b611a25565b600385516002611a109190611f39565b611a1a9190611f63565b611a25906004611f4c565b90505f8167ffffffffffffffff811115611a4157611a41611db3565b6040519080825280601f01601f191660200182016040528015611a6b576020820181803683370190505b509050600185016020820187885189016020810180515f82525b82841015611ae0576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450611a85565b905250508515611b2157600388510660018114611b045760028114611b1757611b1f565b603d6001830353603d6002830353611b1f565b603d60018303535b505b50909695505050505050565b611b38838383611b91565b61094c576001600160a01b038316611b6657604051637e27328960e01b815260048101829052602401610854565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610854565b5f6001600160a01b03831615801590611bed5750826001600160a01b0316846001600160a01b03161480611bca5750611bca84846110f3565b80611bed57505f828152600460205260409020546001600160a01b038481169116145b949350505050565b60405180608001604052806004906020820280368337509192915050565b6001600160e01b031981168114611c28575f80fd5b50565b5f60208284031215611c3b575f80fd5b81356118d481611c13565b5f5b83811015611c60578181015183820152602001611c48565b50505f910152565b5f8151808452611c7f816020860160208601611c46565b601f01601f19169290920160200192915050565b602081525f6118d46020830184611c68565b5f60208284031215611cb5575f80fd5b5035919050565b6001600160a01b0381168114611c28575f80fd5b5f8060408385031215611ce1575f80fd5b8235611cec81611cbc565b946020939093013593505050565b5f805f60608486031215611d0c575f80fd5b8335611d1781611cbc565b92506020840135611d2781611cbc565b929592945050506040919091013590565b5f60208284031215611d48575f80fd5b81356118d481611cbc565b5f60a08284031215611d63575f80fd5b8260a083011115611d72575f80fd5b50919050565b5f8060408385031215611d89575f80fd5b8235611d9481611cbc565b915060208301358015158114611da8575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611df057611df0611db3565b604052919050565b5f67ffffffffffffffff821115611e1157611e11611db3565b50601f01601f191660200190565b5f805f8060808587031215611e32575f80fd5b8435611e3d81611cbc565b93506020850135611e4d81611cbc565b925060408501359150606085013567ffffffffffffffff811115611e6f575f80fd5b8501601f81018713611e7f575f80fd5b8035611e92611e8d82611df8565b611dc7565b818152886020838501011115611ea6575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215611ed8575f80fd5b8235611ee381611cbc565b91506020830135611da881611cbc565b600181811c90821680611f0757607f821691505b602082108103611d7257634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106a4576106a4611f25565b80820281158282048414176106a4576106a4611f25565b5f82611f7d57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156106a4576106a4611f25565b6001600160a01b038316815260c0810160a08360208401379392505050565b5f60a08284031215611fc4575f80fd5b82601f830112611fd2575f80fd5b60405160a0810167ffffffffffffffff81118282101715611ff557611ff5611db3565b6040528060a0840185811115612009575f80fd5b845b8181101561203157805160ff81168114612023575f80fd5b83526020928301920161200b565b509195945050505050565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161206157612061611f25565b5060010190565b83815260e0810160a08460208401378260c0830152949350505050565b60ff84811682528316602082015260e0810160a0836040840137949350505050565b5f602082840312156120b7575f80fd5b81516118d481611cbc565b5f602082840312156120d2575f80fd5b815167ffffffffffffffff8111156120e8575f80fd5b8201601f810184136120f8575f80fd5b8051612106611e8d82611df8565b81815285602083850101111561211a575f80fd5b61212b826020830160208601611c46565b95945050505050565b5f8151612145818560208601611c46565b9290920192915050565b683d913730b6b2911d1160b91b815284515f90612173816009850160208a01611c46565b67204d696e6572202360c01b600991840191820152855161219b816011840160208a01611c46565b6009818301019150507f222c226465736372697074696f6e223a224167656e7420466f726765204d696e60088201527f65722c20666f72676564206f6e2d636861696e2066726f6d20352052656c696360288201527f73206f6e20424e4220436861696e2e2057656967687420436f6d6d6f6e20312c60488201527f205261726520322c204c6567656e64617279203320696e20746865206d61726b60688201527f6574206665652072657761726420706f6f6c2e20556e6f6666696369616c2c2060888201527f636f6c6c65637469626c65206f6e6c792c206e6f207969656c642070726f6d6960a88201527f7365642e222c22696d616765223a22646174613a696d6167652f7376672b786d60c8820152661b0edd5d198e0b60ca1b60e88201526122cb60ef820186612134565b6f222c2261747472696275746573223a5b60801b815290506122f06010820185612134565b615d7d60f01b8152600201979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161233d81601d850160208701611c46565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061237c90830184611c68565b9695505050505050565b5f60208284031215612396575f80fd5b81516118d481611c1356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220f72817b5cb4edfac9be80b9075d6e9fea914ccc1373feb754439aeeac18000e064736f6c634300081a0033","sourceMap":"1328:9634:21:-:0;;;3599:320;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3754:8;1380:113:2;;;;;;;;;;;;;-1:-1:-1;;;1380:113:2;;;;;;;;;;;;;;;;-1:-1:-1;;;1380:113:2;;;1454:5;1446;:13;;;;;;:::i;:::-;-1:-1:-1;1469:7:2;:17;1479:7;1469;:17;:::i;:::-;-1:-1:-1;;;;;;;;1273:26:0;;1269:95;;1322:31;;-1:-1:-1;;;1322:31:0;;1350:1;1322:31;;;3531:51:23;3504:18;;1322:31:0;;;;;;;1269:95;1373:32;1392:12;1373:18;:32::i;:::-;-1:-1:-1;3778:3:21::2;:25:::0;;-1:-1:-1;;;;;;3778:25:21::2;-1:-1:-1::0;;;;;3778:25:21;;::::2;::::0;;;::::2;::::0;;;3813:19;::::2;;::::0;3842:23:::2;::::0;;;3883:29:::2;::::0;3903:8;;3883:29:::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;;;;;3549:32:23;;;3531:51;;3519:2;3504:18;3883:29:21::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;;;3875:37:21::2;;::::0;-1:-1:-1;1328:9634:21;;-1:-1:-1;;;1328:9634:21;2912:187:0;3004:6;;;-1:-1:-1;;;;;3020:17:0;;;-1:-1:-1;;;;;;3020:17:0;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;1328:9634:21:-;;;;;;;;:::o;14:131:23:-;-1:-1:-1;;;;;89:31:23;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:589::-;255:6;263;271;279;332:3;320:9;311:7;307:23;303:33;300:53;;;349:1;346;339:12;300:53;381:9;375:16;400:31;425:5;400:31;:::i;:::-;500:2;485:18;;479:25;450:5;;-1:-1:-1;513:33:23;479:25;513:33;:::i;:::-;617:2;602:18;;596:25;565:7;;-1:-1:-1;630:33:23;596:25;630:33;:::i;:::-;729:2;714:18;;;;708:25;150:589;;;;-1:-1:-1;;;150:589:23:o;744:127::-;805:10;800:3;796:20;793:1;786:31;836:4;833:1;826:15;860:4;857:1;850:15;876:380;955:1;951:12;;;;998;;;1019:61;;1073:4;1065:6;1061:17;1051:27;;1019:61;1126:2;1118:6;1115:14;1095:18;1092:38;1089:161;;1172:10;1167:3;1163:20;1160:1;1153:31;1207:4;1204:1;1197:15;1235:4;1232:1;1225:15;1089:161;;876:380;;;:::o;1387:518::-;1489:2;1484:3;1481:11;1478:421;;;1525:5;1522:1;1515:16;1569:4;1566:1;1556:18;1639:2;1627:10;1623:19;1620:1;1616:27;1610:4;1606:38;1675:4;1663:10;1660:20;1657:47;;;-1:-1:-1;1698:4:23;1657:47;1753:2;1748:3;1744:12;1741:1;1737:20;1731:4;1727:31;1717:41;;1808:81;1826:2;1819:5;1816:13;1808:81;;;1885:1;1871:16;;1852:1;1841:13;1808:81;;;1812:3;;1478:421;1387:518;;;:::o;2081:1299::-;2201:10;;-1:-1:-1;;;;;2223:30:23;;2220:56;;;2256:18;;:::i;:::-;2285:97;2375:6;2335:38;2367:4;2361:11;2335:38;:::i;:::-;2329:4;2285:97;:::i;:::-;2431:4;2462:2;2451:14;;2479:1;2474:649;;;;3167:1;3184:6;3181:89;;;-1:-1:-1;3236:19:23;;;3230:26;3181:89;-1:-1:-1;;2038:1:23;2034:11;;;2030:24;2026:29;2016:40;2062:1;2058:11;;;2013:57;3283:81;;2444:930;;2474:649;1334:1;1327:14;;;1371:4;1358:18;;-1:-1:-1;;2510:20:23;;;2628:222;2642:7;2639:1;2636:14;2628:222;;;2724:19;;;2718:26;2703:42;;2831:4;2816:20;;;;2784:1;2772:14;;;;2658:12;2628:222;;;2632:3;2878:6;2869:7;2866:19;2863:201;;;2939:19;;;2933:26;-1:-1:-1;;3022:1:23;3018:14;;;3034:3;3014:24;3010:37;3006:42;2991:58;2976:74;;2863:201;-1:-1:-1;;;;3110:1:23;3094:14;;;3090:22;3077:36;;-1:-1:-1;2081:1299:23:o;3385:203::-;1328:9634:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa264697066735822122048023ede6f67d3681b9045c99c65b5db0a558760d9abe82b0ee0e395dd37670764736f6c634300081a0033","offset":11730},"2":{"value":"0xa2646970667358221220f72817b5cb4edfac9be80b9075d6e9fea914ccc1373feb754439aeeac18000e064736f6c634300081a0033","offset":21587}},"transformations":[{"type":"insert","offset":21640,"reason":"constructorArguments"}],"transformationValues":{"constructorArguments":"0x000000000000000000000000bdfad8d283361f83e685307d6c2f71b4571c816a000000000000000000000000857f5c85f3a7b3c6d22add0bda2201308a3583c8000000000000000000000000e5310d5288c0f74452fd3b57cc09818b1f498eb0ee44c4b5cf68d276f4fd505172cc9b1f63021d6941a09967c41ec2dc8fdc4bdf"}},"runtimeBytecode":{"onchainBytecode":"0x6080604052600436106102bf575f3560e01c806370a082311161016f578063a624c3db116100d8578063d89135cd11610092578063e905182a1161006d578063e905182a14610853578063e985e9c51461087a578063f2fde38b14610899578063fc659491146108b8575f80fd5b8063d89135cd1461080b578063e6b1a3ae14610820578063e8a3d4851461083f575f80fd5b8063a624c3db1461075d578063b88d4fde14610790578063bce6d672146107af578063c87b56dd146107c3578063cd90e5af146107e2578063d21ff494146107f6575f80fd5b806396d597171161012957806396d59717146106ba5780639ba06ab8146106ed578063a0712d6814610702578063a22cb46514610715578063a2309ff814610734578063a475b5dd14610749575f80fd5b806370a082311461061d578063715018a61461063c5780638d859f3e146106505780638da5cb5b1461066a5780638f79306e1461068757806395d89b41146106a6575f80fd5b806324bbd0491161022b57806342842e0e116101e55780636352211e116101c05780636352211e146105845780636373a6b1146105a357806369d2ceb1146105d65780636e303cad146105f2575f80fd5b806342842e0e146105325780634ae23bd7146105515780635183022714610566575f80fd5b806324bbd04914610487578063263f3e7e146104a0578063301bd28e146104bf57806332cb6b0c146104de5780633ccfd60b146104f35780633cef28d214610507575f80fd5b8063193ee7b51161027c578063193ee7b5146103a6578063204aecb1146103d25780632097ac3b146103e757806322acaf04146103fc57806323b872dd1461043757806323f1892014610456575f80fd5b806301ffc9a7146102c357806306fdde03146102f7578063081812fc14610318578063095ea7b31461034f5780630f2cdd6c1461037057806318160ddd14610392575b5f80fd5b3480156102ce575f80fd5b506102e26102dd366004612156565b6108ce565b60405190151581526020015b60405180910390f35b348015610302575f80fd5b5061030b61091f565b6040516102ee91906121be565b348015610323575f80fd5b506103376103323660046121d0565b6109ae565b6040516001600160a01b0390911681526020016102ee565b34801561035a575f80fd5b5061036e610369366004612202565b6109d5565b005b34801561037b575f80fd5b50610384600a81565b6040519081526020016102ee565b34801561039d575f80fd5b506103846109e4565b3480156103b1575f80fd5b506103c56103c036600461222a565b6109fa565b6040516102ee9190612261565b3480156103dd575f80fd5b50610384600c5481565b3480156103f2575f80fd5b50610384600b5481565b348015610407575f80fd5b5061041b6104163660046121d0565b610b67565b6040805160ff909316835261ffff9091166020830152016102ee565b348015610442575f80fd5b5061036e610451366004612294565b610c25565b348015610461575f80fd5b506104756104703660046121d0565b610cae565b60405160ff90911681526020016102ee565b348015610492575f80fd5b50600a546102e29060ff1681565b3480156104ab575f80fd5b506103846104ba3660046121d0565b610cc2565b3480156104ca575f80fd5b50600754610337906001600160a01b031681565b3480156104e9575f80fd5b5061038461138881565b3480156104fe575f80fd5b5061036e610d3e565b348015610512575f80fd5b506103846105213660046122ce565b600d6020525f908152604090205481565b34801561053d575f80fd5b5061036e61054c366004612294565b610e27565b34801561055c575f80fd5b506103846104e281565b348015610571575f80fd5b50600a546102e290610100900460ff1681565b34801561058f575f80fd5b5061033761059e3660046121d0565b610e46565b3480156105ae575f80fd5b506103847fee44c4b5cf68d276f4fd505172cc9b1f63021d6941a09967c41ec2dc8fdc4bdf81565b3480156105e1575f80fd5b50600a54610100900460ff166102e2565b3480156105fd575f80fd5b5061038461060c3660046121d0565b600e6020525f908152604090205481565b348015610628575f80fd5b506103846106373660046122ce565b610e50565b348015610647575f80fd5b5061036e610e95565b34801561065b575f80fd5b506103846601c6bf5263400081565b348015610675575f80fd5b506006546001600160a01b0316610337565b348015610692575f80fd5b506103846106a1366004612202565b610ea8565b3480156106b1575f80fd5b5061030b610f10565b3480156106c5575f80fd5b506103377f00000000000000000000000028c599b3367493c8b0a0b7e4416c191be0b0999381565b3480156106f8575f80fd5b5061038461119481565b61036e6107103660046121d0565b610f1f565b348015610720575f80fd5b5061036e61072f3660046122e7565b611108565b34801561073f575f80fd5b5061038460085481565b348015610754575f80fd5b5061036e611113565b348015610768575f80fd5b506103377f000000000000000000000000e5310d5288c0f74452fd3b57cc09818b1f498eb081565b34801561079b575f80fd5b5061036e6107aa36600461238c565b61125d565b3480156107ba575f80fd5b5061036e611275565b3480156107ce575f80fd5b5061030b6107dd3660046121d0565b6112b4565b3480156107ed575f80fd5b50610384600281565b348015610801575f80fd5b506103846106c081565b348015610816575f80fd5b5061038460095481565b34801561082b575f80fd5b5061036e61083a3660046122ce565b61152b565b34801561084a575f80fd5b5061030b6115b0565b34801561085e575f80fd5b506103377360b9262456de011f7d15a54cdd8c48baaa8b022f81565b348015610885575f80fd5b506102e2610894366004612430565b611641565b3480156108a4575f80fd5b5061036e6108b33660046122ce565b61166e565b3480156108c3575f80fd5b506103846212750081565b5f6001600160e01b031982166380ac58cd60e01b14806108fe57506001600160e01b03198216635b5e139f60e01b145b8061091957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f805461092d90612461565b80601f016020809104026020016040519081016040528092919081815260200182805461095990612461565b80156109a45780601f1061097b576101008083540402835291602001916109a4565b820191905f5260205f20905b81548152906001019060200180831161098757829003601f168201915b5050505050905090565b5f6109b8826116ab565b505f828152600460205260409020546001600160a01b0316610919565b6109e08282336116e3565b5050565b5f6009546008546109f591906124ad565b905090565b610a02612123565b336001600160a01b037f00000000000000000000000028c599b3367493c8b0a0b7e4416c191be0b099931614610a4b5760405163f3883b7560e01b815260040160405180910390fd5b600a54610100900460ff16610a7357604051631659379160e31b815260040160405180910390fd5b5f5b6005811015610b4857836001600160a01b0316610abc848360058110610a9d57610a9d6124c0565b60200201355f908152600260205260409020546001600160a01b031690565b6001600160a01b031614610ae3576040516359dc379f60e01b815260040160405180910390fd5b610b02838260058110610af857610af86124c0565b6020020135610cae565b828260058110610b1457610b146124c0565b60ff9092166020929092020152610b40838260058110610b3657610b366124c0565b60200201356116f0565b600101610a75565b50600560095f828254610b5b91906124d4565b90915550909392505050565b5f806113888310610bac5760405162461bcd60e51b8152600401610ba3906020808252600490820152631cdb1bdd60e21b604082015260600190565b60405180910390fd5b6104e2610bb884611728565b610bc291906124fb565b604080517f1d03a41ff33612e152ff5fa34d0d3c0f1e464becfd80c3cf15b9494ac7bc60db60208201529081018590529092506106c090606001604051602081830303815290604052805190602001205f1c610c1e919061250e565b9050915091565b6001600160a01b038216610c4e57604051633250574960e11b81525f6004820152602401610ba3565b5f610c5a8383336117be565b9050836001600160a01b0316816001600160a01b031614610ca8576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610ba3565b50505050565b5f610cbb61041683610cc2565b5092915050565b600a545f90610100900460ff16610cec57604051631659379160e31b815260040160405180910390fd5b811580610cfa575060085482115b15610d18576040516379d93f4960e01b815260040160405180910390fd5b600b5461138890610d2a6001856124ad565b610d3491906124d4565b610919919061250e565b60405147905f906001600160a01b037f000000000000000000000000e5310d5288c0f74452fd3b57cc09818b1f498eb0169083908381818185875af1925050503d805f8114610da8576040519150601f19603f3d011682016040523d82523d5f602084013e610dad565b606091505b5050905080610df05760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610ba3565b6040518281527f430648de173157e069201c943adb2d4e340e7cf5b27b1b09c9cb852f03d63b569060200160405180910390a15050565b610e4183838360405180602001604052805f81525061125d565b505050565b5f610919826116ab565b5f6001600160a01b038216610e7a576040516322718ad960e21b81525f6004820152602401610ba3565b506001600160a01b03165f9081526003602052604090205490565b610e9d611818565b610ea65f611845565b565b6001600160a01b0382165f908152600d6020526040812054816002821015610eda57610ed58260026124ad565b610edc565b5f5b9050808411610eeb575f610f07565b6601c6bf52634000610efd82866124ad565b610f079190612521565b95945050505050565b60606001805461092d90612461565b600a5460ff16610f425760405163589ed34b60e01b815260040160405180910390fd5b6040516370a0823160e01b81523360048201527360b9262456de011f7d15a54cdd8c48baaa8b022f906370a0823190602401602060405180830381865afa158015610f8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb39190612538565b5f03610fd257604051630d9ab13f60e01b815260040160405180910390fd5b805f03610ff257604051635caa42ff60e01b815260040160405180910390fd5b60085461138861100283836124d4565b1115611021576040516352df9fe560e01b815260040160405180910390fd5b335f908152600d6020526040902054600a9061103e9084906124d4565b111561105c5760405162a84d4b60e71b815260040160405180910390fd5b6110663383610ea8565b34146110855760405163788a686f60e01b815260040160405180910390fd5b335f908152600d6020526040812080548492906110a39084906124d4565b909155506110b3905082826124d4565b600855600c541580156110d157506111946110ce83836124d4565b10155b156110db5742600c555b60015b828111610e41576110f8336110f383856124d4565b611896565b6111018161254f565b90506110de565b6109e03383836118f7565b600a54610100900460ff161561113c5760405163a89ac15160e01b815260040160405180910390fd5b61119460085410156111615760405163c349402d60e01b815260040160405180910390fd5b6006546001600160a01b0316331480159061117f5750611388600854105b801561119a575062127500600c5461119791906124d4565b42105b156111b85760405163c349402d60e01b815260040160405180910390fd5b611388446111c76001436124ad565b600854604080516020810194909452914091830191909152606082015230608082015260a001604051602081830303815290604052805190602001205f1c61120f919061250e565b600b819055600a805461ff001916610100179055604080519182523360208301527f6e9dac3f3f833c1d527aa989d3a673884ddc11e31fdccc11ccd8aebf1ae069ac910160405180910390a1565b611268848484610c25565b610ca83385858585611995565b61127d611818565b600a805460ff191660011790556040517f4301b55b3d4fd9018308a6bd66bf37880623a9548566d1b12867ab619a993ca1905f90a1565b60606112bf826116ab565b506060806060600a60019054906101000a900460ff16611390576112e285611abd565b6040516020016112f29190612582565b60408051808303601f190181529082905260075463c1b27b6160e01b8352600483018890529094506001600160a01b03169063c1b27b61906024015f60405180830381865afa158015611347573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261136e91908101906125b7565b9150604051806060016040528060288152602001612a176028913990506114d6565b5f8061139e61041688610cc2565b915091506113ae8260ff16611b4d565b6113b788611abd565b6040516020016113c8929190612620565b60408051808303601f19018152908290526007546399faa5b360e01b8352600483018a905260ff8516602484015261ffff841660448401529096506001600160a01b0316906399faa5b3906064015f60405180830381865afa158015611430573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261145791908101906125b7565b6007546040516318f6670d60e21b815260ff8516600482015261ffff841660248201529195506001600160a01b0316906363d99c34906044015f60405180830381865afa1580156114aa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114d191908101906125b7565b925050505b6115028383836040516020016114ee93929190612662565b604051602081830303815290604052611bed565b60405160200161151291906127cf565b6040516020818303038152906040529350505050919050565b611533611818565b600a54610100900460ff161561155c576040516313ef243160e11b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527f89382d75256b43b6826ad8d6cbd8e517eaf5e10f1ef4c8f123c9a25ac4529b559060200160405180910390a150565b60075460405163c1b27b6160e01b81525f60048201526060916001600160a01b03169063c1b27b61906024015f60405180830381865afa1580156115f6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261161d91908101906125b7565b60405160200161162d9190612813565b604051602081830303815290604052905090565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b611676611818565b6001600160a01b03811661169f57604051631e4fbdf760e01b81525f6004820152602401610ba3565b6116a881611845565b50565b5f818152600260205260408120546001600160a01b03168061091957604051637e27328960e01b815260048101849052602401610ba3565b610e418383836001611c13565b5f6116fc5f835f6117be565b90506001600160a01b0381166109e057604051637e27328960e01b815260048101839052602401610ba3565b5f5b600782901c607f83165f5b60048110156117a657604080517f1d03a41ff33612e152ff5fa34d0d3c0f1e464becfd80c3cf15b9494ac7bc60db6020820152908101829052606081018390525f9060800160408051808303601f1901815291905280516020909101209293607f9093169092189150600101611735565b5060079190911b17915061138882101561172a575090565b5f6117ca848484611d17565b90506001600160a01b038116158015906117ec57506001600160a01b03841615155b15611811575f838152600e60205260408120805490919061180c9061254f565b909155505b9392505050565b6006546001600160a01b03163314610ea65760405163118cdaa760e01b8152336004820152602401610ba3565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166118bf57604051633250574960e11b81525f6004820152602401610ba3565b5f6118cb83835f6117be565b90506001600160a01b03811615610e41576040516339e3563760e11b81525f6004820152602401610ba3565b6001600160a01b03821661192957604051630b61174360e31b81526001600160a01b0383166004820152602401610ba3565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b15611ab657604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906119d790889088908790879060040161297f565b6020604051808303815f875af1925050508015611a11575060408051601f3d908101601f19168201909252611a0e918101906129bb565b60015b611a78573d808015611a3e576040519150601f19603f3d011682016040523d82523d5f602084013e611a43565b606091505b5080515f03611a7057604051633250574960e11b81526001600160a01b0385166004820152602401610ba3565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14611ab457604051633250574960e11b81526001600160a01b0385166004820152602401610ba3565b505b5050505050565b60605f611ac983611e09565b60010190505f8167ffffffffffffffff811115611ae857611ae8612320565b6040519080825280601f01601f191660200182016040528015611b12576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611b1c57509392505050565b6060815f03611b765750506040805180820190915260048152634669726560e01b602082015290565b81600103611b9f5750506040805180820190915260058152642bb0ba32b960d91b602082015290565b81600203611bc857505060408051808201909152600581526408ac2e4e8d60db1b602082015290565b50506040805180820190915260098152684c696768746e696e6760b81b602082015290565b6060610919826040518060600160405280604081526020016129d7604091396001611ee0565b8080611c2757506001600160a01b03821615155b15611ce8575f611c36846116ab565b90506001600160a01b03831615801590611c625750826001600160a01b0316816001600160a01b031614155b8015611c755750611c738184611641565b155b15611c9e5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610ba3565b8115611ce65783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f828152600260205260408120546001600160a01b0390811690831615611d4357611d4381848661205b565b6001600160a01b03811615611d7d57611d5e5f855f80611c13565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615611dab576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e475772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611e73576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611e9157662386f26fc10000830492506010015b6305f5e1008310611ea9576305f5e100830492506008015b6127108310611ebd57612710830492506004015b60648310611ecf576064830492506002015b600a83106109195760010192915050565b606083515f03611efe575060408051602081019091525f8152611811565b5f82611f2e57600385516004611f149190612521565b611f1f9060026124d4565b611f2991906124fb565b611f53565b600385516002611f3e91906124d4565b611f4891906124fb565b611f53906004612521565b90505f8167ffffffffffffffff811115611f6f57611f6f612320565b6040519080825280601f01601f191660200182016040528015611f99576020820181803683370190505b509050600185016020820187885189016020810180515f82525b8284101561200e576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450611fb3565b90525050851561204f5760038851066001811461203257600281146120455761204d565b603d6001830353603d600283035361204d565b603d60018303535b505b50909695505050505050565b6120668383836120bf565b610e41576001600160a01b03831661209457604051637e27328960e01b815260048101829052602401610ba3565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610ba3565b5f6001600160a01b0383161580159061211b5750826001600160a01b0316846001600160a01b031614806120f857506120f88484611641565b8061211b57505f828152600460205260409020546001600160a01b038481169116145b949350505050565b6040518060a001604052806005906020820280368337509192915050565b6001600160e01b0319811681146116a8575f80fd5b5f60208284031215612166575f80fd5b813561181181612141565b5f5b8381101561218b578181015183820152602001612173565b50505f910152565b5f81518084526121aa816020860160208601612171565b601f01601f19169290920160200192915050565b602081525f6118116020830184612193565b5f602082840312156121e0575f80fd5b5035919050565b80356001600160a01b03811681146121fd575f80fd5b919050565b5f8060408385031215612213575f80fd5b61221c836121e7565b946020939093013593505050565b5f8060c0838503121561223b575f80fd5b612244836121e7565b91508360c084011115612255575f80fd5b50926020919091019150565b60a0810181835f5b600581101561228b57815160ff16835260209283019290910190600101612269565b50505092915050565b5f805f606084860312156122a6575f80fd5b6122af846121e7565b92506122bd602085016121e7565b929592945050506040919091013590565b5f602082840312156122de575f80fd5b611811826121e7565b5f80604083850312156122f8575f80fd5b612301836121e7565b915060208301358015158114612315575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561235d5761235d612320565b604052919050565b5f67ffffffffffffffff82111561237e5761237e612320565b50601f01601f191660200190565b5f805f806080858703121561239f575f80fd5b6123a8856121e7565b93506123b6602086016121e7565b925060408501359150606085013567ffffffffffffffff8111156123d8575f80fd5b8501601f810187136123e8575f80fd5b80356123fb6123f682612365565b612334565b81815288602083850101111561240f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215612441575f80fd5b61244a836121e7565b9150612458602084016121e7565b90509250929050565b600181811c9082168061247557607f821691505b60208210810361249357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561091957610919612499565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561091957610919612499565b634e487b7160e01b5f52601260045260245ffd5b5f82612509576125096124e7565b500490565b5f8261251c5761251c6124e7565b500690565b808202811582820484141761091957610919612499565b5f60208284031215612548575f80fd5b5051919050565b5f6001820161256057612560612499565b5060010190565b5f8151612578818560208601612171565b9290920192915050565b6d5365616c65642052656c6963202360901b81525f82516125aa81600e850160208701612171565b91909101600e0192915050565b5f602082840312156125c7575f80fd5b815167ffffffffffffffff8111156125dd575f80fd5b8201601f810184136125ed575f80fd5b80516125fb6123f682612365565b81815285602083850101111561260f575f80fd5b610f07826020830160208601612171565b5f8351612631818460208801612171565b672052656c6963202360c01b9083019081528351612656816008840160208801612171565b01600801949350505050565b683d913730b6b2911d1160b91b815283515f90612686816009850160208901612171565b7f222c226465736372697074696f6e223a224167656e7420466f7267653a20352c6009918401918201527f303030206f6e2d636861696e20706978656c2072656c69637320666f72202e6160298201527f69204167656e7420494420686f6c64657273206f6e20424e4220436861696e2e60498201527f20466f72676520352052656c69637320696e746f2031204d696e65722e20556e60698201527f6f6666696369616c2c20636f6c6c65637469626c65206f6e6c792c206e6f207960898201527f69656c642070726f6d697365642e222c22696d616765223a22646174613a696d60a9820152701859d94bdcdd99cade1b5b0edd5d198e0b607a1b60c982015261279560da820186612567565b6f222c2261747472696275746573223a5b60801b815290506127ba6010820185612567565b615d7d60f01b81526002019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161280681601d850160208701612171565b91909101601d0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081527f7b226e616d65223a224167656e7420466f7267652052656c6963222c22646573601b8201527f6372697074696f6e223a22352c303030206f6e2d636861696e20706978656c20603b8201527f72656c69637320696e20666f757220656c656d656e747320666f72202e616920605b8201527f4167656e7420494420686f6c64657273206f6e20424e4220436861696e2e2042607b8201527f75726e203520696e2074686520466f72676520746f206d696e742061204d696e609b8201527f65722e20556e6f6666696369616c2c20636f6c6c65637469626c65206f6e6c7960bb8201527f2e222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b7560db820152631d198e0b60e21b60fb8201525f82516129618160ff850160208701612171565b820161297460ff820161227d60f01b9052565b610101019392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906129b190830184612193565b9695505050505050565b5f602082840312156129cb575f80fd5b81516118118161214156fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f7b2274726169745f74797065223a22537461747573222c2276616c7565223a225365616c6564227da264697066735822122048023ede6f67d3681b9045c99c65b5db0a558760d9abe82b0ee0e395dd37670764736f6c634300081a0033","recompiledBytecode":"0x6080604052600436106102bf575f3560e01c806370a082311161016f578063a624c3db116100d8578063d89135cd11610092578063e905182a1161006d578063e905182a14610853578063e985e9c51461087a578063f2fde38b14610899578063fc659491146108b8575f80fd5b8063d89135cd1461080b578063e6b1a3ae14610820578063e8a3d4851461083f575f80fd5b8063a624c3db1461075d578063b88d4fde14610790578063bce6d672146107af578063c87b56dd146107c3578063cd90e5af146107e2578063d21ff494146107f6575f80fd5b806396d597171161012957806396d59717146106ba5780639ba06ab8146106ed578063a0712d6814610702578063a22cb46514610715578063a2309ff814610734578063a475b5dd14610749575f80fd5b806370a082311461061d578063715018a61461063c5780638d859f3e146106505780638da5cb5b1461066a5780638f79306e1461068757806395d89b41146106a6575f80fd5b806324bbd0491161022b57806342842e0e116101e55780636352211e116101c05780636352211e146105845780636373a6b1146105a357806369d2ceb1146105d65780636e303cad146105f2575f80fd5b806342842e0e146105325780634ae23bd7146105515780635183022714610566575f80fd5b806324bbd04914610487578063263f3e7e146104a0578063301bd28e146104bf57806332cb6b0c146104de5780633ccfd60b146104f35780633cef28d214610507575f80fd5b8063193ee7b51161027c578063193ee7b5146103a6578063204aecb1146103d25780632097ac3b146103e757806322acaf04146103fc57806323b872dd1461043757806323f1892014610456575f80fd5b806301ffc9a7146102c357806306fdde03146102f7578063081812fc14610318578063095ea7b31461034f5780630f2cdd6c1461037057806318160ddd14610392575b5f80fd5b3480156102ce575f80fd5b506102e26102dd366004612156565b6108ce565b60405190151581526020015b60405180910390f35b348015610302575f80fd5b5061030b61091f565b6040516102ee91906121be565b348015610323575f80fd5b506103376103323660046121d0565b6109ae565b6040516001600160a01b0390911681526020016102ee565b34801561035a575f80fd5b5061036e610369366004612202565b6109d5565b005b34801561037b575f80fd5b50610384600a81565b6040519081526020016102ee565b34801561039d575f80fd5b506103846109e4565b3480156103b1575f80fd5b506103c56103c036600461222a565b6109fa565b6040516102ee9190612261565b3480156103dd575f80fd5b50610384600c5481565b3480156103f2575f80fd5b50610384600b5481565b348015610407575f80fd5b5061041b6104163660046121d0565b610b67565b6040805160ff909316835261ffff9091166020830152016102ee565b348015610442575f80fd5b5061036e610451366004612294565b610c25565b348015610461575f80fd5b506104756104703660046121d0565b610cae565b60405160ff90911681526020016102ee565b348015610492575f80fd5b50600a546102e29060ff1681565b3480156104ab575f80fd5b506103846104ba3660046121d0565b610cc2565b3480156104ca575f80fd5b50600754610337906001600160a01b031681565b3480156104e9575f80fd5b5061038461138881565b3480156104fe575f80fd5b5061036e610d3e565b348015610512575f80fd5b506103846105213660046122ce565b600d6020525f908152604090205481565b34801561053d575f80fd5b5061036e61054c366004612294565b610e27565b34801561055c575f80fd5b506103846104e281565b348015610571575f80fd5b50600a546102e290610100900460ff1681565b34801561058f575f80fd5b5061033761059e3660046121d0565b610e46565b3480156105ae575f80fd5b506103847f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e1575f80fd5b50600a54610100900460ff166102e2565b3480156105fd575f80fd5b5061038461060c3660046121d0565b600e6020525f908152604090205481565b348015610628575f80fd5b506103846106373660046122ce565b610e50565b348015610647575f80fd5b5061036e610e95565b34801561065b575f80fd5b506103846601c6bf5263400081565b348015610675575f80fd5b506006546001600160a01b0316610337565b348015610692575f80fd5b506103846106a1366004612202565b610ea8565b3480156106b1575f80fd5b5061030b610f10565b3480156106c5575f80fd5b506103377f000000000000000000000000000000000000000000000000000000000000000081565b3480156106f8575f80fd5b5061038461119481565b61036e6107103660046121d0565b610f1f565b348015610720575f80fd5b5061036e61072f3660046122e7565b611108565b34801561073f575f80fd5b5061038460085481565b348015610754575f80fd5b5061036e611113565b348015610768575f80fd5b506103377f000000000000000000000000000000000000000000000000000000000000000081565b34801561079b575f80fd5b5061036e6107aa36600461238c565b61125d565b3480156107ba575f80fd5b5061036e611275565b3480156107ce575f80fd5b5061030b6107dd3660046121d0565b6112b4565b3480156107ed575f80fd5b50610384600281565b348015610801575f80fd5b506103846106c081565b348015610816575f80fd5b5061038460095481565b34801561082b575f80fd5b5061036e61083a3660046122ce565b61152b565b34801561084a575f80fd5b5061030b6115b0565b34801561085e575f80fd5b506103377360b9262456de011f7d15a54cdd8c48baaa8b022f81565b348015610885575f80fd5b506102e2610894366004612430565b611641565b3480156108a4575f80fd5b5061036e6108b33660046122ce565b61166e565b3480156108c3575f80fd5b506103846212750081565b5f6001600160e01b031982166380ac58cd60e01b14806108fe57506001600160e01b03198216635b5e139f60e01b145b8061091957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f805461092d90612461565b80601f016020809104026020016040519081016040528092919081815260200182805461095990612461565b80156109a45780601f1061097b576101008083540402835291602001916109a4565b820191905f5260205f20905b81548152906001019060200180831161098757829003601f168201915b5050505050905090565b5f6109b8826116ab565b505f828152600460205260409020546001600160a01b0316610919565b6109e08282336116e3565b5050565b5f6009546008546109f591906124ad565b905090565b610a02612123565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a4b5760405163f3883b7560e01b815260040160405180910390fd5b600a54610100900460ff16610a7357604051631659379160e31b815260040160405180910390fd5b5f5b6005811015610b4857836001600160a01b0316610abc848360058110610a9d57610a9d6124c0565b60200201355f908152600260205260409020546001600160a01b031690565b6001600160a01b031614610ae3576040516359dc379f60e01b815260040160405180910390fd5b610b02838260058110610af857610af86124c0565b6020020135610cae565b828260058110610b1457610b146124c0565b60ff9092166020929092020152610b40838260058110610b3657610b366124c0565b60200201356116f0565b600101610a75565b50600560095f828254610b5b91906124d4565b90915550909392505050565b5f806113888310610bac5760405162461bcd60e51b8152600401610ba3906020808252600490820152631cdb1bdd60e21b604082015260600190565b60405180910390fd5b6104e2610bb884611728565b610bc291906124fb565b604080517f1d03a41ff33612e152ff5fa34d0d3c0f1e464becfd80c3cf15b9494ac7bc60db60208201529081018590529092506106c090606001604051602081830303815290604052805190602001205f1c610c1e919061250e565b9050915091565b6001600160a01b038216610c4e57604051633250574960e11b81525f6004820152602401610ba3565b5f610c5a8383336117be565b9050836001600160a01b0316816001600160a01b031614610ca8576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610ba3565b50505050565b5f610cbb61041683610cc2565b5092915050565b600a545f90610100900460ff16610cec57604051631659379160e31b815260040160405180910390fd5b811580610cfa575060085482115b15610d18576040516379d93f4960e01b815260040160405180910390fd5b600b5461138890610d2a6001856124ad565b610d3491906124d4565b610919919061250e565b60405147905f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169083908381818185875af1925050503d805f8114610da8576040519150601f19603f3d011682016040523d82523d5f602084013e610dad565b606091505b5050905080610df05760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610ba3565b6040518281527f430648de173157e069201c943adb2d4e340e7cf5b27b1b09c9cb852f03d63b569060200160405180910390a15050565b610e4183838360405180602001604052805f81525061125d565b505050565b5f610919826116ab565b5f6001600160a01b038216610e7a576040516322718ad960e21b81525f6004820152602401610ba3565b506001600160a01b03165f9081526003602052604090205490565b610e9d611818565b610ea65f611845565b565b6001600160a01b0382165f908152600d6020526040812054816002821015610eda57610ed58260026124ad565b610edc565b5f5b9050808411610eeb575f610f07565b6601c6bf52634000610efd82866124ad565b610f079190612521565b95945050505050565b60606001805461092d90612461565b600a5460ff16610f425760405163589ed34b60e01b815260040160405180910390fd5b6040516370a0823160e01b81523360048201527360b9262456de011f7d15a54cdd8c48baaa8b022f906370a0823190602401602060405180830381865afa158015610f8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb39190612538565b5f03610fd257604051630d9ab13f60e01b815260040160405180910390fd5b805f03610ff257604051635caa42ff60e01b815260040160405180910390fd5b60085461138861100283836124d4565b1115611021576040516352df9fe560e01b815260040160405180910390fd5b335f908152600d6020526040902054600a9061103e9084906124d4565b111561105c5760405162a84d4b60e71b815260040160405180910390fd5b6110663383610ea8565b34146110855760405163788a686f60e01b815260040160405180910390fd5b335f908152600d6020526040812080548492906110a39084906124d4565b909155506110b3905082826124d4565b600855600c541580156110d157506111946110ce83836124d4565b10155b156110db5742600c555b60015b828111610e41576110f8336110f383856124d4565b611896565b6111018161254f565b90506110de565b6109e03383836118f7565b600a54610100900460ff161561113c5760405163a89ac15160e01b815260040160405180910390fd5b61119460085410156111615760405163c349402d60e01b815260040160405180910390fd5b6006546001600160a01b0316331480159061117f5750611388600854105b801561119a575062127500600c5461119791906124d4565b42105b156111b85760405163c349402d60e01b815260040160405180910390fd5b611388446111c76001436124ad565b600854604080516020810194909452914091830191909152606082015230608082015260a001604051602081830303815290604052805190602001205f1c61120f919061250e565b600b819055600a805461ff001916610100179055604080519182523360208301527f6e9dac3f3f833c1d527aa989d3a673884ddc11e31fdccc11ccd8aebf1ae069ac910160405180910390a1565b611268848484610c25565b610ca83385858585611995565b61127d611818565b600a805460ff191660011790556040517f4301b55b3d4fd9018308a6bd66bf37880623a9548566d1b12867ab619a993ca1905f90a1565b60606112bf826116ab565b506060806060600a60019054906101000a900460ff16611390576112e285611abd565b6040516020016112f29190612582565b60408051808303601f190181529082905260075463c1b27b6160e01b8352600483018890529094506001600160a01b03169063c1b27b61906024015f60405180830381865afa158015611347573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261136e91908101906125b7565b9150604051806060016040528060288152602001612a176028913990506114d6565b5f8061139e61041688610cc2565b915091506113ae8260ff16611b4d565b6113b788611abd565b6040516020016113c8929190612620565b60408051808303601f19018152908290526007546399faa5b360e01b8352600483018a905260ff8516602484015261ffff841660448401529096506001600160a01b0316906399faa5b3906064015f60405180830381865afa158015611430573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261145791908101906125b7565b6007546040516318f6670d60e21b815260ff8516600482015261ffff841660248201529195506001600160a01b0316906363d99c34906044015f60405180830381865afa1580156114aa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114d191908101906125b7565b925050505b6115028383836040516020016114ee93929190612662565b604051602081830303815290604052611bed565b60405160200161151291906127cf565b6040516020818303038152906040529350505050919050565b611533611818565b600a54610100900460ff161561155c576040516313ef243160e11b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527f89382d75256b43b6826ad8d6cbd8e517eaf5e10f1ef4c8f123c9a25ac4529b559060200160405180910390a150565b60075460405163c1b27b6160e01b81525f60048201526060916001600160a01b03169063c1b27b61906024015f60405180830381865afa1580156115f6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261161d91908101906125b7565b60405160200161162d9190612813565b604051602081830303815290604052905090565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b611676611818565b6001600160a01b03811661169f57604051631e4fbdf760e01b81525f6004820152602401610ba3565b6116a881611845565b50565b5f818152600260205260408120546001600160a01b03168061091957604051637e27328960e01b815260048101849052602401610ba3565b610e418383836001611c13565b5f6116fc5f835f6117be565b90506001600160a01b0381166109e057604051637e27328960e01b815260048101839052602401610ba3565b5f5b600782901c607f83165f5b60048110156117a657604080517f1d03a41ff33612e152ff5fa34d0d3c0f1e464becfd80c3cf15b9494ac7bc60db6020820152908101829052606081018390525f9060800160408051808303601f1901815291905280516020909101209293607f9093169092189150600101611735565b5060079190911b17915061138882101561172a575090565b5f6117ca848484611d17565b90506001600160a01b038116158015906117ec57506001600160a01b03841615155b15611811575f838152600e60205260408120805490919061180c9061254f565b909155505b9392505050565b6006546001600160a01b03163314610ea65760405163118cdaa760e01b8152336004820152602401610ba3565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166118bf57604051633250574960e11b81525f6004820152602401610ba3565b5f6118cb83835f6117be565b90506001600160a01b03811615610e41576040516339e3563760e11b81525f6004820152602401610ba3565b6001600160a01b03821661192957604051630b61174360e31b81526001600160a01b0383166004820152602401610ba3565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b15611ab657604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906119d790889088908790879060040161297f565b6020604051808303815f875af1925050508015611a11575060408051601f3d908101601f19168201909252611a0e918101906129bb565b60015b611a78573d808015611a3e576040519150601f19603f3d011682016040523d82523d5f602084013e611a43565b606091505b5080515f03611a7057604051633250574960e11b81526001600160a01b0385166004820152602401610ba3565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14611ab457604051633250574960e11b81526001600160a01b0385166004820152602401610ba3565b505b5050505050565b60605f611ac983611e09565b60010190505f8167ffffffffffffffff811115611ae857611ae8612320565b6040519080825280601f01601f191660200182016040528015611b12576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611b1c57509392505050565b6060815f03611b765750506040805180820190915260048152634669726560e01b602082015290565b81600103611b9f5750506040805180820190915260058152642bb0ba32b960d91b602082015290565b81600203611bc857505060408051808201909152600581526408ac2e4e8d60db1b602082015290565b50506040805180820190915260098152684c696768746e696e6760b81b602082015290565b6060610919826040518060600160405280604081526020016129d7604091396001611ee0565b8080611c2757506001600160a01b03821615155b15611ce8575f611c36846116ab565b90506001600160a01b03831615801590611c625750826001600160a01b0316816001600160a01b031614155b8015611c755750611c738184611641565b155b15611c9e5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610ba3565b8115611ce65783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f828152600260205260408120546001600160a01b0390811690831615611d4357611d4381848661205b565b6001600160a01b03811615611d7d57611d5e5f855f80611c13565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615611dab576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e475772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611e73576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611e9157662386f26fc10000830492506010015b6305f5e1008310611ea9576305f5e100830492506008015b6127108310611ebd57612710830492506004015b60648310611ecf576064830492506002015b600a83106109195760010192915050565b606083515f03611efe575060408051602081019091525f8152611811565b5f82611f2e57600385516004611f149190612521565b611f1f9060026124d4565b611f2991906124fb565b611f53565b600385516002611f3e91906124d4565b611f4891906124fb565b611f53906004612521565b90505f8167ffffffffffffffff811115611f6f57611f6f612320565b6040519080825280601f01601f191660200182016040528015611f99576020820181803683370190505b509050600185016020820187885189016020810180515f82525b8284101561200e576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450611fb3565b90525050851561204f5760038851066001811461203257600281146120455761204d565b603d6001830353603d600283035361204d565b603d60018303535b505b50909695505050505050565b6120668383836120bf565b610e41576001600160a01b03831661209457604051637e27328960e01b815260048101829052602401610ba3565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610ba3565b5f6001600160a01b0383161580159061211b5750826001600160a01b0316846001600160a01b031614806120f857506120f88484611641565b8061211b57505f828152600460205260409020546001600160a01b038481169116145b949350505050565b6040518060a001604052806005906020820280368337509192915050565b6001600160e01b0319811681146116a8575f80fd5b5f60208284031215612166575f80fd5b813561181181612141565b5f5b8381101561218b578181015183820152602001612173565b50505f910152565b5f81518084526121aa816020860160208601612171565b601f01601f19169290920160200192915050565b602081525f6118116020830184612193565b5f602082840312156121e0575f80fd5b5035919050565b80356001600160a01b03811681146121fd575f80fd5b919050565b5f8060408385031215612213575f80fd5b61221c836121e7565b946020939093013593505050565b5f8060c0838503121561223b575f80fd5b612244836121e7565b91508360c084011115612255575f80fd5b50926020919091019150565b60a0810181835f5b600581101561228b57815160ff16835260209283019290910190600101612269565b50505092915050565b5f805f606084860312156122a6575f80fd5b6122af846121e7565b92506122bd602085016121e7565b929592945050506040919091013590565b5f602082840312156122de575f80fd5b611811826121e7565b5f80604083850312156122f8575f80fd5b612301836121e7565b915060208301358015158114612315575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561235d5761235d612320565b604052919050565b5f67ffffffffffffffff82111561237e5761237e612320565b50601f01601f191660200190565b5f805f806080858703121561239f575f80fd5b6123a8856121e7565b93506123b6602086016121e7565b925060408501359150606085013567ffffffffffffffff8111156123d8575f80fd5b8501601f810187136123e8575f80fd5b80356123fb6123f682612365565b612334565b81815288602083850101111561240f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215612441575f80fd5b61244a836121e7565b9150612458602084016121e7565b90509250929050565b600181811c9082168061247557607f821691505b60208210810361249357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561091957610919612499565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561091957610919612499565b634e487b7160e01b5f52601260045260245ffd5b5f82612509576125096124e7565b500490565b5f8261251c5761251c6124e7565b500690565b808202811582820484141761091957610919612499565b5f60208284031215612548575f80fd5b5051919050565b5f6001820161256057612560612499565b5060010190565b5f8151612578818560208601612171565b9290920192915050565b6d5365616c65642052656c6963202360901b81525f82516125aa81600e850160208701612171565b91909101600e0192915050565b5f602082840312156125c7575f80fd5b815167ffffffffffffffff8111156125dd575f80fd5b8201601f810184136125ed575f80fd5b80516125fb6123f682612365565b81815285602083850101111561260f575f80fd5b610f07826020830160208601612171565b5f8351612631818460208801612171565b672052656c6963202360c01b9083019081528351612656816008840160208801612171565b01600801949350505050565b683d913730b6b2911d1160b91b815283515f90612686816009850160208901612171565b7f222c226465736372697074696f6e223a224167656e7420466f7267653a20352c6009918401918201527f303030206f6e2d636861696e20706978656c2072656c69637320666f72202e6160298201527f69204167656e7420494420686f6c64657273206f6e20424e4220436861696e2e60498201527f20466f72676520352052656c69637320696e746f2031204d696e65722e20556e60698201527f6f6666696369616c2c20636f6c6c65637469626c65206f6e6c792c206e6f207960898201527f69656c642070726f6d697365642e222c22696d616765223a22646174613a696d60a9820152701859d94bdcdd99cade1b5b0edd5d198e0b607a1b60c982015261279560da820186612567565b6f222c2261747472696275746573223a5b60801b815290506127ba6010820185612567565b615d7d60f01b81526002019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161280681601d850160208701612171565b91909101601d0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081527f7b226e616d65223a224167656e7420466f7267652052656c6963222c22646573601b8201527f6372697074696f6e223a22352c303030206f6e2d636861696e20706978656c20603b8201527f72656c69637320696e20666f757220656c656d656e747320666f72202e616920605b8201527f4167656e7420494420686f6c64657273206f6e20424e4220436861696e2e2042607b8201527f75726e203520696e2074686520466f72676520746f206d696e742061204d696e609b8201527f65722e20556e6f6666696369616c2c20636f6c6c65637469626c65206f6e6c7960bb8201527f2e222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b7560db820152631d198e0b60e21b60fb8201525f82516129618160ff850160208701612171565b820161297460ff820161227d60f01b9052565b610101019392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906129b190830184612193565b9695505050505050565b5f602082840312156129cb575f80fd5b81516118118161214156fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f7b2274726169745f74797065223a22537461747573222c2276616c7565223a225365616c6564227da264697066735822122048023ede6f67d3681b9045c99c65b5db0a558760d9abe82b0ee0e395dd37670764736f6c634300081a0033","sourceMap":"1328:9634:21:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1560:300:2;;;;;;;;;;-1:-1:-1;1560:300:2;;;;;:::i;:::-;;:::i;:::-;;;565:14:23;;558:22;540:41;;528:2;513:18;1560:300:2;;;;;;;;2364:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3496:154::-;;;;;;;;;;-1:-1:-1;3496:154:2;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1765:32:23;;;1747:51;;1735:2;1720:18;3496:154:2;1601:203:23;3322:113:2;;;;;;;;;;-1:-1:-1;3322:113:2;;;;;:::i;:::-;;:::i;:::-;;1649:43:21;;;;;;;;;;;;1690:2;1649:43;;;;;2438:25:23;;;2426:2;2411:18;1649:43:21;2292:177:23;5007:104:21;;;;;;;;;;;;;:::i;7547:475::-;;;;;;;;;;-1:-1:-1;7547:475:21;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2881:33::-;;;;;;;;;;;;;;;;2848:27;;;;;;;;;;;;;;;;6249:268;;;;;;;;;;-1:-1:-1;6249:268:21;;;;;:::i;:::-;;:::i;:::-;;;;3488:4:23;3476:17;;;3458:36;;3542:6;3530:19;;;3525:2;3510:18;;3503:47;3431:18;6249:268:21;3290:266:23;4142:578:2;;;;;;;;;;-1:-1:-1;4142:578:2;;;;;:::i;:::-;;:::i;6751:118:21:-;;;;;;;;;;-1:-1:-1;6751:118:21;;;;;:::i;:::-;;:::i;:::-;;;4112:4:23;4100:17;;;4082:36;;4070:2;4055:18;6751:118:21;3940:184:23;2796:20:21;;;;;;;;;;-1:-1:-1;2796:20:21;;;;;;;;6523:222;;;;;;;;;;-1:-1:-1;6523:222:21;;;;;:::i;:::-;;:::i;2706:20::-;;;;;;;;;;-1:-1:-1;2706:20:21;;;;-1:-1:-1;;;;;2706:20:21;;;1493:41;;;;;;;;;;;;1530:4;1493:41;;10757:203;;;;;;;;;;;;;:::i;2921:43::-;;;;;;;;;;-1:-1:-1;2921:43:21;;;;;:::i;:::-;;;;;;;;;;;;;;4786:132:2;;;;;;;;;;-1:-1:-1;4786:132:2;;;;;:::i;:::-;;:::i;1748:42:21:-;;;;;;;;;;;;1786:4;1748:42;;2822:20;;;;;;;;;;-1:-1:-1;2822:20:21;;;;;;;;;;;2184:118:2;;;;;;;;;;-1:-1:-1;2184:118:2;;;;;:::i;:::-;;:::i;2433:35:21:-;;;;;;;;;;;;;;;5987:87;;;;;;;;;;-1:-1:-1;6059:8:21;;;;;;;5987:87;;3078:48;;;;;;;;;;-1:-1:-1;3078:48:21;;;;;:::i;:::-;;;;;;;;;;;;;;1919:208:2;;;;;;;;;;-1:-1:-1;1919:208:2;;;;;:::i;:::-;;:::i;2293:101:0:-;;;;;;;;;;;;;:::i;1698:44:21:-;;;;;;;;;;;;1730:12;1698:44;;1638:85:0;;;;;;;;;;-1:-1:-1;1710:6:0;;-1:-1:-1;;;;;1710:6:0;1638:85;;4040:253:21;;;;;;;;;;-1:-1:-1;4040:253:21;;;;;:::i;:::-;;:::i;2517:93:2:-;;;;;;;;;;;;;:::i;2661:38:21:-;;;;;;;;;;;;;;;1540:47;;;;;;;;;;;;1583:4;1540:47;;4299:702;;;;;;:::i;:::-;;:::i;3717:144:2:-;;;;;;;;;;-1:-1:-1;3717:144:2;;;;;:::i;:::-;;:::i;2732:26:21:-;;;;;;;;;;;;;;;;5358:530;;;;;;;;;;;;;:::i;2527:41::-;;;;;;;;;;;;;;;4984:233:2;;;;;;;;;;-1:-1:-1;4984:233:2;;;;;:::i;:::-;;:::i;10223:98:21:-;;;;;;;;;;;;;:::i;8305:1106::-;;;;;;;;;;-1:-1:-1;8305:1106:21;;;;;:::i;:::-;;:::i;1600:43::-;;;;;;;;;;;;1642:1;1600:43;;1796:38;;;;;;;;;;;;1830:4;1796:38;;2764:26;;;;;;;;;;;;;;;;10441:171;;;;;;;;;;-1:-1:-1;10441:171:21;;;;;:::i;:::-;;:::i;9417:431::-;;;;;;;;;;;;;:::i;2067:88::-;;;;;;;;;;;;2112:42;2067:88;;3927:153:2;;;;;;;;;;-1:-1:-1;3927:153:2;;;;;:::i;:::-;;:::i;2543:215:0:-;;;;;;;;;;-1:-1:-1;2543:215:0;;;;;:::i;:::-;;:::i;2008:53:21:-;;;;;;;;;;;;2054:7;2008:53;;1560:300:2;1662:4;-1:-1:-1;;;;;;1697:40:2;;-1:-1:-1;;;1697:40:2;;:104;;-1:-1:-1;;;;;;;1753:48:2;;-1:-1:-1;;;1753:48:2;1697:104;:156;;;-1:-1:-1;;;;;;;;;;862:40:12;;;1817:36:2;1678:175;1560:300;-1:-1:-1;;1560:300:2:o;2364:89::-;2409:13;2441:5;2434:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2364:89;:::o;3496:154::-;3563:7;3582:22;3596:7;3582:13;:22::i;:::-;-1:-1:-1;6033:7:2;6059:24;;;:15;:24;;;;;;-1:-1:-1;;;;;6059:24:2;3622:21;5963:127;3322:113;3393:35;3402:2;3406:7;735:10:8;3393:8:2;:35::i;:::-;3322:113;;:::o;5007:104:21:-;5053:7;5093:11;;5079;;:25;;;;:::i;:::-;5072:32;;5007:104;:::o;7547:475::-;7623:24;;:::i;:::-;7663:10;-1:-1:-1;;;;;7685:5:21;7663:28;;7659:52;;7700:11;;-1:-1:-1;;;7700:11:21;;;;;;;;;;;7659:52;7726:8;;;;;;;7721:35;;7743:13;;-1:-1:-1;;;7743:13:21;;;;;;;;;;;7721:35;7771:9;7766:224;7786:1;7782;:5;7766:224;;;7832:4;-1:-1:-1;;;;;7812:24:21;:16;7821:3;7825:1;7821:6;;;;;;;:::i;:::-;;;;;5798:7:2;5824:16;;;:7;:16;;;;;;-1:-1:-1;;;;;5824:16:2;;5732:115;7812:16:21;-1:-1:-1;;;;;7812:24:21;;7808:52;;7845:15;;-1:-1:-1;;;7845:15:21;;;;;;;;;;;7808:52;7935:17;7945:3;7949:1;7945:6;;;;;;;:::i;:::-;;;;;7935:9;:17::i;:::-;7921:8;7930:1;7921:11;;;;;;;:::i;:::-;:31;;;;:11;;;;;;:31;7966:13;7972:3;7976:1;7972:6;;;;;;;:::i;:::-;;;;;7966:5;:13::i;:::-;7789:3;;7766:224;;;;8014:1;7999:11;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;7547:475:21;;;-1:-1:-1;;;7547:475:21:o;6249:268::-;6302:13;6317;1530:4;6350;:17;6342:34;;;;-1:-1:-1;;;6342:34:21;;;;;;8706:2:23;8688:21;;;8745:1;8725:18;;;8718:29;-1:-1:-1;;;8778:2:23;8763:18;;8756:34;8822:2;8807:18;;8504:327;6342:34:21;;;;;;;;;1786:4;6402:11;6408:4;6402:5;:11::i;:::-;:25;;;;:::i;:::-;6472;;;2196:39;6472:25;;;9267::23;9308:18;;;9301:34;;;6386:42:21;;-1:-1:-1;1830:4:21;;9240:18:23;;6472:25:21;;;;;;;;;;;;6462:36;;;;;;6454:45;;:55;;;;:::i;:::-;6438:72;;6249:268;;;:::o;4142:578:2:-;-1:-1:-1;;;;;4236:16:2;;4232:87;;4275:33;;-1:-1:-1;;;4275:33:2;;4305:1;4275:33;;;1747:51:23;1720:18;;4275:33:2;1601:203:23;4232:87:2;4537:21;4561:34;4569:2;4573:7;735:10:8;4561:7:2;:34::i;:::-;4537:58;;4626:4;-1:-1:-1;;;;;4609:21:2;:13;-1:-1:-1;;;;;4609:21:2;;4605:109;;4653:50;;-1:-1:-1;;;4653:50:2;;-1:-1:-1;;;;;9683:32:23;;;4653:50:2;;;9665:51:23;9732:18;;;9725:34;;;9795:32;;9775:18;;;9768:60;9638:18;;4653:50:2;9463:371:23;4605:109:2;4222:498;4142:578;;;:::o;6751:118:21:-;6803:13;6842:20;6851:10;6858:2;6851:6;:10::i;6842:20::-;-1:-1:-1;6828:34:21;6751:118;-1:-1:-1;;6751:118:21:o;6523:222::-;6596:8;;6572:7;;6596:8;;;;;6591:35;;6613:13;;-1:-1:-1;;;6613:13:21;;;;;;;;;;;6591:35;6640:7;;;:27;;;6656:11;;6651:2;:16;6640:27;6636:49;;;6676:9;;-1:-1:-1;;;6676:9:21;;;;;;;;;;;6636:49;6712:12;;1530:4;;6703:6;6708:1;6703:2;:6;:::i;:::-;:21;;;;:::i;:::-;6702:36;;;;:::i;10757:203::-;10855:29;;10810:21;;10796:11;;-1:-1:-1;;;;;10855:8:21;:13;;10810:21;;10796:11;10855:29;10796:11;10855:29;10810:21;10855:13;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10841:43;;;10902:2;10894:30;;;;-1:-1:-1;;;10894:30:21;;10251:2:23;10894:30:21;;;10233:21:23;10290:2;10270:18;;;10263:30;-1:-1:-1;;;10309:18:23;;;10302:45;10364:18;;10894:30:21;10049:339:23;10894:30:21;10939:14;;2438:25:23;;;10939:14:21;;2426:2:23;2411:18;10939:14:21;;;;;;;10786:174;;10757:203::o;4786:132:2:-;4872:39;4889:4;4895:2;4899:7;4872:39;;;;;;;;;;;;:16;:39::i;:::-;4786:132;;;:::o;2184:118::-;2247:7;2273:22;2287:7;2273:13;:22::i;1919:208::-;1982:7;-1:-1:-1;;;;;2005:19:2;;2001:87;;2047:30;;-1:-1:-1;;;2047:30:2;;2074:1;2047:30;;;1747:51:23;1720:18;;2047:30:2;1601:203:23;2001:87:2;-1:-1:-1;;;;;;2104:16:2;;;;;:9;:16;;;;;;;1919:208::o;2293:101:0:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;:::-;2293:101::o:0;4040:253:21:-;-1:-1:-1;;;;;4139:16:21;;4105:7;4139:16;;;:8;:16;;;;;;4105:7;1642:1;4180:23;;;:52;;4210:22;4228:4;1642:1;4210:22;:::i;:::-;4180:52;;;4206:1;4180:52;4165:67;;4255:4;4249:3;:10;:37;;4285:1;4249:37;;;1730:12;4263:10;4269:4;4263:3;:10;:::i;:::-;4262:20;;;;:::i;:::-;4242:44;4040:253;-1:-1:-1;;;;;4040:253:21:o;2517:93:2:-;2564:13;2596:7;2589:14;;;;;:::i;4299:702:21:-;4358:8;;;;4353:34;;4375:12;;-1:-1:-1;;;4375:12:21;;;;;;;;;;;4353:34;4401:30;;-1:-1:-1;;;4401:30:21;;4420:10;4401:30;;;1747:51:23;2112:42:21;;4401:18;;1720::23;;4401:30:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4435:1;4401:35;4397:58;;4445:10;;-1:-1:-1;;;4445:10:21;;;;;;;;;;;4397:58;4469:3;4476:1;4469:8;4465:30;;4486:9;;-1:-1:-1;;;4486:9:21;;;;;;;;;;;4465:30;4521:11;;1530:4;4546:11;4554:3;4521:11;4546;:::i;:::-;:24;4542:46;;;4579:9;;-1:-1:-1;;;4579:9:21;;;;;;;;;;;4542:46;4611:10;4602:20;;;;:8;:20;;;;;;1690:2;;4602:26;;4625:3;;4602:26;:::i;:::-;:43;4598:69;;;4654:13;;-1:-1:-1;;;4654:13:21;;;;;;;;;;;4598:69;4694:22;4700:10;4712:3;4694:5;:22::i;:::-;4681:9;:35;4677:62;;4725:14;;-1:-1:-1;;;4725:14:21;;;;;;;;;;;4677:62;4758:10;4749:20;;;;:8;:20;;;;;:27;;4773:3;;4749:20;:27;;4773:3;;4749:27;:::i;:::-;;;;-1:-1:-1;4800:11:21;;-1:-1:-1;4808:3:21;4800:5;:11;:::i;:::-;4786;:25;4825:18;;:23;:58;;;;-1:-1:-1;1583:4:21;4852:11;4860:3;4852:5;:11;:::i;:::-;:31;;4825:58;4821:100;;;4906:15;4885:18;:36;4821:100;4948:1;4931:63;4956:3;4951:1;:8;4931:63;;4966:28;4972:10;4984:9;4992:1;4984:5;:9;:::i;:::-;4966:5;:28::i;:::-;4961:3;;;:::i;:::-;;;4931:63;;3717:144:2;3802:52;735:10:8;3835:8:2;3845;3802:18;:52::i;5358:530:21:-;5399:8;;;;;;;5395:38;;;5416:17;;-1:-1:-1;;;5416:17:21;;;;;;;;;;;5395:38;1583:4;5447:11;;:30;5443:59;;;5486:16;;-1:-1:-1;;;5486:16:21;;;;;;;;;;;5443:59;1710:6:0;;-1:-1:-1;;;;;1710:6:0;5516:10:21;:21;;;;:49;;;1530:4;5541:11;;:24;5516:49;:123;;;;;2054:7;5599:18;;:40;;;;:::i;:::-;5581:15;:58;5516:123;5512:152;;;5648:16;;-1:-1:-1;;;5648:16:21;;;;;;;;;;;5512:152;1530:4;5718:16;5746;5761:1;5746:12;:16;:::i;:::-;5765:11;;5707:85;;;;;;11126:25:23;;;;5736:27:21;;11167:18:23;;;11160:34;;;;11210:18;;;11203:34;5786:4:21;11253:18:23;;;11246:60;11098:19;;5707:85:21;;;;;;;;;;;;5697:96;;;;;;5689:105;;:118;;;;:::i;:::-;5674:12;:133;;;5817:8;:15;;-1:-1:-1;;5817:15:21;;;;;5847:34;;;11491:25:23;;;5870:10:21;11547:2:23;11532:18;;11525:60;5847:34:21;;11464:18:23;5847:34:21;;;;;;;5358:530::o;4984:233:2:-;5097:31;5110:4;5116:2;5120:7;5097:12;:31::i;:::-;5138:72;735:10:8;5186:4:2;5192:2;5196:7;5205:4;5138:33;:72::i;10223:98:21:-;1531:13:0;:11;:13::i;:::-;10272:8:21::1;:15:::0;;-1:-1:-1;;10272:15:21::1;10283:4;10272:15;::::0;;10302:12:::1;::::0;::::1;::::0;10272:8:::1;::::0;10302:12:::1;10223:98::o:0;8305:1106::-;8365:13;8390:17;8404:2;8390:13;:17::i;:::-;;8417:18;8445:17;8472:19;8506:8;;;;;;;;;;;8501:438;;8569:13;:2;:11;:13::i;:::-;8537:46;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;8537:46:21;;;;;;;8603:3;;-1:-1:-1;;;8603:17:21;;;;;2438:25:23;;;8537:46:21;;-1:-1:-1;;;;;;8603:3:21;;:13;;2411:18:23;;8603:17:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8603:17:21;;;;;;;;;;;;:::i;:::-;8597:23;;8634:50;;;;;;;;;;;;;;;;;;;8501:438;;;8716:8;8726;8738:20;8747:10;8754:2;8747:6;:10::i;8738:20::-;8715:43;;;;8793:16;8806:2;8793:16;;:12;:16::i;:::-;8823:13;:2;:11;:13::i;:::-;8779:58;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;8779:58:21;;;;;;;8857:3;;-1:-1:-1;;;8857:23:21;;;;;13753:25:23;;;13826:4;13814:17;;13794:18;;;13787:45;13880:6;13868:19;;13848:18;;;13841:47;8779:58:21;;-1:-1:-1;;;;;;8857:3:21;;:12;;13726:18:23;;8857:23:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8857:23:21;;;;;;;;;;;;:::i;:::-;8902:3;;:26;;-1:-1:-1;;;8902:26:21;;3488:4:23;3476:17;;8902:26:21;;;3458:36:23;3542:6;3530:19;;3510:18;;;3503:47;8851:29:21;;-1:-1:-1;;;;;;8902:3:21;;:19;;3431:18:23;;8902:26:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8902:26:21;;;;;;;;;;;;:::i;:::-;8894:34;;8701:238;;8501:438;9027:367;9091:4;9342:3;9367:5;9047:345;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9027:13;:367::i;:::-;8955:449;;;;;;;;:::i;:::-;;;;;;;;;;;;;8948:456;;;;;8305:1106;;;:::o;10441:171::-;1531:13:0;:11;:13::i;:::-;10506:8:21::1;::::0;::::1;::::0;::::1;;;10502:37;;;10523:16;;-1:-1:-1::0;;;10523:16:21::1;;;;;;;;;;;10502:37;10549:3;:23:::0;;-1:-1:-1;;;;;;10549:23:21::1;-1:-1:-1::0;;;;;10549:23:21;::::1;::::0;;::::1;::::0;;;10587:18:::1;::::0;1747:51:23;;;10587:18:21::1;::::0;1735:2:23;1720:18;10587::21::1;;;;;;;10441:171:::0;:::o;9417:431::-;9809:3;;:16;;-1:-1:-1;;;9809:16:21;;:3;:16;;;2438:25:23;9463:13:21;;-1:-1:-1;;;;;9809:3:21;;:13;;2411:18:23;;9809:16:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9809:16:21;;;;;;;;;;;;:::i;:::-;9495:346;;;;;;;;:::i;:::-;;;;;;;;;;;;;9488:353;;9417:431;:::o;3927:153:2:-;-1:-1:-1;;;;;4038:25:2;;;4015:4;4038:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;3927:153::o;2543:215:0:-;1531:13;:11;:13::i;:::-;-1:-1:-1;;;;;2627:22:0;::::1;2623:91;;2672:31;::::0;-1:-1:-1;;;2672:31:0;;2700:1:::1;2672:31;::::0;::::1;1747:51:23::0;1720:18;;2672:31:0::1;1601:203:23::0;2623:91:0::1;2723:28;2742:8;2723:18;:28::i;:::-;2543:215:::0;:::o;16212:241:2:-;16275:7;5824:16;;;:7;:16;;;;;;-1:-1:-1;;;;;5824:16:2;;16337:88;;16383:31;;-1:-1:-1;;;16383:31:2;;;;;2438:25:23;;;2411:18;;16383:31:2;2292:177:23;14492:120:2;14572:33;14581:2;14585:7;14594:4;14600;14572:8;:33::i;11510:227::-;11561:21;11585:40;11601:1;11605:7;11622:1;11585:7;:40::i;:::-;11561:64;-1:-1:-1;;;;;;11639:27:2;;11635:96;;11689:31;;-1:-1:-1;;;11689:31:2;;;;;2438:25:23;;;2411:18;;11689:31:2;2292:177:23;6979:400:21;7028:7;7047:308;7081:1;7076:6;;;7112:3;7108:7;;7064:9;7129:161;7149:1;7145;:5;7129:161;;;7205:25;;;2196:39;7205:25;;;18174::23;18215:18;;;18208:34;;;18258:18;;;18251:34;;;7175:9:21;;18147:18:23;;7205:25:21;;;;;;-1:-1:-1;;7205:25:21;;;;;;7195:36;;7205:25;7195:36;;;;7266:1;;7235:3;7187:51;;;7269:5;;;;-1:-1:-1;7152:3:21;;7129:161;;;-1:-1:-1;7313:1:21;7308:6;;;;7307:12;;-1:-1:-1;1530:4:21;7338:15;;;7047:308;;-1:-1:-1;7371:1:21;6979:400::o;8028:220::-;8110:12;8141:27;8155:2;8159;8163:4;8141:13;:27::i;:::-;8134:34;-1:-1:-1;;;;;;8182:18:21;;;;;;:38;;-1:-1:-1;;;;;;8204:16:21;;;;8182:38;8178:63;;;8224:17;;;;:13;:17;;;;;8222:19;;8224:17;;;8222:19;;;:::i;:::-;;;;-1:-1:-1;8178:63:21;8028:220;;;;;:::o;1796:162:0:-;1710:6;;-1:-1:-1;;;;;1710:6:0;735:10:8;1855:23:0;1851:101;;1901:40;;-1:-1:-1;;;1901:40:0;;735:10:8;1901:40:0;;;1747:51:23;1720:18;;1901:40:0;1601:203:23;2912:187:0;3004:6;;;-1:-1:-1;;;;;3020:17:0;;;-1:-1:-1;;;;;;3020:17:0;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;9978:327:2:-;-1:-1:-1;;;;;10045:16:2;;10041:87;;10084:33;;-1:-1:-1;;;10084:33:2;;10114:1;10084:33;;;1747:51:23;1720:18;;10084:33:2;1601:203:23;10041:87:2;10137:21;10161:32;10169:2;10173:7;10190:1;10161:7;:32::i;:::-;10137:56;-1:-1:-1;;;;;;10207:27:2;;;10203:96;;10257:31;;-1:-1:-1;;;10257:31:2;;10285:1;10257:31;;;1747:51:23;1720:18;;10257:31:2;1601:203:23;15665:312:2;-1:-1:-1;;;;;15772:22:2;;15768:91;;15817:31;;-1:-1:-1;;;15817:31:2;;-1:-1:-1;;;;;1765:32:23;;15817:31:2;;;1747:51:23;1720:18;;15817:31:2;1601:203:23;15768:91:2;-1:-1:-1;;;;;15868:25:2;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;15868:46:2;;;;;;;;;;15929:41;;540::23;;;15929::2;;513:18:23;15929:41:2;;;;;;;15665:312;;;:::o;985:924:6:-;-1:-1:-1;;;;;1165:14:6;;;:18;1161:742;;1203:67;;-1:-1:-1;;;1203:67:6;;-1:-1:-1;;;;;1203:36:6;;;;;:67;;1240:8;;1250:4;;1256:7;;1265:4;;1203:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1203:67:6;;;;;;;;-1:-1:-1;;1203:67:6;;;;;;;;;;;;:::i;:::-;;;1199:694;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1560:6;:13;1577:1;1560:18;1556:323;;1664:39;;-1:-1:-1;;;1664:39:6;;-1:-1:-1;;;;;1765:32:23;;1664:39:6;;;1747:51:23;1720:18;;1664:39:6;1601:203:23;1556:323:6;1831:6;1825:13;1816:6;1812:2;1808:15;1801:38;1199:694;-1:-1:-1;;;;;;1317:51:6;;-1:-1:-1;;;1317:51:6;1313:182;;1437:39;;-1:-1:-1;;;1437:39:6;;-1:-1:-1;;;;;1765:32:23;;1437:39:6;;;1747:51:23;1720:18;;1437:39:6;1601:203:23;1313:182:6;1271:238;1199:694;985:924;;;;;:::o;637:632:11:-;693:13;742:14;759:17;770:5;759:10;:17::i;:::-;779:1;759:21;742:38;;794:20;828:6;817:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:18:11;-1:-1:-1;794:41:11;-1:-1:-1;924:28:11;;;940:2;924:28;979:247;-1:-1:-1;;1010:5:11;-1:-1:-1;;;1109:2:11;1098:14;;1093:32;1010:5;1080:46;1170:2;1161:11;;;-1:-1:-1;1190:21:11;979:247;1190:21;-1:-1:-1;1246:6:11;637:632;-1:-1:-1;;;637:632:11:o;9854:213:21:-;9910:13;9939:1;9944;9939:6;9935:25;;-1:-1:-1;;9947:13:21;;;;;;;;;;;;-1:-1:-1;;;9947:13:21;;;;;9854:213::o;9935:25::-;9974:1;9979;9974:6;9970:26;;-1:-1:-1;;9982:14:21;;;;;;;;;;;;-1:-1:-1;;;9982:14:21;;;;;9854:213::o;9970:26::-;10010:1;10015;10010:6;10006:26;;-1:-1:-1;;10018:14:21;;;;;;;;;;;;-1:-1:-1;;;10018:14:21;;;;;9854:213::o;10006:26::-;-1:-1:-1;;10042:18:21;;;;;;;;;;;;-1:-1:-1;;;10042:18:21;;;;;9854:213::o;663:124:7:-;721:13;753:27;761:4;767:6;;;;;;;;;;;;;;;;;775:4;753:7;:27::i;14794:662:2:-;14954:9;:31;;;-1:-1:-1;;;;;;14967:18:2;;;;14954:31;14950:460;;;15001:13;15017:22;15031:7;15017:13;:22::i;:::-;15001:38;-1:-1:-1;;;;;;15167:18:2;;;;;;:35;;;15198:4;-1:-1:-1;;;;;15189:13:2;:5;-1:-1:-1;;;;;15189:13:2;;;15167:35;:69;;;;;15207:29;15224:5;15231:4;15207:16;:29::i;:::-;15206:30;15167:69;15163:142;;;15263:27;;-1:-1:-1;;;15263:27:2;;-1:-1:-1;;;;;1765:32:23;;15263:27:2;;;1747:51:23;1720:18;;15263:27:2;1601:203:23;15163:142:2;15323:9;15319:81;;;15377:7;15373:2;-1:-1:-1;;;;;15357:28:2;15366:5;-1:-1:-1;;;;;15357:28:2;;;;;;;;;;;15319:81;14987:423;14950:460;-1:-1:-1;;15420:24:2;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;15420:29:2;-1:-1:-1;;;;;15420:29:2;;;;;;;;;;14794:662::o;8861:795::-;8947:7;5824:16;;;:7;:16;;;;;;-1:-1:-1;;;;;5824:16:2;;;;9058:18;;;9054:86;;9092:37;9109:4;9115;9121:7;9092:16;:37::i;:::-;-1:-1:-1;;;;;9184:18:2;;;9180:256;;9300:48;9317:1;9321:7;9338:1;9342:5;9300:8;:48::i;:::-;-1:-1:-1;;;;;9391:15:2;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;9391:20:2;;;9180:256;-1:-1:-1;;;;;9450:16:2;;;9446:107;;-1:-1:-1;;;;;9510:13:2;;;;;;:9;:13;;;;;:18;;9527:1;9510:18;;;9446:107;9563:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9563:21:2;-1:-1:-1;;;;;9563:21:2;;;;;;;;;9600:27;;9563:16;;9600:27;;;;;;;9645:4;8861:795;-1:-1:-1;;;;8861:795:2:o;25316:916:14:-;25369:7;;-1:-1:-1;;;25444:17:14;;25440:103;;-1:-1:-1;;;25481:17:14;;;-1:-1:-1;25526:2:14;25516:12;25440:103;25569:8;25560:5;:17;25556:103;;25606:8;25597:17;;;-1:-1:-1;25642:2:14;25632:12;25556:103;25685:8;25676:5;:17;25672:103;;25722:8;25713:17;;;-1:-1:-1;25758:2:14;25748:12;25672:103;25801:7;25792:5;:16;25788:100;;25837:7;25828:16;;;-1:-1:-1;25872:1:14;25862:11;25788:100;25914:7;25905:5;:16;25901:100;;25950:7;25941:16;;;-1:-1:-1;25985:1:14;25975:11;25901:100;26027:7;26018:5;:16;26014:100;;26063:7;26054:16;;;-1:-1:-1;26098:1:14;26088:11;26014:100;26140:7;26131:5;:16;26127:66;;26177:1;26167:11;26219:6;25316:916;-1:-1:-1;;25316:916:14:o;1186:4022:7:-;1283:13;1515:4;:11;1530:1;1515:16;1511:31;;-1:-1:-1;1533:9:7;;;;;;;;;-1:-1:-1;1533:9:7;;;;1511:31;2480:20;2503:11;:69;;2571:1;2552:4;:11;2548:1;:15;;;;:::i;:::-;:19;;2566:1;2548:19;:::i;:::-;2547:25;;;;:::i;:::-;2503:69;;;2542:1;2523:4;:11;2537:1;2523:15;;;;:::i;:::-;2522:21;;;;:::i;:::-;2517:27;;:1;:27;:::i;:::-;2480:92;;2583:20;2617:12;2606:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2606:24:7;;2583:47;;2778:1;2771:5;2767:13;2879:4;2871:6;2867:17;2912:4;2959;2953:11;2947:4;2943:22;3207:4;3199:6;3195:17;3249:8;3243:15;3288:4;3278:8;3271:22;3360:1259;3393:6;3384:7;3381:19;3360:1259;;;3495:1;3486:7;3482:15;3471:26;;3533:7;3527:14;4120:4;4112:5;4108:2;4104:14;4100:25;4090:8;4086:40;4080:47;4069:9;4061:67;4173:1;4162:9;4158:17;4145:30;;4263:4;4255:5;4251:2;4247:14;4243:25;4233:8;4229:40;4223:47;4212:9;4204:67;4316:1;4305:9;4301:17;4288:30;;4405:4;4397:5;4394:1;4390:13;4386:24;4376:8;4372:39;4366:46;4355:9;4347:66;4458:1;4447:9;4443:17;4430:30;;4539:4;4532:5;4528:16;4518:8;4514:31;4508:38;4497:9;4489:58;;4592:1;4581:9;4577:17;4564:30;;3360:1259;;;4680:28;;-1:-1:-1;;4722:446:7;;;;4907:1;4900:4;4894:11;4890:19;4931:1;4926:132;;;;5080:1;5075:79;;;;4883:271;;4926:132;4982:4;4978:1;4967:9;4963:17;4955:32;5035:4;5031:1;5020:9;5016:17;5008:32;4926:132;;5075:79;5131:4;5127:1;5116:9;5112:17;5104:32;4883:271;;4722:446;-1:-1:-1;5195:6:7;;1186:4022;-1:-1:-1;;;;;;1186:4022:7:o;7105:368:2:-;7217:38;7231:5;7238:7;7247;7217:13;:38::i;:::-;7212:255;;-1:-1:-1;;;;;7275:19:2;;7271:186;;7321:31;;-1:-1:-1;;;7321:31:2;;;;;2438:25:23;;;2411:18;;7321:31:2;2292:177:23;7271:186:2;7398:44;;-1:-1:-1;;;7398:44:2;;-1:-1:-1;;;;;19243:32:23;;7398:44:2;;;19225:51:23;19292:18;;;19285:34;;;19198:18;;7398:44:2;19051:274:23;6401:272:2;6504:4;-1:-1:-1;;;;;6539:21:2;;;;;;:127;;;6586:7;-1:-1:-1;;;;;6577:16:2;:5;-1:-1:-1;;;;;6577:16:2;;:52;;;;6597:32;6614:5;6621:7;6597:16;:32::i;:::-;6577:88;;;-1:-1:-1;6033:7:2;6059:24;;;:15;:24;;;;;;-1:-1:-1;;;;;6633:32:2;;;6059:24;;6633:32;6577:88;6520:146;6401:272;-1:-1:-1;;;;6401:272:2:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:23:-;-1:-1:-1;;;;;;88:32:23;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:23;816:16;;809:27;592:250::o;847:282::-;900:3;938:5;932:12;965:6;960:3;953:19;981:76;1050:6;1043:4;1038:3;1034:14;1027:4;1020:5;1016:16;981:76;:::i;:::-;1111:2;1090:15;-1:-1:-1;;1086:29:23;1077:39;;;;1118:4;1073:50;;847:282;-1:-1:-1;;847:282:23:o;1134:231::-;1283:2;1272:9;1265:21;1246:4;1303:56;1355:2;1344:9;1340:18;1332:6;1303:56;:::i;1370:226::-;1429:6;1482:2;1470:9;1461:7;1457:23;1453:32;1450:52;;;1498:1;1495;1488:12;1450:52;-1:-1:-1;1543:23:23;;1370:226;-1:-1:-1;1370:226:23:o;1809:173::-;1877:20;;-1:-1:-1;;;;;1926:31:23;;1916:42;;1906:70;;1972:1;1969;1962:12;1906:70;1809:173;;;:::o;1987:300::-;2055:6;2063;2116:2;2104:9;2095:7;2091:23;2087:32;2084:52;;;2132:1;2129;2122:12;2084:52;2155:29;2174:9;2155:29;:::i;:::-;2145:39;2253:2;2238:18;;;;2225:32;;-1:-1:-1;;;1987:300:23:o;2474:327::-;2567:6;2575;2628:3;2616:9;2607:7;2603:23;2599:33;2596:53;;;2645:1;2642;2635:12;2596:53;2668:29;2687:9;2668:29;:::i;:::-;2658:39;;2733:7;2727:3;2716:9;2712:19;2709:32;2706:52;;;2754:1;2751;2744:12;2706:52;-1:-1:-1;2474:327:23;2792:2;2777:18;;;;;-1:-1:-1;2474:327:23:o;2806:479::-;2982:3;2967:19;;2971:9;3063:6;2940:4;3097:182;3111:4;3108:1;3105:11;3097:182;;;3174:13;;3189:4;3170:24;3158:37;;3224:4;3215:14;;;;3252:17;;;;3131:1;3124:9;3097:182;;;3101:3;;;2806:479;;;;:::o;3561:374::-;3638:6;3646;3654;3707:2;3695:9;3686:7;3682:23;3678:32;3675:52;;;3723:1;3720;3713:12;3675:52;3746:29;3765:9;3746:29;:::i;:::-;3736:39;;3794:38;3828:2;3817:9;3813:18;3794:38;:::i;:::-;3561:374;;3784:48;;-1:-1:-1;;;3901:2:23;3886:18;;;;3873:32;;3561:374::o;4355:186::-;4414:6;4467:2;4455:9;4446:7;4442:23;4438:32;4435:52;;;4483:1;4480;4473:12;4435:52;4506:29;4525:9;4506:29;:::i;4960:347::-;5025:6;5033;5086:2;5074:9;5065:7;5061:23;5057:32;5054:52;;;5102:1;5099;5092:12;5054:52;5125:29;5144:9;5125:29;:::i;:::-;5115:39;;5204:2;5193:9;5189:18;5176:32;5251:5;5244:13;5237:21;5230:5;5227:32;5217:60;;5273:1;5270;5263:12;5217:60;5296:5;5286:15;;;4960:347;;;;;:::o;5536:127::-;5597:10;5592:3;5588:20;5585:1;5578:31;5628:4;5625:1;5618:15;5652:4;5649:1;5642:15;5668:275;5739:2;5733:9;5804:2;5785:13;;-1:-1:-1;;5781:27:23;5769:40;;5839:18;5824:34;;5860:22;;;5821:62;5818:88;;;5886:18;;:::i;:::-;5922:2;5915:22;5668:275;;-1:-1:-1;5668:275:23:o;5948:186::-;5996:4;6029:18;6021:6;6018:30;6015:56;;;6051:18;;:::i;:::-;-1:-1:-1;6117:2:23;6096:15;-1:-1:-1;;6092:29:23;6123:4;6088:40;;5948:186::o;6139:958::-;6234:6;6242;6250;6258;6311:3;6299:9;6290:7;6286:23;6282:33;6279:53;;;6328:1;6325;6318:12;6279:53;6351:29;6370:9;6351:29;:::i;:::-;6341:39;;6399:38;6433:2;6422:9;6418:18;6399:38;:::i;:::-;6389:48;-1:-1:-1;6506:2:23;6491:18;;6478:32;;-1:-1:-1;6585:2:23;6570:18;;6557:32;6612:18;6601:30;;6598:50;;;6644:1;6641;6634:12;6598:50;6667:22;;6720:4;6712:13;;6708:27;-1:-1:-1;6698:55:23;;6749:1;6746;6739:12;6698:55;6789:2;6776:16;6814:52;6830:35;6858:6;6830:35;:::i;:::-;6814:52;:::i;:::-;6889:6;6882:5;6875:21;6937:7;6932:2;6923:6;6919:2;6915:15;6911:24;6908:37;6905:57;;;6958:1;6955;6948:12;6905:57;7013:6;7008:2;7004;7000:11;6995:2;6988:5;6984:14;6971:49;7065:1;7060:2;7051:6;7044:5;7040:18;7036:27;7029:38;7086:5;7076:15;;;;;6139:958;;;;;;;:::o;7327:260::-;7395:6;7403;7456:2;7444:9;7435:7;7431:23;7427:32;7424:52;;;7472:1;7469;7462:12;7424:52;7495:29;7514:9;7495:29;:::i;:::-;7485:39;;7543:38;7577:2;7566:9;7562:18;7543:38;:::i;:::-;7533:48;;7327:260;;;;;:::o;7592:380::-;7671:1;7667:12;;;;7714;;;7735:61;;7789:4;7781:6;7777:17;7767:27;;7735:61;7842:2;7834:6;7831:14;7811:18;7808:38;7805:161;;7888:10;7883:3;7879:20;7876:1;7869:31;7923:4;7920:1;7913:15;7951:4;7948:1;7941:15;7805:161;;7592:380;;;:::o;7977:127::-;8038:10;8033:3;8029:20;8026:1;8019:31;8069:4;8066:1;8059:15;8093:4;8090:1;8083:15;8109:128;8176:9;;;8197:11;;;8194:37;;;8211:18;;:::i;8242:127::-;8303:10;8298:3;8294:20;8291:1;8284:31;8334:4;8331:1;8324:15;8358:4;8355:1;8348:15;8374:125;8439:9;;;8460:10;;;8457:36;;;8473:18;;:::i;8836:127::-;8897:10;8892:3;8888:20;8885:1;8878:31;8928:4;8925:1;8918:15;8952:4;8949:1;8942:15;8968:120;9008:1;9034;9024:35;;9039:18;;:::i;:::-;-1:-1:-1;9073:9:23;;8968:120::o;9346:112::-;9378:1;9404;9394:35;;9409:18;;:::i;:::-;-1:-1:-1;9443:9:23;;9346:112::o;10393:168::-;10466:9;;;10497;;10514:15;;;10508:22;;10494:37;10484:71;;10535:18;;:::i;10566:184::-;10636:6;10689:2;10677:9;10668:7;10664:23;10660:32;10657:52;;;10705:1;10702;10695:12;10657:52;-1:-1:-1;10728:16:23;;10566:184;-1:-1:-1;10566:184:23:o;10755:135::-;10794:3;10815:17;;;10812:43;;10835:18;;:::i;:::-;-1:-1:-1;10882:1:23;10871:13;;10755:135::o;11596:198::-;11638:3;11676:5;11670:12;11691:65;11749:6;11744:3;11737:4;11730:5;11726:16;11691:65;:::i;:::-;11772:16;;;;;11596:198;-1:-1:-1;;11596:198:23:o;11799:436::-;-1:-1:-1;;;12046:3:23;12039:29;12021:3;12097:6;12091:13;12113:75;12181:6;12176:2;12171:3;12167:12;12160:4;12152:6;12148:17;12113:75;:::i;:::-;12208:16;;;;12226:2;12204:25;;11799:436;-1:-1:-1;;11799:436:23:o;12240:668::-;12320:6;12373:2;12361:9;12352:7;12348:23;12344:32;12341:52;;;12389:1;12386;12379:12;12341:52;12422:9;12416:16;12455:18;12447:6;12444:30;12441:50;;;12487:1;12484;12477:12;12441:50;12510:22;;12563:4;12555:13;;12551:27;-1:-1:-1;12541:55:23;;12592:1;12589;12582:12;12541:55;12625:2;12619:9;12650:52;12666:35;12694:6;12666:35;:::i;12650:52::-;12725:6;12718:5;12711:21;12773:7;12768:2;12759:6;12755:2;12751:15;12747:24;12744:37;12741:57;;;12794:1;12791;12784:12;12741:57;12807:71;12871:6;12866:2;12859:5;12855:14;12850:2;12846;12842:11;12807:71;:::i;12913:636::-;13182:3;13220:6;13214:13;13236:66;13295:6;13290:3;13283:4;13275:6;13271:17;13236:66;:::i;:::-;-1:-1:-1;;;13324:16:23;;;13349:25;;;13399:13;;13421:78;13399:13;13486:1;13475:13;;13468:4;13456:17;;13421:78;:::i;:::-;13519:20;13541:1;13515:28;;12913:636;-1:-1:-1;;;;12913:636:23:o;14368:1558::-;-1:-1:-1;;;14985:43:23;;15051:13;;14967:3;;15073:74;15051:13;15136:1;15127:11;;15120:4;15108:17;;15073:74;:::i;:::-;15210:66;15206:1;15166:16;;;15198:10;;;15191:86;15306:34;15301:2;15293:11;;15286:55;15370:34;15365:2;15357:11;;15350:55;15435:34;15429:3;15421:12;;15414:56;15500:34;15494:3;15486:12;;15479:56;15565:66;15559:3;15551:12;;15544:88;-1:-1:-1;;;15656:3:23;15648:12;;15641:41;15704:39;15738:3;15730:12;;15722:6;15704:39;:::i;:::-;-1:-1:-1;;;14226:57:23;;15691:52;-1:-1:-1;15805:41:23;15842:2;15835:5;15831:14;15823:6;15805:41;:::i;:::-;-1:-1:-1;;;14344:17:23;;15918:1;15907:13;;;-1:-1:-1;;;;;;14368:1558:23:o;15931:451::-;16183:31;16178:3;16171:44;16153:3;16244:6;16238:13;16260:75;16328:6;16323:2;16318:3;16314:12;16307:4;16299:6;16295:17;16260:75;:::i;:::-;16355:16;;;;16373:2;16351:25;;15931:451;-1:-1:-1;;15931:451:23:o;16661:1306::-;17104:29;17099:3;17092:42;17164:66;17159:2;17154:3;17150:12;17143:88;17261:66;17256:2;17251:3;17247:12;17240:88;17358:34;17353:2;17348:3;17344:12;17337:56;17424:34;17418:3;17413;17409:13;17402:57;17490:34;17484:3;17479;17475:13;17468:57;17556:34;17550:3;17545;17541:13;17534:57;17622:66;17616:3;17611;17607:13;17600:89;-1:-1:-1;;;17714:3:23;17709;17705:13;17698:29;17074:3;17756:6;17750:13;17772:74;17839:6;17833:3;17828;17824:13;17819:2;17811:6;17807:15;17772:74;:::i;:::-;17865:16;;17890:43;17928:3;17920:12;;-1:-1:-1;;;16627:27:23;;16577:79;17890:43;17957:3;17949:12;;16661:1306;-1:-1:-1;;;16661:1306:23:o;18296:496::-;-1:-1:-1;;;;;18527:32:23;;;18509:51;;18596:32;;18591:2;18576:18;;18569:60;18660:2;18645:18;;18638:34;;;18708:3;18703:2;18688:18;;18681:31;;;-1:-1:-1;;18729:57:23;;18766:19;;18758:6;18729:57;:::i;:::-;18721:65;18296:496;-1:-1:-1;;;;;;18296:496:23:o;18797:249::-;18866:6;18919:2;18907:9;18898:7;18894:23;18890:32;18887:52;;;18935:1;18932;18925:12;18887:52;18967:9;18961:16;18986:30;19010:5;18986:30;:::i","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa264697066735822122048023ede6f67d3681b9045c99c65b5db0a558760d9abe82b0ee0e395dd37670764736f6c634300081a0033","offset":10815}},"immutableReferences":{"8956":[{"start":1460,"length":32}],"8959":[{"start":1902,"length":32},{"start":3407,"length":32}],"8963":[{"start":1739,"length":32},{"start":2573,"length":32}]},"transformations":[{"id":"8956","type":"replace","offset":1460,"reason":"immutable"},{"id":"8963","type":"replace","offset":1739,"reason":"immutable"},{"id":"8959","type":"replace","offset":1902,"reason":"immutable"},{"id":"8963","type":"replace","offset":2573,"reason":"immutable"},{"id":"8959","type":"replace","offset":3407,"reason":"immutable"}],"transformationValues":{"immutables":{"8956":"0xee44c4b5cf68d276f4fd505172cc9b1f63021d6941a09967c41ec2dc8fdc4bdf","8959":"0x000000000000000000000000e5310d5288c0f74452fd3b57cc09818b1f498eb0","8963":"0x00000000000000000000000028c599b3367493c8b0a0b7e4416c191be0b09993"}}},"deployment":{"transactionHash":"0x0419c88cdade63a64bc20220c11c9525ae10188a2e8d47112eff0210e425dfc5","blockNumber":"129939880","transactionIndex":"39","deployer":"0xe5310d5288c0f74452FD3B57cc09818b1F498EB0"},"sources":{"@openzeppelin/contracts/utils/Panic.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n *      using Panic for uint256;\n *\n *      // Use any of the declared internal constants\n *      function foo() { Panic.GENERIC.panic(); }\n *\n *      // Alternatively\n *      function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n    /// @dev generic / unspecified error\n    uint256 internal constant GENERIC = 0x00;\n    /// @dev used by the assert() builtin\n    uint256 internal constant ASSERT = 0x01;\n    /// @dev arithmetic underflow or overflow\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\n    /// @dev division or modulo by zero\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\n    /// @dev enum conversion error\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n    /// @dev invalid encoding in storage\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n    /// @dev empty array pop\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n    /// @dev array out of bounds access\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n    /// @dev resource error (too large allocation or too large array)\n    uint256 internal constant RESOURCE_ERROR = 0x41;\n    /// @dev calling invalid internal function\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n    /// @dev Reverts with a panic code. Recommended to use with\n    /// the internal constants with predefined codes.\n    function panic(uint256 code) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0x00, 0x4e487b71)\n            mstore(0x20, code)\n            revert(0x1c, 0x24)\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Strings.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n    bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n    uint8 private constant ADDRESS_LENGTH = 20;\n\n    /**\n     * @dev The `value` string doesn't fit in the specified `length`.\n     */\n    error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n     */\n    function toString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            uint256 length = Math.log10(value) + 1;\n            string memory buffer = new string(length);\n            uint256 ptr;\n            assembly (\"memory-safe\") {\n                ptr := add(buffer, add(32, length))\n            }\n            while (true) {\n                ptr--;\n                assembly (\"memory-safe\") {\n                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n                }\n                value /= 10;\n                if (value == 0) break;\n            }\n            return buffer;\n        }\n    }\n\n    /**\n     * @dev Converts a `int256` to its ASCII `string` decimal representation.\n     */\n    function toStringSigned(int256 value) internal pure returns (string memory) {\n        return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            return toHexString(value, Math.log256(value) + 1);\n        }\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n     */\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n        uint256 localValue = value;\n        bytes memory buffer = new bytes(2 * length + 2);\n        buffer[0] = \"0\";\n        buffer[1] = \"x\";\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\n            buffer[i] = HEX_DIGITS[localValue & 0xf];\n            localValue >>= 4;\n        }\n        if (localValue != 0) {\n            revert StringsInsufficientHexLength(value, length);\n        }\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n     * representation.\n     */\n    function toHexString(address addr) internal pure returns (string memory) {\n        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n     * representation, according to EIP-55.\n     */\n    function toChecksumHexString(address addr) internal pure returns (string memory) {\n        bytes memory buffer = bytes(toHexString(addr));\n\n        // hash the hex part of buffer (skip length + 2 bytes, length 40)\n        uint256 hashValue;\n        assembly (\"memory-safe\") {\n            hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n        }\n\n        for (uint256 i = 41; i > 1; --i) {\n            // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n            if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n                // case shift by xoring with 0x20\n                buffer[i] ^= 0x20;\n            }\n            hashValue >>= 4;\n        }\n        return string(buffer);\n    }\n\n    /**\n     * @dev Returns true if the two strings are equal.\n     */\n    function equal(string memory a, string memory b) internal pure returns (bool) {\n        return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n    }\n}\n"},"@openzeppelin/contracts/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n    enum Rounding {\n        Floor, // Toward negative infinity\n        Ceil, // Toward positive infinity\n        Trunc, // Toward zero\n        Expand // Away from zero\n    }\n\n    /**\n     * @dev Returns the addition of two unsigned integers, with an success flag (no overflow).\n     */\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a + b;\n            if (c < a) return (false, 0);\n            return (true, c);\n        }\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, with an success flag (no overflow).\n     */\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            if (b > a) return (false, 0);\n            return (true, a - b);\n        }\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, with an success flag (no overflow).\n     */\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n            // benefit is lost if 'b' is also tested.\n            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n            if (a == 0) return (true, 0);\n            uint256 c = a * b;\n            if (c / a != b) return (false, 0);\n            return (true, c);\n        }\n    }\n\n    /**\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            if (b == 0) return (false, 0);\n            return (true, a / b);\n        }\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            if (b == 0) return (false, 0);\n            return (true, a % b);\n        }\n    }\n\n    /**\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\n        }\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a > b, a, b);\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a < b, a, b);\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b) / 2 can overflow.\n        return (a & b) + (a ^ b) / 2;\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds towards infinity instead\n     * of rounding towards zero.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        if (b == 0) {\n            // Guarantee the same behavior as in a regular Solidity division.\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n\n        // The following calculation ensures accurate ceiling division without overflow.\n        // Since a is non-zero, (a - 1) / b will not overflow.\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\n        // when a = type(uint256).max and b = 1.\n        unchecked {\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n        }\n    }\n\n    /**\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n     * denominator == 0.\n     *\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n     * Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n            // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2²⁵⁶ + prod0.\n            uint256 prod0 = x * y; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly {\n                let mm := mulmod(x, y, not(0))\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (prod1 == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return prod0 / denominator;\n            }\n\n            // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n            if (denominator <= prod1) {\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0].\n            uint256 remainder;\n            assembly {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n            uint256 twos = denominator & (0 - denominator);\n            assembly {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [prod1 prod0] by twos.\n                prod0 := div(prod0, twos)\n\n                // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from prod1 into prod0.\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n            // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n            // works in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n            inverse *= 2 - denominator * inverse; // inverse mod 2³²\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n            // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n    }\n\n    /**\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n     *\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n     *\n     * If the input value is not inversible, 0 is returned.\n     *\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n     */\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n        unchecked {\n            if (n == 0) return 0;\n\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n            // ax + ny = 1\n            // ax = 1 + (-y)n\n            // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n            // If the remainder is 0 the gcd is n right away.\n            uint256 remainder = a % n;\n            uint256 gcd = n;\n\n            // Therefore the initial coefficients are:\n            // ax + ny = gcd(a, n) = n\n            // 0a + 1n = n\n            int256 x = 0;\n            int256 y = 1;\n\n            while (remainder != 0) {\n                uint256 quotient = gcd / remainder;\n\n                (gcd, remainder) = (\n                    // The old remainder is the next gcd to try.\n                    remainder,\n                    // Compute the next remainder.\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n                    // where gcd is at most n (capped to type(uint256).max)\n                    gcd - remainder * quotient\n                );\n\n                (x, y) = (\n                    // Increment the coefficient of a.\n                    y,\n                    // Decrement the coefficient of n.\n                    // Can overflow, but the result is casted to uint256 so that the\n                    // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n                    x - y * int256(quotient)\n                );\n            }\n\n            if (gcd != 1) return 0; // No inverse exists.\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n        }\n    }\n\n    /**\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n     *\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n     * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n     *\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n     */\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n        unchecked {\n            return Math.modExp(a, p - 2, p);\n        }\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n     *\n     * Requirements:\n     * - modulus can't be zero\n     * - underlying staticcall to precompile must succeed\n     *\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n     * interpreted as 0.\n     */\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n        (bool success, uint256 result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n     * to operate modulo 0 or if the underlying precompile reverted.\n     *\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n     * of a revert, but the result may be incorrectly interpreted as 0.\n     */\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n        if (m == 0) return (false, 0);\n        assembly (\"memory-safe\") {\n            let ptr := mload(0x40)\n            // | Offset    | Content    | Content (Hex)                                                      |\n            // |-----------|------------|--------------------------------------------------------------------|\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n            mstore(ptr, 0x20)\n            mstore(add(ptr, 0x20), 0x20)\n            mstore(add(ptr, 0x40), 0x20)\n            mstore(add(ptr, 0x60), b)\n            mstore(add(ptr, 0x80), e)\n            mstore(add(ptr, 0xa0), m)\n\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\n            // so we can use the memory scratch space located at offset 0.\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n            result := mload(0x00)\n        }\n    }\n\n    /**\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\n     */\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n        (bool success, bytes memory result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n     */\n    function tryModExp(\n        bytes memory b,\n        bytes memory e,\n        bytes memory m\n    ) internal view returns (bool success, bytes memory result) {\n        if (_zeroBytes(m)) return (false, new bytes(0));\n\n        uint256 mLen = m.length;\n\n        // Encode call args in result and move the free memory pointer\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n        assembly (\"memory-safe\") {\n            let dataPtr := add(result, 0x20)\n            // Write result on top of args to avoid allocating extra memory.\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n            // Overwrite the length.\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n            mstore(result, mLen)\n            // Set the memory pointer after the returned data.\n            mstore(0x40, add(dataPtr, mLen))\n        }\n    }\n\n    /**\n     * @dev Returns whether the provided byte array is zero.\n     */\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n        for (uint256 i = 0; i < byteArray.length; ++i) {\n            if (byteArray[i] != 0) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n     * towards zero.\n     *\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n     * using integer operations.\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        unchecked {\n            // Take care of easy edge cases when a == 0 or a == 1\n            if (a <= 1) {\n                return a;\n            }\n\n            // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n            // the current value as `ε_n = | x_n - sqrt(a) |`.\n            //\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n            // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n            // bigger than any uint256.\n            //\n            // By noticing that\n            // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n            // to the msb function.\n            uint256 aa = a;\n            uint256 xn = 1;\n\n            if (aa >= (1 << 128)) {\n                aa >>= 128;\n                xn <<= 64;\n            }\n            if (aa >= (1 << 64)) {\n                aa >>= 64;\n                xn <<= 32;\n            }\n            if (aa >= (1 << 32)) {\n                aa >>= 32;\n                xn <<= 16;\n            }\n            if (aa >= (1 << 16)) {\n                aa >>= 16;\n                xn <<= 8;\n            }\n            if (aa >= (1 << 8)) {\n                aa >>= 8;\n                xn <<= 4;\n            }\n            if (aa >= (1 << 4)) {\n                aa >>= 4;\n                xn <<= 2;\n            }\n            if (aa >= (1 << 2)) {\n                xn <<= 1;\n            }\n\n            // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n            //\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n            // This is going to be our x_0 (and ε_0)\n            xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n            // From here, Newton's method give us:\n            // x_{n+1} = (x_n + a / x_n) / 2\n            //\n            // One should note that:\n            // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n            //              = ((x_n² + a) / (2 * x_n))² - a\n            //              = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n            //              = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n            //              = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n            //              = (x_n² - a)² / (2 * x_n)²\n            //              = ((x_n² - a) / (2 * x_n))²\n            //              ≥ 0\n            // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n            //\n            // This gives us the proof of quadratic convergence of the sequence:\n            // ε_{n+1} = | x_{n+1} - sqrt(a) |\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\n            //         = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n            //         = | (x_n - sqrt(a))² / (2 * x_n) |\n            //         = | ε_n² / (2 * x_n) |\n            //         = ε_n² / | (2 * x_n) |\n            //\n            // For the first iteration, we have a special case where x_0 is known:\n            // ε_1 = ε_0² / | (2 * x_0) |\n            //     ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n            //     ≤ 2**(2*e-4) / (3 * 2**(e-1))\n            //     ≤ 2**(e-3) / 3\n            //     ≤ 2**(e-3-log2(3))\n            //     ≤ 2**(e-4.5)\n            //\n            // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n            // ε_{n+1} = ε_n² / | (2 * x_n) |\n            //         ≤ (2**(e-k))² / (2 * 2**(e-1))\n            //         ≤ 2**(2*e-2*k) / 2**e\n            //         ≤ 2**(e-2*k)\n            xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5)  -- special case, see above\n            xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9)    -- general case with k = 4.5\n            xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18)   -- general case with k = 9\n            xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36)   -- general case with k = 18\n            xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72)   -- general case with k = 36\n            xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144)  -- general case with k = 72\n\n            // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n            // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n            // sqrt(a) or sqrt(a) + 1.\n            return xn - SafeCast.toUint(xn > a / xn);\n        }\n    }\n\n    /**\n     * @dev Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        uint256 exp;\n        unchecked {\n            exp = 128 * SafeCast.toUint(value > (1 << 128) - 1);\n            value >>= exp;\n            result += exp;\n\n            exp = 64 * SafeCast.toUint(value > (1 << 64) - 1);\n            value >>= exp;\n            result += exp;\n\n            exp = 32 * SafeCast.toUint(value > (1 << 32) - 1);\n            value >>= exp;\n            result += exp;\n\n            exp = 16 * SafeCast.toUint(value > (1 << 16) - 1);\n            value >>= exp;\n            result += exp;\n\n            exp = 8 * SafeCast.toUint(value > (1 << 8) - 1);\n            value >>= exp;\n            result += exp;\n\n            exp = 4 * SafeCast.toUint(value > (1 << 4) - 1);\n            value >>= exp;\n            result += exp;\n\n            exp = 2 * SafeCast.toUint(value > (1 << 2) - 1);\n            value >>= exp;\n            result += exp;\n\n            result += SafeCast.toUint(value > 1);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        uint256 isGt;\n        unchecked {\n            isGt = SafeCast.toUint(value > (1 << 128) - 1);\n            value >>= isGt * 128;\n            result += isGt * 16;\n\n            isGt = SafeCast.toUint(value > (1 << 64) - 1);\n            value >>= isGt * 64;\n            result += isGt * 8;\n\n            isGt = SafeCast.toUint(value > (1 << 32) - 1);\n            value >>= isGt * 32;\n            result += isGt * 4;\n\n            isGt = SafeCast.toUint(value > (1 << 16) - 1);\n            value >>= isGt * 16;\n            result += isGt * 2;\n\n            result += SafeCast.toUint(value > (1 << 8) - 1);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n        }\n    }\n\n    /**\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n     */\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n        return uint8(rounding) % 2 == 1;\n    }\n}\n"},"@openzeppelin/contracts/utils/math/SafeCast.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n    /**\n     * @dev Value doesn't fit in an uint of `bits` size.\n     */\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n    /**\n     * @dev An int value doesn't fit in an uint of `bits` size.\n     */\n    error SafeCastOverflowedIntToUint(int256 value);\n\n    /**\n     * @dev Value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n    /**\n     * @dev An uint value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedUintToInt(uint256 value);\n\n    /**\n     * @dev Returns the downcasted uint248 from uint256, reverting on\n     * overflow (when the input is greater than largest uint248).\n     *\n     * Counterpart to Solidity's `uint248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toUint248(uint256 value) internal pure returns (uint248) {\n        if (value > type(uint248).max) {\n            revert SafeCastOverflowedUintDowncast(248, value);\n        }\n        return uint248(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint240 from uint256, reverting on\n     * overflow (when the input is greater than largest uint240).\n     *\n     * Counterpart to Solidity's `uint240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toUint240(uint256 value) internal pure returns (uint240) {\n        if (value > type(uint240).max) {\n            revert SafeCastOverflowedUintDowncast(240, value);\n        }\n        return uint240(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint232 from uint256, reverting on\n     * overflow (when the input is greater than largest uint232).\n     *\n     * Counterpart to Solidity's `uint232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toUint232(uint256 value) internal pure returns (uint232) {\n        if (value > type(uint232).max) {\n            revert SafeCastOverflowedUintDowncast(232, value);\n        }\n        return uint232(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint224 from uint256, reverting on\n     * overflow (when the input is greater than largest uint224).\n     *\n     * Counterpart to Solidity's `uint224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toUint224(uint256 value) internal pure returns (uint224) {\n        if (value > type(uint224).max) {\n            revert SafeCastOverflowedUintDowncast(224, value);\n        }\n        return uint224(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint216 from uint256, reverting on\n     * overflow (when the input is greater than largest uint216).\n     *\n     * Counterpart to Solidity's `uint216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toUint216(uint256 value) internal pure returns (uint216) {\n        if (value > type(uint216).max) {\n            revert SafeCastOverflowedUintDowncast(216, value);\n        }\n        return uint216(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint208 from uint256, reverting on\n     * overflow (when the input is greater than largest uint208).\n     *\n     * Counterpart to Solidity's `uint208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toUint208(uint256 value) internal pure returns (uint208) {\n        if (value > type(uint208).max) {\n            revert SafeCastOverflowedUintDowncast(208, value);\n        }\n        return uint208(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint200 from uint256, reverting on\n     * overflow (when the input is greater than largest uint200).\n     *\n     * Counterpart to Solidity's `uint200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toUint200(uint256 value) internal pure returns (uint200) {\n        if (value > type(uint200).max) {\n            revert SafeCastOverflowedUintDowncast(200, value);\n        }\n        return uint200(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint192 from uint256, reverting on\n     * overflow (when the input is greater than largest uint192).\n     *\n     * Counterpart to Solidity's `uint192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toUint192(uint256 value) internal pure returns (uint192) {\n        if (value > type(uint192).max) {\n            revert SafeCastOverflowedUintDowncast(192, value);\n        }\n        return uint192(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint184 from uint256, reverting on\n     * overflow (when the input is greater than largest uint184).\n     *\n     * Counterpart to Solidity's `uint184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toUint184(uint256 value) internal pure returns (uint184) {\n        if (value > type(uint184).max) {\n            revert SafeCastOverflowedUintDowncast(184, value);\n        }\n        return uint184(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint176 from uint256, reverting on\n     * overflow (when the input is greater than largest uint176).\n     *\n     * Counterpart to Solidity's `uint176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toUint176(uint256 value) internal pure returns (uint176) {\n        if (value > type(uint176).max) {\n            revert SafeCastOverflowedUintDowncast(176, value);\n        }\n        return uint176(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint168 from uint256, reverting on\n     * overflow (when the input is greater than largest uint168).\n     *\n     * Counterpart to Solidity's `uint168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toUint168(uint256 value) internal pure returns (uint168) {\n        if (value > type(uint168).max) {\n            revert SafeCastOverflowedUintDowncast(168, value);\n        }\n        return uint168(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint160 from uint256, reverting on\n     * overflow (when the input is greater than largest uint160).\n     *\n     * Counterpart to Solidity's `uint160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toUint160(uint256 value) internal pure returns (uint160) {\n        if (value > type(uint160).max) {\n            revert SafeCastOverflowedUintDowncast(160, value);\n        }\n        return uint160(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint152 from uint256, reverting on\n     * overflow (when the input is greater than largest uint152).\n     *\n     * Counterpart to Solidity's `uint152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toUint152(uint256 value) internal pure returns (uint152) {\n        if (value > type(uint152).max) {\n            revert SafeCastOverflowedUintDowncast(152, value);\n        }\n        return uint152(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint144 from uint256, reverting on\n     * overflow (when the input is greater than largest uint144).\n     *\n     * Counterpart to Solidity's `uint144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toUint144(uint256 value) internal pure returns (uint144) {\n        if (value > type(uint144).max) {\n            revert SafeCastOverflowedUintDowncast(144, value);\n        }\n        return uint144(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint136 from uint256, reverting on\n     * overflow (when the input is greater than largest uint136).\n     *\n     * Counterpart to Solidity's `uint136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toUint136(uint256 value) internal pure returns (uint136) {\n        if (value > type(uint136).max) {\n            revert SafeCastOverflowedUintDowncast(136, value);\n        }\n        return uint136(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint128 from uint256, reverting on\n     * overflow (when the input is greater than largest uint128).\n     *\n     * Counterpart to Solidity's `uint128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toUint128(uint256 value) internal pure returns (uint128) {\n        if (value > type(uint128).max) {\n            revert SafeCastOverflowedUintDowncast(128, value);\n        }\n        return uint128(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint120 from uint256, reverting on\n     * overflow (when the input is greater than largest uint120).\n     *\n     * Counterpart to Solidity's `uint120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toUint120(uint256 value) internal pure returns (uint120) {\n        if (value > type(uint120).max) {\n            revert SafeCastOverflowedUintDowncast(120, value);\n        }\n        return uint120(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint112 from uint256, reverting on\n     * overflow (when the input is greater than largest uint112).\n     *\n     * Counterpart to Solidity's `uint112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toUint112(uint256 value) internal pure returns (uint112) {\n        if (value > type(uint112).max) {\n            revert SafeCastOverflowedUintDowncast(112, value);\n        }\n        return uint112(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint104 from uint256, reverting on\n     * overflow (when the input is greater than largest uint104).\n     *\n     * Counterpart to Solidity's `uint104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toUint104(uint256 value) internal pure returns (uint104) {\n        if (value > type(uint104).max) {\n            revert SafeCastOverflowedUintDowncast(104, value);\n        }\n        return uint104(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint96 from uint256, reverting on\n     * overflow (when the input is greater than largest uint96).\n     *\n     * Counterpart to Solidity's `uint96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toUint96(uint256 value) internal pure returns (uint96) {\n        if (value > type(uint96).max) {\n            revert SafeCastOverflowedUintDowncast(96, value);\n        }\n        return uint96(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint88 from uint256, reverting on\n     * overflow (when the input is greater than largest uint88).\n     *\n     * Counterpart to Solidity's `uint88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toUint88(uint256 value) internal pure returns (uint88) {\n        if (value > type(uint88).max) {\n            revert SafeCastOverflowedUintDowncast(88, value);\n        }\n        return uint88(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint80 from uint256, reverting on\n     * overflow (when the input is greater than largest uint80).\n     *\n     * Counterpart to Solidity's `uint80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toUint80(uint256 value) internal pure returns (uint80) {\n        if (value > type(uint80).max) {\n            revert SafeCastOverflowedUintDowncast(80, value);\n        }\n        return uint80(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint72 from uint256, reverting on\n     * overflow (when the input is greater than largest uint72).\n     *\n     * Counterpart to Solidity's `uint72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toUint72(uint256 value) internal pure returns (uint72) {\n        if (value > type(uint72).max) {\n            revert SafeCastOverflowedUintDowncast(72, value);\n        }\n        return uint72(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint64 from uint256, reverting on\n     * overflow (when the input is greater than largest uint64).\n     *\n     * Counterpart to Solidity's `uint64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toUint64(uint256 value) internal pure returns (uint64) {\n        if (value > type(uint64).max) {\n            revert SafeCastOverflowedUintDowncast(64, value);\n        }\n        return uint64(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint56 from uint256, reverting on\n     * overflow (when the input is greater than largest uint56).\n     *\n     * Counterpart to Solidity's `uint56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toUint56(uint256 value) internal pure returns (uint56) {\n        if (value > type(uint56).max) {\n            revert SafeCastOverflowedUintDowncast(56, value);\n        }\n        return uint56(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint48 from uint256, reverting on\n     * overflow (when the input is greater than largest uint48).\n     *\n     * Counterpart to Solidity's `uint48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toUint48(uint256 value) internal pure returns (uint48) {\n        if (value > type(uint48).max) {\n            revert SafeCastOverflowedUintDowncast(48, value);\n        }\n        return uint48(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint40 from uint256, reverting on\n     * overflow (when the input is greater than largest uint40).\n     *\n     * Counterpart to Solidity's `uint40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toUint40(uint256 value) internal pure returns (uint40) {\n        if (value > type(uint40).max) {\n            revert SafeCastOverflowedUintDowncast(40, value);\n        }\n        return uint40(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint32 from uint256, reverting on\n     * overflow (when the input is greater than largest uint32).\n     *\n     * Counterpart to Solidity's `uint32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toUint32(uint256 value) internal pure returns (uint32) {\n        if (value > type(uint32).max) {\n            revert SafeCastOverflowedUintDowncast(32, value);\n        }\n        return uint32(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint24 from uint256, reverting on\n     * overflow (when the input is greater than largest uint24).\n     *\n     * Counterpart to Solidity's `uint24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toUint24(uint256 value) internal pure returns (uint24) {\n        if (value > type(uint24).max) {\n            revert SafeCastOverflowedUintDowncast(24, value);\n        }\n        return uint24(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint16 from uint256, reverting on\n     * overflow (when the input is greater than largest uint16).\n     *\n     * Counterpart to Solidity's `uint16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toUint16(uint256 value) internal pure returns (uint16) {\n        if (value > type(uint16).max) {\n            revert SafeCastOverflowedUintDowncast(16, value);\n        }\n        return uint16(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint8 from uint256, reverting on\n     * overflow (when the input is greater than largest uint8).\n     *\n     * Counterpart to Solidity's `uint8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toUint8(uint256 value) internal pure returns (uint8) {\n        if (value > type(uint8).max) {\n            revert SafeCastOverflowedUintDowncast(8, value);\n        }\n        return uint8(value);\n    }\n\n    /**\n     * @dev Converts a signed int256 into an unsigned uint256.\n     *\n     * Requirements:\n     *\n     * - input must be greater than or equal to 0.\n     */\n    function toUint256(int256 value) internal pure returns (uint256) {\n        if (value < 0) {\n            revert SafeCastOverflowedIntToUint(value);\n        }\n        return uint256(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int248 from int256, reverting on\n     * overflow (when the input is less than smallest int248 or\n     * greater than largest int248).\n     *\n     * Counterpart to Solidity's `int248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\n        downcasted = int248(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(248, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int240 from int256, reverting on\n     * overflow (when the input is less than smallest int240 or\n     * greater than largest int240).\n     *\n     * Counterpart to Solidity's `int240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\n        downcasted = int240(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(240, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int232 from int256, reverting on\n     * overflow (when the input is less than smallest int232 or\n     * greater than largest int232).\n     *\n     * Counterpart to Solidity's `int232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\n        downcasted = int232(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(232, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int224 from int256, reverting on\n     * overflow (when the input is less than smallest int224 or\n     * greater than largest int224).\n     *\n     * Counterpart to Solidity's `int224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\n        downcasted = int224(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(224, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int216 from int256, reverting on\n     * overflow (when the input is less than smallest int216 or\n     * greater than largest int216).\n     *\n     * Counterpart to Solidity's `int216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\n        downcasted = int216(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(216, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int208 from int256, reverting on\n     * overflow (when the input is less than smallest int208 or\n     * greater than largest int208).\n     *\n     * Counterpart to Solidity's `int208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\n        downcasted = int208(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(208, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int200 from int256, reverting on\n     * overflow (when the input is less than smallest int200 or\n     * greater than largest int200).\n     *\n     * Counterpart to Solidity's `int200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\n        downcasted = int200(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(200, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int192 from int256, reverting on\n     * overflow (when the input is less than smallest int192 or\n     * greater than largest int192).\n     *\n     * Counterpart to Solidity's `int192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\n        downcasted = int192(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(192, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int184 from int256, reverting on\n     * overflow (when the input is less than smallest int184 or\n     * greater than largest int184).\n     *\n     * Counterpart to Solidity's `int184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\n        downcasted = int184(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(184, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int176 from int256, reverting on\n     * overflow (when the input is less than smallest int176 or\n     * greater than largest int176).\n     *\n     * Counterpart to Solidity's `int176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\n        downcasted = int176(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(176, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int168 from int256, reverting on\n     * overflow (when the input is less than smallest int168 or\n     * greater than largest int168).\n     *\n     * Counterpart to Solidity's `int168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\n        downcasted = int168(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(168, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int160 from int256, reverting on\n     * overflow (when the input is less than smallest int160 or\n     * greater than largest int160).\n     *\n     * Counterpart to Solidity's `int160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\n        downcasted = int160(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(160, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int152 from int256, reverting on\n     * overflow (when the input is less than smallest int152 or\n     * greater than largest int152).\n     *\n     * Counterpart to Solidity's `int152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\n        downcasted = int152(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(152, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int144 from int256, reverting on\n     * overflow (when the input is less than smallest int144 or\n     * greater than largest int144).\n     *\n     * Counterpart to Solidity's `int144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\n        downcasted = int144(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(144, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int136 from int256, reverting on\n     * overflow (when the input is less than smallest int136 or\n     * greater than largest int136).\n     *\n     * Counterpart to Solidity's `int136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\n        downcasted = int136(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(136, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int128 from int256, reverting on\n     * overflow (when the input is less than smallest int128 or\n     * greater than largest int128).\n     *\n     * Counterpart to Solidity's `int128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\n        downcasted = int128(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(128, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int120 from int256, reverting on\n     * overflow (when the input is less than smallest int120 or\n     * greater than largest int120).\n     *\n     * Counterpart to Solidity's `int120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\n        downcasted = int120(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(120, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int112 from int256, reverting on\n     * overflow (when the input is less than smallest int112 or\n     * greater than largest int112).\n     *\n     * Counterpart to Solidity's `int112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\n        downcasted = int112(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(112, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int104 from int256, reverting on\n     * overflow (when the input is less than smallest int104 or\n     * greater than largest int104).\n     *\n     * Counterpart to Solidity's `int104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\n        downcasted = int104(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(104, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int96 from int256, reverting on\n     * overflow (when the input is less than smallest int96 or\n     * greater than largest int96).\n     *\n     * Counterpart to Solidity's `int96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\n        downcasted = int96(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(96, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int88 from int256, reverting on\n     * overflow (when the input is less than smallest int88 or\n     * greater than largest int88).\n     *\n     * Counterpart to Solidity's `int88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\n        downcasted = int88(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(88, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int80 from int256, reverting on\n     * overflow (when the input is less than smallest int80 or\n     * greater than largest int80).\n     *\n     * Counterpart to Solidity's `int80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\n        downcasted = int80(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(80, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int72 from int256, reverting on\n     * overflow (when the input is less than smallest int72 or\n     * greater than largest int72).\n     *\n     * Counterpart to Solidity's `int72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\n        downcasted = int72(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(72, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int64 from int256, reverting on\n     * overflow (when the input is less than smallest int64 or\n     * greater than largest int64).\n     *\n     * Counterpart to Solidity's `int64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\n        downcasted = int64(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(64, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int56 from int256, reverting on\n     * overflow (when the input is less than smallest int56 or\n     * greater than largest int56).\n     *\n     * Counterpart to Solidity's `int56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\n        downcasted = int56(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(56, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int48 from int256, reverting on\n     * overflow (when the input is less than smallest int48 or\n     * greater than largest int48).\n     *\n     * Counterpart to Solidity's `int48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\n        downcasted = int48(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(48, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int40 from int256, reverting on\n     * overflow (when the input is less than smallest int40 or\n     * greater than largest int40).\n     *\n     * Counterpart to Solidity's `int40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\n        downcasted = int40(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(40, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int32 from int256, reverting on\n     * overflow (when the input is less than smallest int32 or\n     * greater than largest int32).\n     *\n     * Counterpart to Solidity's `int32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\n        downcasted = int32(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(32, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int24 from int256, reverting on\n     * overflow (when the input is less than smallest int24 or\n     * greater than largest int24).\n     *\n     * Counterpart to Solidity's `int24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\n        downcasted = int24(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(24, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int16 from int256, reverting on\n     * overflow (when the input is less than smallest int16 or\n     * greater than largest int16).\n     *\n     * Counterpart to Solidity's `int16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\n        downcasted = int16(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(16, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int8 from int256, reverting on\n     * overflow (when the input is less than smallest int8 or\n     * greater than largest int8).\n     *\n     * Counterpart to Solidity's `int8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\n        downcasted = int8(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(8, value);\n        }\n    }\n\n    /**\n     * @dev Converts an unsigned uint256 into a signed int256.\n     *\n     * Requirements:\n     *\n     * - input must be less than or equal to maxInt256.\n     */\n    function toInt256(uint256 value) internal pure returns (int256) {\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n        if (value > uint256(type(int256).max)) {\n            revert SafeCastOverflowedUintToInt(value);\n        }\n        return int256(value);\n    }\n\n    /**\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n     */\n    function toUint(bool b) internal pure returns (uint256 u) {\n        assembly (\"memory-safe\") {\n            u := iszero(iszero(b))\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n    /**\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n        }\n    }\n\n    /**\n     * @dev Returns the largest of two signed numbers.\n     */\n    function max(int256 a, int256 b) internal pure returns (int256) {\n        return ternary(a > b, a, b);\n    }\n\n    /**\n     * @dev Returns the smallest of two signed numbers.\n     */\n    function min(int256 a, int256 b) internal pure returns (int256) {\n        return ternary(a < b, a, b);\n    }\n\n    /**\n     * @dev Returns the average of two signed numbers without overflow.\n     * The result is rounded towards zero.\n     */\n    function average(int256 a, int256 b) internal pure returns (int256) {\n        // Formula from the book \"Hacker's Delight\"\n        int256 x = (a & b) + ((a ^ b) >> 1);\n        return x + (int256(uint256(x) >> 255) & (a ^ b));\n    }\n\n    /**\n     * @dev Returns the absolute unsigned value of a signed value.\n     */\n    function abs(int256 n) internal pure returns (uint256) {\n        unchecked {\n            // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n            // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n            // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n            // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n            // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n            int256 mask = n >> 255;\n\n            // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n            return uint256((n + mask) ^ mask);\n        }\n    }\n}\n"},"@openzeppelin/contracts/access/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    /**\n     * @dev The caller account is not authorized to perform an operation.\n     */\n    error OwnableUnauthorizedAccount(address account);\n\n    /**\n     * @dev The owner is not a valid owner account. (eg. `address(0)`)\n     */\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n     */\n    constructor(address initialOwner) {\n        if (initialOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(initialOwner);\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        if (owner() != _msgSender()) {\n            revert OwnableUnauthorizedAccount(_msgSender());\n        }\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        if (newOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC20InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC20InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     * @param allowance Amount of tokens a `spender` is allowed to operate with.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC20InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n    /**\n     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n     * Used in balance queries.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721InvalidOwner(address owner);\n\n    /**\n     * @dev Indicates a `tokenId` whose `owner` is the zero address.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721NonexistentToken(uint256 tokenId);\n\n    /**\n     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param tokenId Identifier number of a token.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC721InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC721InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC721InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC1155InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC1155InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC1155MissingApprovalForAll(address operator, address owner);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC1155InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC1155InvalidOperator(address operator);\n\n    /**\n     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n     * Used in batch transfers.\n     * @param idsLength Length of the array of token identifiers\n     * @param valuesLength Length of the array of token amounts\n     */\n    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"},"@openzeppelin/contracts/token/ERC721/ERC721.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721} from \"./IERC721.sol\";\nimport {IERC721Metadata} from \"./extensions/IERC721Metadata.sol\";\nimport {ERC721Utils} from \"./utils/ERC721Utils.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {Strings} from \"../../utils/Strings.sol\";\nimport {IERC165, ERC165} from \"../../utils/introspection/ERC165.sol\";\nimport {IERC721Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC-721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\nabstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {\n    using Strings for uint256;\n\n    // Token name\n    string private _name;\n\n    // Token symbol\n    string private _symbol;\n\n    mapping(uint256 tokenId => address) private _owners;\n\n    mapping(address owner => uint256) private _balances;\n\n    mapping(uint256 tokenId => address) private _tokenApprovals;\n\n    mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;\n\n    /**\n     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n     */\n    constructor(string memory name_, string memory symbol_) {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n        return\n            interfaceId == type(IERC721).interfaceId ||\n            interfaceId == type(IERC721Metadata).interfaceId ||\n            super.supportsInterface(interfaceId);\n    }\n\n    /**\n     * @dev See {IERC721-balanceOf}.\n     */\n    function balanceOf(address owner) public view virtual returns (uint256) {\n        if (owner == address(0)) {\n            revert ERC721InvalidOwner(address(0));\n        }\n        return _balances[owner];\n    }\n\n    /**\n     * @dev See {IERC721-ownerOf}.\n     */\n    function ownerOf(uint256 tokenId) public view virtual returns (address) {\n        return _requireOwned(tokenId);\n    }\n\n    /**\n     * @dev See {IERC721Metadata-name}.\n     */\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev See {IERC721Metadata-symbol}.\n     */\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev See {IERC721Metadata-tokenURI}.\n     */\n    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {\n        _requireOwned(tokenId);\n\n        string memory baseURI = _baseURI();\n        return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : \"\";\n    }\n\n    /**\n     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n     * by default, can be overridden in child contracts.\n     */\n    function _baseURI() internal view virtual returns (string memory) {\n        return \"\";\n    }\n\n    /**\n     * @dev See {IERC721-approve}.\n     */\n    function approve(address to, uint256 tokenId) public virtual {\n        _approve(to, tokenId, _msgSender());\n    }\n\n    /**\n     * @dev See {IERC721-getApproved}.\n     */\n    function getApproved(uint256 tokenId) public view virtual returns (address) {\n        _requireOwned(tokenId);\n\n        return _getApproved(tokenId);\n    }\n\n    /**\n     * @dev See {IERC721-setApprovalForAll}.\n     */\n    function setApprovalForAll(address operator, bool approved) public virtual {\n        _setApprovalForAll(_msgSender(), operator, approved);\n    }\n\n    /**\n     * @dev See {IERC721-isApprovedForAll}.\n     */\n    function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {\n        return _operatorApprovals[owner][operator];\n    }\n\n    /**\n     * @dev See {IERC721-transferFrom}.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) public virtual {\n        if (to == address(0)) {\n            revert ERC721InvalidReceiver(address(0));\n        }\n        // Setting an \"auth\" arguments enables the `_isAuthorized` check which verifies that the token exists\n        // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.\n        address previousOwner = _update(to, tokenId, _msgSender());\n        if (previousOwner != from) {\n            revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n        }\n    }\n\n    /**\n     * @dev See {IERC721-safeTransferFrom}.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) public {\n        safeTransferFrom(from, to, tokenId, \"\");\n    }\n\n    /**\n     * @dev See {IERC721-safeTransferFrom}.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {\n        transferFrom(from, to, tokenId);\n        ERC721Utils.checkOnERC721Received(_msgSender(), from, to, tokenId, data);\n    }\n\n    /**\n     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n     *\n     * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the\n     * core ERC-721 logic MUST be matched with the use of {_increaseBalance} to keep balances\n     * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by\n     * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.\n     */\n    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n        return _owners[tokenId];\n    }\n\n    /**\n     * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.\n     */\n    function _getApproved(uint256 tokenId) internal view virtual returns (address) {\n        return _tokenApprovals[tokenId];\n    }\n\n    /**\n     * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in\n     * particular (ignoring whether it is owned by `owner`).\n     *\n     * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n     * assumption.\n     */\n    function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {\n        return\n            spender != address(0) &&\n            (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);\n    }\n\n    /**\n     * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.\n     * Reverts if:\n     * - `spender` does not have approval from `owner` for `tokenId`.\n     * - `spender` does not have approval to manage all of `owner`'s assets.\n     *\n     * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n     * assumption.\n     */\n    function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {\n        if (!_isAuthorized(owner, spender, tokenId)) {\n            if (owner == address(0)) {\n                revert ERC721NonexistentToken(tokenId);\n            } else {\n                revert ERC721InsufficientApproval(spender, tokenId);\n            }\n        }\n    }\n\n    /**\n     * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n     *\n     * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that\n     * a uint256 would ever overflow from increments when these increments are bounded to uint128 values.\n     *\n     * WARNING: Increasing an account's balance using this function tends to be paired with an override of the\n     * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership\n     * remain consistent with one another.\n     */\n    function _increaseBalance(address account, uint128 value) internal virtual {\n        unchecked {\n            _balances[account] += value;\n        }\n    }\n\n    /**\n     * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner\n     * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.\n     *\n     * The `auth` argument is optional. If the value passed is non 0, then this function will check that\n     * `auth` is either the owner of the token, or approved to operate on the token (by the owner).\n     *\n     * Emits a {Transfer} event.\n     *\n     * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.\n     */\n    function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {\n        address from = _ownerOf(tokenId);\n\n        // Perform (optional) operator check\n        if (auth != address(0)) {\n            _checkAuthorized(from, auth, tokenId);\n        }\n\n        // Execute the update\n        if (from != address(0)) {\n            // Clear approval. No need to re-authorize or emit the Approval event\n            _approve(address(0), tokenId, address(0), false);\n\n            unchecked {\n                _balances[from] -= 1;\n            }\n        }\n\n        if (to != address(0)) {\n            unchecked {\n                _balances[to] += 1;\n            }\n        }\n\n        _owners[tokenId] = to;\n\n        emit Transfer(from, to, tokenId);\n\n        return from;\n    }\n\n    /**\n     * @dev Mints `tokenId` and transfers it to `to`.\n     *\n     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n     *\n     * Requirements:\n     *\n     * - `tokenId` must not exist.\n     * - `to` cannot be the zero address.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _mint(address to, uint256 tokenId) internal {\n        if (to == address(0)) {\n            revert ERC721InvalidReceiver(address(0));\n        }\n        address previousOwner = _update(to, tokenId, address(0));\n        if (previousOwner != address(0)) {\n            revert ERC721InvalidSender(address(0));\n        }\n    }\n\n    /**\n     * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must not exist.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeMint(address to, uint256 tokenId) internal {\n        _safeMint(to, tokenId, \"\");\n    }\n\n    /**\n     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n     */\n    function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\n        _mint(to, tokenId);\n        ERC721Utils.checkOnERC721Received(_msgSender(), address(0), to, tokenId, data);\n    }\n\n    /**\n     * @dev Destroys `tokenId`.\n     * The approval is cleared when the token is burned.\n     * This is an internal function that does not check if the sender is authorized to operate on the token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _burn(uint256 tokenId) internal {\n        address previousOwner = _update(address(0), tokenId, address(0));\n        if (previousOwner == address(0)) {\n            revert ERC721NonexistentToken(tokenId);\n        }\n    }\n\n    /**\n     * @dev Transfers `tokenId` from `from` to `to`.\n     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _transfer(address from, address to, uint256 tokenId) internal {\n        if (to == address(0)) {\n            revert ERC721InvalidReceiver(address(0));\n        }\n        address previousOwner = _update(to, tokenId, address(0));\n        if (previousOwner == address(0)) {\n            revert ERC721NonexistentToken(tokenId);\n        } else if (previousOwner != from) {\n            revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n        }\n    }\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients\n     * are aware of the ERC-721 standard to prevent tokens from being forever locked.\n     *\n     * `data` is additional data, it has no specified format and it is sent in call to `to`.\n     *\n     * This internal function is like {safeTransferFrom} in the sense that it invokes\n     * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.\n     * implement alternative mechanisms to perform token transfer, such as signature-based.\n     *\n     * Requirements:\n     *\n     * - `tokenId` token must exist and be owned by `from`.\n     * - `to` cannot be the zero address.\n     * - `from` cannot be the zero address.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeTransfer(address from, address to, uint256 tokenId) internal {\n        _safeTransfer(from, to, tokenId, \"\");\n    }\n\n    /**\n     * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n     */\n    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\n        _transfer(from, to, tokenId);\n        ERC721Utils.checkOnERC721Received(_msgSender(), from, to, tokenId, data);\n    }\n\n    /**\n     * @dev Approve `to` to operate on `tokenId`\n     *\n     * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is\n     * either the owner of the token, or approved to operate on all tokens held by this owner.\n     *\n     * Emits an {Approval} event.\n     *\n     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n     */\n    function _approve(address to, uint256 tokenId, address auth) internal {\n        _approve(to, tokenId, auth, true);\n    }\n\n    /**\n     * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not\n     * emitted in the context of transfers.\n     */\n    function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {\n        // Avoid reading the owner unless necessary\n        if (emitEvent || auth != address(0)) {\n            address owner = _requireOwned(tokenId);\n\n            // We do not use _isAuthorized because single-token approvals should not be able to call approve\n            if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {\n                revert ERC721InvalidApprover(auth);\n            }\n\n            if (emitEvent) {\n                emit Approval(owner, to, tokenId);\n            }\n        }\n\n        _tokenApprovals[tokenId] = to;\n    }\n\n    /**\n     * @dev Approve `operator` to operate on all of `owner` tokens\n     *\n     * Requirements:\n     * - operator can't be the address zero.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n        if (operator == address(0)) {\n            revert ERC721InvalidOperator(operator);\n        }\n        _operatorApprovals[owner][operator] = approved;\n        emit ApprovalForAll(owner, operator, approved);\n    }\n\n    /**\n     * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).\n     * Returns the owner.\n     *\n     * Overrides to ownership logic should be done to {_ownerOf}.\n     */\n    function _requireOwned(uint256 tokenId) internal view returns (address) {\n        address owner = _ownerOf(tokenId);\n        if (owner == address(0)) {\n            revert ERC721NonexistentToken(tokenId);\n        }\n        return owner;\n    }\n}\n"},"@openzeppelin/contracts/token/ERC721/IERC721.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC-721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n    /**\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n     */\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n     */\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n    /**\n     * @dev Returns the number of tokens in ``owner``'s account.\n     */\n    function balanceOf(address owner) external view returns (uint256 balance);\n\n    /**\n     * @dev Returns the owner of the `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function ownerOf(uint256 tokenId) external view returns (address owner);\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n     *   a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n     * are aware of the ERC-721 protocol to prevent tokens from being forever locked.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or\n     *   {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n     *   a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Transfers `tokenId` token from `from` to `to`.\n     *\n     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC-721\n     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n     * understand this adds an external call which potentially creates a reentrancy vulnerability.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n     * The approval is cleared when the token is transferred.\n     *\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n     *\n     * Requirements:\n     *\n     * - The caller must own the token or be an approved operator.\n     * - `tokenId` must exist.\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address to, uint256 tokenId) external;\n\n    /**\n     * @dev Approve or remove `operator` as an operator for the caller.\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n     *\n     * Requirements:\n     *\n     * - The `operator` cannot be the address zero.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function setApprovalForAll(address operator, bool approved) external;\n\n    /**\n     * @dev Returns the account approved for `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function getApproved(uint256 tokenId) external view returns (address operator);\n\n    /**\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n     *\n     * See {setApprovalForAll}\n     */\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n"},"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @title ERC-721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC-721 asset contracts.\n */\ninterface IERC721Receiver {\n    /**\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n     * by `operator` from `from`, this function is called.\n     *\n     * It must return its Solidity selector to confirm the token transfer.\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be\n     * reverted.\n     *\n     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n     */\n    function onERC721Received(\n        address operator,\n        address from,\n        uint256 tokenId,\n        bytes calldata data\n    ) external returns (bytes4);\n}\n"},"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721} from \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n    /**\n     * @dev Returns the token collection name.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the token collection symbol.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n     */\n    function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n"},"@openzeppelin/contracts/token/ERC721/utils/ERC721Utils.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/utils/ERC721Utils.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721Receiver} from \"../IERC721Receiver.sol\";\nimport {IERC721Errors} from \"../../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Library that provide common ERC-721 utility functions.\n *\n * See https://eips.ethereum.org/EIPS/eip-721[ERC-721].\n *\n * _Available since v5.1._\n */\nlibrary ERC721Utils {\n    /**\n     * @dev Performs an acceptance check for the provided `operator` by calling {IERC721-onERC721Received}\n     * on the `to` address. The `operator` is generally the address that initiated the token transfer (i.e. `msg.sender`).\n     *\n     * The acceptance call is not executed and treated as a no-op if the target address doesn't contain code (i.e. an EOA).\n     * Otherwise, the recipient must implement {IERC721Receiver-onERC721Received} and return the acceptance magic value to accept\n     * the transfer.\n     */\n    function checkOnERC721Received(\n        address operator,\n        address from,\n        address to,\n        uint256 tokenId,\n        bytes memory data\n    ) internal {\n        if (to.code.length > 0) {\n            try IERC721Receiver(to).onERC721Received(operator, from, tokenId, data) returns (bytes4 retval) {\n                if (retval != IERC721Receiver.onERC721Received.selector) {\n                    // Token rejected\n                    revert IERC721Errors.ERC721InvalidReceiver(to);\n                }\n            } catch (bytes memory reason) {\n                if (reason.length == 0) {\n                    // non-IERC721Receiver implementer\n                    revert IERC721Errors.ERC721InvalidReceiver(to);\n                } else {\n                    assembly (\"memory-safe\") {\n                        revert(add(32, reason), mload(reason))\n                    }\n                }\n            }\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Base64.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Base64.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides a set of functions to operate with Base64 strings.\n */\nlibrary Base64 {\n    /**\n     * @dev Base64 Encoding/Decoding Table\n     * See sections 4 and 5 of https://datatracker.ietf.org/doc/html/rfc4648\n     */\n    string internal constant _TABLE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    string internal constant _TABLE_URL = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\n    /**\n     * @dev Converts a `bytes` to its Bytes64 `string` representation.\n     */\n    function encode(bytes memory data) internal pure returns (string memory) {\n        return _encode(data, _TABLE, true);\n    }\n\n    /**\n     * @dev Converts a `bytes` to its Bytes64Url `string` representation.\n     * Output is not padded with `=` as specified in https://www.rfc-editor.org/rfc/rfc4648[rfc4648].\n     */\n    function encodeURL(bytes memory data) internal pure returns (string memory) {\n        return _encode(data, _TABLE_URL, false);\n    }\n\n    /**\n     * @dev Internal table-agnostic conversion\n     */\n    function _encode(bytes memory data, string memory table, bool withPadding) private pure returns (string memory) {\n        /**\n         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\n         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\n         */\n        if (data.length == 0) return \"\";\n\n        // If padding is enabled, the final length should be `bytes` data length divided by 3 rounded up and then\n        // multiplied by 4 so that it leaves room for padding the last chunk\n        // - `data.length + 2`  -> Prepare for division rounding up\n        // - `/ 3`              -> Number of 3-bytes chunks (rounded up)\n        // - `4 *`              -> 4 characters for each chunk\n        // This is equivalent to: 4 * Math.ceil(data.length / 3)\n        //\n        // If padding is disabled, the final length should be `bytes` data length multiplied by 4/3 rounded up as\n        // opposed to when padding is required to fill the last chunk.\n        // - `4 * data.length`  -> 4 characters for each chunk\n        // - ` + 2`             -> Prepare for division rounding up\n        // - `/ 3`              -> Number of 3-bytes chunks (rounded up)\n        // This is equivalent to: Math.ceil((4 * data.length) / 3)\n        uint256 resultLength = withPadding ? 4 * ((data.length + 2) / 3) : (4 * data.length + 2) / 3;\n\n        string memory result = new string(resultLength);\n\n        assembly (\"memory-safe\") {\n            // Prepare the lookup table (skip the first \"length\" byte)\n            let tablePtr := add(table, 1)\n\n            // Prepare result pointer, jump over length\n            let resultPtr := add(result, 0x20)\n            let dataPtr := data\n            let endPtr := add(data, mload(data))\n\n            // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and\n            // set it to zero to make sure no dirty bytes are read in that section.\n            let afterPtr := add(endPtr, 0x20)\n            let afterCache := mload(afterPtr)\n            mstore(afterPtr, 0x00)\n\n            // Run over the input, 3 bytes at a time\n            for {\n\n            } lt(dataPtr, endPtr) {\n\n            } {\n                // Advance 3 bytes\n                dataPtr := add(dataPtr, 3)\n                let input := mload(dataPtr)\n\n                // To write each character, shift the 3 byte (24 bits) chunk\n                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\n                // and apply logical AND with 0x3F to bitmask the least significant 6 bits.\n                // Use this as an index into the lookup table, mload an entire word\n                // so the desired character is in the least significant byte, and\n                // mstore8 this least significant byte into the result and continue.\n\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n\n                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n            }\n\n            // Reset the value that was cached\n            mstore(afterPtr, afterCache)\n\n            if withPadding {\n                // When data `bytes` is not exactly 3 bytes long\n                // it is padded with `=` characters at the end\n                switch mod(mload(data), 3)\n                case 1 {\n                    mstore8(sub(resultPtr, 1), 0x3d)\n                    mstore8(sub(resultPtr, 2), 0x3d)\n                }\n                case 2 {\n                    mstore8(sub(resultPtr, 1), 0x3d)\n                }\n            }\n        }\n\n        return result;\n    }\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant NOT_ENTERED = 1;\n    uint256 private constant ENTERED = 2;\n\n    uint256 private _status;\n\n    /**\n     * @dev Unauthorized reentrant call.\n     */\n    error ReentrancyGuardReentrantCall();\n\n    constructor() {\n        _status = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        _nonReentrantBefore();\n        _;\n        _nonReentrantAfter();\n    }\n\n    function _nonReentrantBefore() private {\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\n        if (_status == ENTERED) {\n            revert ReentrancyGuardReentrantCall();\n        }\n\n        // Any calls to nonReentrant after this point will fail\n        _status = ENTERED;\n    }\n\n    function _nonReentrantAfter() private {\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _status = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n     * `nonReentrant` function in the call stack.\n     */\n    function _reentrancyGuardEntered() internal view returns (bool) {\n        return _status == ENTERED;\n    }\n}\n"},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == type(IERC165).interfaceId;\n    }\n}\n"},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"AgentForgeMiner.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\nimport \"@openzeppelin/contracts/utils/Base64.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\n\ninterface IRelicForge {\n    function forgeBurn(address from, uint256[5] calldata ids) external returns (uint8[5] memory);\n    function owner() external view returns (address);\n}\n\ninterface IMinerArt {\n    function minerSVG(uint256 id, uint256 tier, uint256 element, uint256 seed) external view returns (string memory);\n    function minerAttributes(uint256 tier, uint256 element, uint256 seed) external view returns (string memory);\n}\n\n/// @title AGENT FORGE - Forge & Miner\n/// @notice Burn exactly 5 revealed Relics you own to mint 1 Miner.\n/// Tier: all 5 the same element = Legendary (weight 3); all 4 elements present = Rare (weight 2);\n/// otherwise Common (weight 1).\n/// Miner holders share a reward pool funded by 50% of AgentForgeMarket fees, pro rata by weight, through a\n/// reward-per-weight accumulator. Rewards are claimable any time and settle on every Miner transfer.\n/// The pool only pays out what the market actually collects: no yield, return or value is promised.\n/// This contract has NO owner functions. Unofficial project, not affiliated with Binance or SPACE ID.\ncontract AgentForgeMiner is ERC721, ReentrancyGuard {\n    using Strings for uint256;\n\n    uint256 private constant PRECISION = 1e24;\n\n    IRelicForge public immutable RELIC;\n    IMinerArt public immutable ART;\n\n    struct Info { uint8 tier; uint8 element; uint32 seed; }\n\n    uint256 public totalSupply;\n    mapping(uint256 => Info) public info;\n    uint256[3] public tierCount;\n    mapping(uint256 => uint256) public transferNonce;\n\n    // ---- rewards ----\n    uint256 public accRewardPerWeight; // scaled by PRECISION\n    uint256 public totalWeight;\n    uint256 public unallocated;        // received while no Miner existed; added on the next deposit\n    uint256 public totalDeposited;\n    uint256 public totalClaimed;\n    mapping(address => uint256) public weightOf;\n    mapping(address => uint256) public rewardDebt;\n    mapping(address => uint256) public owed;\n\n    event Forged(address indexed owner, uint256 indexed minerId, uint8 tier, uint8 element, uint256[5] relicIds);\n    event RewardsDeposited(address indexed from, uint256 amount);\n    event Claimed(address indexed account, uint256 amount);\n\n    error NotRelic();\n    error NothingToClaim();\n    error PayFailed();\n\n    constructor(address art) ERC721(\"Agent Forge Miner\", \"MINER\") {\n        RELIC = IRelicForge(msg.sender);\n        ART = IMinerArt(art);\n    }\n\n    /// @notice For marketplaces' collection pages only: mirrors the Relic owner. Grants no powers here.\n    function owner() external view returns (address) {\n        return RELIC.owner();\n    }\n\n    // ---------------- forge ----------------\n\n    function forge(uint256[5] calldata relicIds) external nonReentrant returns (uint256 minerId) {\n        uint8[5] memory els = RELIC.forgeBurn(msg.sender, relicIds);\n        uint256[4] memory cnt;\n        for (uint256 i; i < 5; ++i) ++cnt[els[i]];\n        uint8 tier;\n        uint8 element;\n        uint256 kinds;\n        uint256 best;\n        for (uint256 e; e < 4; ++e) {\n            if (cnt[e] > 0) ++kinds;\n            if (cnt[e] > best) { best = cnt[e]; element = uint8(e); }\n        }\n        if (best == 5) tier = 2;        // Legendary: all 5 the same element (element = that element)\n        else if (kinds == 4) tier = 1;  // Rare: all 4 elements present (element = the doubled one)\n        // else Common (0); element = dominant element, ties -> lowest index\n        minerId = ++totalSupply;\n        info[minerId] = Info(tier, element, uint32(uint256(keccak256(abi.encode(block.prevrandao, relicIds, minerId)))));\n        ++tierCount[tier];\n        _mint(msg.sender, minerId);\n        emit Forged(msg.sender, minerId, tier, element, relicIds);\n    }\n\n    function weightOfToken(uint256 id) public view returns (uint256) {\n        return uint256(info[id].tier) + 1;\n    }\n\n    // ---------------- rewards ----------------\n\n    /// @notice Anyone (normally the Market) can add BNB to the pool.\n    function depositRewards() external payable {\n        totalDeposited += msg.value;\n        uint256 amt = msg.value;\n        if (totalWeight == 0) {\n            unallocated += amt;\n        } else {\n            amt += unallocated;\n            unallocated = 0;\n            accRewardPerWeight += (amt * PRECISION) / totalWeight;\n        }\n        emit RewardsDeposited(msg.sender, msg.value);\n    }\n\n    function pendingRewards(address account) public view returns (uint256) {\n        return owed[account] + (weightOf[account] * accRewardPerWeight) / PRECISION - rewardDebt[account];\n    }\n\n    function claim() external nonReentrant returns (uint256 amt) {\n        _settle(msg.sender);\n        amt = owed[msg.sender];\n        if (amt == 0) revert NothingToClaim();\n        owed[msg.sender] = 0;\n        totalClaimed += amt;\n        (bool ok, ) = payable(msg.sender).call{value: amt}(\"\");\n        if (!ok) revert PayFailed();\n        emit Claimed(msg.sender, amt);\n    }\n\n    function _settle(address a) internal {\n        uint256 w = weightOf[a];\n        uint256 acc = (w * accRewardPerWeight) / PRECISION;\n        owed[a] += acc - rewardDebt[a];\n        rewardDebt[a] = acc;\n    }\n\n    function _update(address to, uint256 id, address auth) internal override returns (address from) {\n        from = super._update(to, id, auth);\n        uint256 w = weightOfToken(id);\n        if (from != address(0)) {\n            _settle(from);\n            weightOf[from] -= w;\n            rewardDebt[from] = (weightOf[from] * accRewardPerWeight) / PRECISION;\n            totalWeight -= w;\n        }\n        if (to != address(0)) {\n            _settle(to);\n            weightOf[to] += w;\n            rewardDebt[to] = (weightOf[to] * accRewardPerWeight) / PRECISION;\n            totalWeight += w;\n        }\n        if (from != address(0) && to != address(0)) ++transferNonce[id];\n    }\n\n    // ---------------- metadata ----------------\n\n    function tokenURI(uint256 id) public view override returns (string memory) {\n        _requireOwned(id);\n        Info memory m = info[id];\n        string memory tierName = m.tier == 0 ? \"Common\" : m.tier == 1 ? \"Rare\" : \"Legendary\";\n        return string.concat(\n            \"data:application/json;base64,\",\n            Base64.encode(bytes(string.concat(\n                '{\"name\":\"', tierName, \" Miner #\", id.toString(),\n                '\",\"description\":\"Agent Forge Miner, forged on-chain from 5 Relics on BNB Chain. Weight Common 1, Rare 2, Legendary 3 in the market fee reward pool. Unofficial, collectible only, no yield promised.\",\"image\":\"data:image/svg+xml;utf8,',\n                ART.minerSVG(id, m.tier, m.element, m.seed),\n                '\",\"attributes\":[', ART.minerAttributes(m.tier, m.element, m.seed), \"]}\"\n            )))\n        );\n    }\n}\n"},"AgentForgeRelic.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts/utils/Base64.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\nimport \"./AgentForgeMiner.sol\";\n\ninterface IAgentID {\n    function balanceOf(address owner) external view returns (uint256);\n}\n\ninterface IRelicArt {\n    function sealedSVG(uint256 id) external pure returns (string memory);\n    function relicSVG(uint256 id, uint256 element, uint256 design) external pure returns (string memory);\n    function relicAttributes(uint256 element, uint256 design) external pure returns (string memory);\n}\n\n/// @title AGENT FORGE - Relic\n/// @notice 5,000 pixel relics on BNB Chain. Mint is open only to wallets holding a .ai Agent ID.\n/// The first 2 per wallet are free, then 0.0005 BNB each, max 10 per wallet.\n/// Each Relic carries one of four elements (Fire, Water, Earth, Lightning; exactly 1,250 each),\n/// assigned by a one-time random offset at reveal over a pre-committed sequence (see PROVENANCE).\n/// Burn 5 Relics in the Forge (AgentForgeMiner) to mint 1 Miner.\n/// Art is fully on-chain SVG. Unofficial project, not affiliated with Binance or SPACE ID.\n/// Collectible only: no yield, return or value is promised.\ncontract AgentForgeRelic is ERC721, Ownable {\n    using Strings for uint256;\n\n    // ---------------- fixed rules (cannot be changed by anyone) ----------------\n    uint256 public constant MAX_SUPPLY = 5000;\n    uint256 public constant REVEAL_THRESHOLD = 4500; // 90%\n    uint256 public constant FREE_PER_WALLET = 2;\n    uint256 public constant MAX_PER_WALLET = 10;\n    uint256 public constant PRICE = 0.0005 ether;\n    uint256 public constant PER_ELEMENT = 1250;\n    uint256 public constant DESIGNS = 1728;\n    /// @notice If the owner has not revealed 14 days after the 90% threshold was reached\n    /// (or as soon as the collection is sold out), anyone may call reveal().\n    uint256 public constant PUBLIC_REVEAL_DELAY = 14 days;\n    IAgentID public constant AGENT_ID = IAgentID(0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F);\n    bytes32 private constant SEQ_KEY = keccak256(\"AGENT FORGE RELIC SEQUENCE\");\n\n    /// @notice keccak256 of the 15,000-byte table [element(1) | design(2, big-endian)] for slots 0..4999,\n    /// i.e. exactly what slotData() returns. Committed at deploy, before any mint.\n    bytes32 public immutable PROVENANCE;\n    /// @notice Mint proceeds can only ever go here.\n    address payable public immutable PROCEEDS;\n    /// @notice The Forge / Miner collection, deployed by this contract's constructor.\n    AgentForgeMiner public immutable MINER;\n\n    IRelicArt public art;\n    uint256 public totalMinted;\n    uint256 public totalBurned;\n    bool public mintOpen;\n    bool public revealed;\n    uint256 public revealOffset;\n    uint256 public thresholdReachedAt;\n\n    mapping(address => uint256) public mintedBy;\n    /// @notice Increments on every wallet-to-wallet transfer; the Market uses it to expire stale listings.\n    mapping(uint256 => uint256) public transferNonce;\n\n    event MintOpened();\n    event Revealed(uint256 offset, address by);\n    event ArtUpdated(address art);\n    event Withdrawn(uint256 amount);\n\n    error MintClosed();\n    error NotAgent();\n    error ZeroQty();\n    error SoldOut();\n    error WalletLimit();\n    error WrongPayment();\n    error NotRevealed();\n    error AlreadyRevealed();\n    error RevealTooEarly();\n    error MetadataLocked();\n    error OnlyMiner();\n    error NotTokenOwner();\n    error NoToken();\n\n    constructor(address relicArt, address minerArt, address payable proceeds, bytes32 provenance)\n        ERC721(\"Agent Forge Relic\", \"RELIC\")\n        Ownable(proceeds)\n    {\n        art = IRelicArt(relicArt);\n        PROCEEDS = proceeds;\n        PROVENANCE = provenance;\n        MINER = new AgentForgeMiner(minerArt);\n    }\n\n    // ---------------- mint ----------------\n\n    /// @notice BNB due for `wallet` to mint `qty` more Relics now.\n    function quote(address wallet, uint256 qty) public view returns (uint256) {\n        uint256 prev = mintedBy[wallet];\n        uint256 free = prev >= FREE_PER_WALLET ? 0 : FREE_PER_WALLET - prev;\n        return qty > free ? (qty - free) * PRICE : 0;\n    }\n\n    function mint(uint256 qty) external payable {\n        if (!mintOpen) revert MintClosed();\n        if (AGENT_ID.balanceOf(msg.sender) == 0) revert NotAgent();\n        if (qty == 0) revert ZeroQty();\n        uint256 start = totalMinted;\n        if (start + qty > MAX_SUPPLY) revert SoldOut();\n        if (mintedBy[msg.sender] + qty > MAX_PER_WALLET) revert WalletLimit();\n        if (msg.value != quote(msg.sender, qty)) revert WrongPayment();\n        mintedBy[msg.sender] += qty;\n        totalMinted = start + qty;\n        if (thresholdReachedAt == 0 && start + qty >= REVEAL_THRESHOLD) thresholdReachedAt = block.timestamp;\n        for (uint256 i = 1; i <= qty; ++i) _mint(msg.sender, start + i);\n    }\n\n    function totalSupply() external view returns (uint256) {\n        return totalMinted - totalBurned;\n    }\n\n    // ---------------- reveal & elements ----------------\n\n    /// @notice One-time reveal. Owner may call once >= 4,500 are minted. Anyone may call once the\n    /// collection is sold out, or 14 days after the 4,500 threshold was reached.\n    function reveal() external {\n        if (revealed) revert AlreadyRevealed();\n        if (totalMinted < REVEAL_THRESHOLD) revert RevealTooEarly();\n        if (msg.sender != owner() && totalMinted < MAX_SUPPLY\n            && block.timestamp < thresholdReachedAt + PUBLIC_REVEAL_DELAY) revert RevealTooEarly();\n        revealOffset = uint256(keccak256(abi.encode(block.prevrandao, blockhash(block.number - 1), totalMinted, address(this)))) % MAX_SUPPLY;\n        revealed = true;\n        emit Revealed(revealOffset, msg.sender);\n    }\n\n    /// @notice Metadata is permanently locked once revealed (no setter can run afterwards).\n    function metadataLocked() external view returns (bool) {\n        return revealed;\n    }\n\n    /// @notice Pre-committed sequence entry for slot 0..4999: element 0..3 (Fire, Water, Earth, Lightning)\n    /// and design 0..1727. Exactly 1,250 slots per element.\n    function slotData(uint256 slot) public pure returns (uint8 element, uint16 design) {\n        require(slot < MAX_SUPPLY, \"slot\");\n        element = uint8(_perm(slot) / PER_ELEMENT);\n        design = uint16(uint256(keccak256(abi.encode(SEQ_KEY, slot))) % DESIGNS);\n    }\n\n    function slotOf(uint256 id) public view returns (uint256) {\n        if (!revealed) revert NotRevealed();\n        if (id == 0 || id > totalMinted) revert NoToken();\n        return (id - 1 + revealOffset) % MAX_SUPPLY;\n    }\n\n    function elementOf(uint256 id) public view returns (uint8 element) {\n        (element, ) = slotData(slotOf(id));\n    }\n\n    /// @dev 4-round Feistel network over 14 bits with cycle-walking onto [0, 5000): a fixed bijection.\n    function _perm(uint256 x) internal pure returns (uint256) {\n        do {\n            uint256 l = x >> 7;\n            uint256 r = x & 127;\n            for (uint256 i; i < 4; ++i) {\n                uint256 f = uint256(keccak256(abi.encode(SEQ_KEY, i, r))) & 127;\n                (l, r) = (r, l ^ f);\n            }\n            x = (l << 7) | r;\n        } while (x >= MAX_SUPPLY);\n        return x;\n    }\n\n    // ---------------- forge hook ----------------\n\n    /// @notice Called only by the Forge (MINER). Burns 5 Relics owned by `from` and returns their elements.\n    function forgeBurn(address from, uint256[5] calldata ids) external returns (uint8[5] memory elements) {\n        if (msg.sender != address(MINER)) revert OnlyMiner();\n        if (!revealed) revert NotRevealed();\n        for (uint256 i; i < 5; ++i) {\n            if (_ownerOf(ids[i]) != from) revert NotTokenOwner(); // also rejects duplicates (burned on 1st use)\n            elements[i] = elementOf(ids[i]);\n            _burn(ids[i]);\n        }\n        totalBurned += 5;\n    }\n\n    function _update(address to, uint256 id, address auth) internal override returns (address from) {\n        from = super._update(to, id, auth);\n        if (from != address(0) && to != address(0)) ++transferNonce[id];\n    }\n\n    // ---------------- metadata ----------------\n\n    function tokenURI(uint256 id) public view override returns (string memory) {\n        _requireOwned(id);\n        string memory name;\n        string memory img;\n        string memory attrs;\n        if (!revealed) {\n            name = string.concat(\"Sealed Relic #\", id.toString());\n            img = art.sealedSVG(id);\n            attrs = '{\"trait_type\":\"Status\",\"value\":\"Sealed\"}';\n        } else {\n            (uint8 el, uint16 d) = slotData(slotOf(id));\n            name = string.concat(_elementName(el), \" Relic #\", id.toString());\n            img = art.relicSVG(id, el, d);\n            attrs = art.relicAttributes(el, d);\n        }\n        return string.concat(\n            \"data:application/json;base64,\",\n            Base64.encode(bytes(string.concat(\n                '{\"name\":\"', name,\n                '\",\"description\":\"Agent Forge: 5,000 on-chain pixel relics for .ai Agent ID holders on BNB Chain. Forge 5 Relics into 1 Miner. Unofficial, collectible only, no yield promised.\",\"image\":\"data:image/svg+xml;utf8,',\n                img, '\",\"attributes\":[', attrs, \"]}\"\n            )))\n        );\n    }\n\n    function contractURI() external view returns (string memory) {\n        return string.concat(\n            \"data:application/json;utf8,\",\n            '{\"name\":\"Agent Forge Relic\",\"description\":\"5,000 on-chain pixel relics in four elements for .ai Agent ID holders on BNB Chain. Burn 5 in the Forge to mint a Miner. Unofficial, collectible only.\",\"image\":\"data:image/svg+xml;utf8,',\n            art.sealedSVG(0), '\"}'\n        );\n    }\n\n    function _elementName(uint256 e) internal pure returns (string memory) {\n        if (e == 0) return \"Fire\";\n        if (e == 1) return \"Water\";\n        if (e == 2) return \"Earth\";\n        return \"Lightning\";\n    }\n\n    // ---------------- owner (minimal) ----------------\n\n    /// @notice One-way switch: opens the mint. There is no way to pause or close it again.\n    function openMint() external onlyOwner {\n        mintOpen = true;\n        emit MintOpened();\n    }\n\n    /// @notice Replace the relic renderer. Only possible BEFORE reveal; after reveal metadata is locked forever.\n    function setArt(address newArt) external onlyOwner {\n        if (revealed) revert MetadataLocked();\n        art = IRelicArt(newArt);\n        emit ArtUpdated(newArt);\n    }\n\n    // ---------------- proceeds ----------------\n\n    /// @notice Anyone may trigger; funds can only go to the immutable PROCEEDS wallet.\n    function withdraw() external {\n        uint256 bal = address(this).balance;\n        (bool ok, ) = PROCEEDS.call{value: bal}(\"\");\n        require(ok, \"withdraw failed\");\n        emit Withdrawn(bal);\n    }\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.26+commit.8a97fa7a","compilerSettings":{"optimizer":{"runs":200,"enabled":true},"evmVersion":"shanghai"},"name":"AgentForgeRelic","fullyQualifiedName":"AgentForgeRelic.sol:AgentForgeRelic"},"abi":[{"type":"constructor","inputs":[{"name":"relicArt","type":"address","internalType":"address"},{"name":"minerArt","type":"address","internalType":"address"},{"name":"proceeds","type":"address","internalType":"address payable"},{"name":"provenance","type":"bytes32","internalType":"bytes32"}],"stateMutability":"nonpayable"},{"name":"AlreadyRevealed","type":"error","inputs":[]},{"name":"ERC721IncorrectOwner","type":"error","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"owner","type":"address","internalType":"address"}]},{"name":"ERC721InsufficientApproval","type":"error","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"name":"ERC721InvalidApprover","type":"error","inputs":[{"name":"approver","type":"address","internalType":"address"}]},{"name":"ERC721InvalidOperator","type":"error","inputs":[{"name":"operator","type":"address","internalType":"address"}]},{"name":"ERC721InvalidOwner","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"name":"ERC721InvalidReceiver","type":"error","inputs":[{"name":"receiver","type":"address","internalType":"address"}]},{"name":"ERC721InvalidSender","type":"error","inputs":[{"name":"sender","type":"address","internalType":"address"}]},{"name":"ERC721NonexistentToken","type":"error","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"name":"MetadataLocked","type":"error","inputs":[]},{"name":"MintClosed","type":"error","inputs":[]},{"name":"NoToken","type":"error","inputs":[]},{"name":"NotAgent","type":"error","inputs":[]},{"name":"NotRevealed","type":"error","inputs":[]},{"name":"NotTokenOwner","type":"error","inputs":[]},{"name":"OnlyMiner","type":"error","inputs":[]},{"name":"OwnableInvalidOwner","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"name":"OwnableUnauthorizedAccount","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"name":"RevealTooEarly","type":"error","inputs":[]},{"name":"SoldOut","type":"error","inputs":[]},{"name":"WalletLimit","type":"error","inputs":[]},{"name":"WrongPayment","type":"error","inputs":[]},{"name":"ZeroQty","type":"error","inputs":[]},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"ApprovalForAll","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"ArtUpdated","type":"event","inputs":[{"name":"art","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"MintOpened","type":"event","inputs":[],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Revealed","type":"event","inputs":[{"name":"offset","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"by","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"Withdrawn","type":"event","inputs":[{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"AGENT_ID","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAgentID"}],"stateMutability":"view"},{"name":"DESIGNS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"FREE_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_SUPPLY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MINER","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract AgentForgeMiner"}],"stateMutability":"view"},{"name":"PER_ELEMENT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PROCEEDS","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address payable"}],"stateMutability":"view"},{"name":"PROVENANCE","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"PUBLIC_REVEAL_DELAY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"REVEAL_THRESHOLD","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"art","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IRelicArt"}],"stateMutability":"view"},{"name":"balanceOf","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"contractURI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"elementOf","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"element","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"forgeBurn","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"ids","type":"uint256[5]","internalType":"uint256[5]"}],"outputs":[{"name":"elements","type":"uint8[5]","internalType":"uint8[5]"}],"stateMutability":"nonpayable"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"metadataLocked","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"mintOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mintedBy","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"openMint","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"ownerOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"quote","type":"function","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"renounceOwnership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"reveal","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"revealOffset","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"revealed","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"safeTransferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"safeTransferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setApprovalForAll","type":"function","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setArt","type":"function","inputs":[{"name":"newArt","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"slotData","type":"function","inputs":[{"name":"slot","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"element","type":"uint8","internalType":"uint8"},{"name":"design","type":"uint16","internalType":"uint16"}],"stateMutability":"pure"},{"name":"slotOf","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"thresholdReachedAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"tokenURI","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalBurned","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transferNonce","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdraw","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"metadata":{"compiler":{"version":"0.8.26+commit.8a97fa7a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"relicArt","type":"address"},{"internalType":"address","name":"minerArt","type":"address"},{"internalType":"address payable","name":"proceeds","type":"address"},{"internalType":"bytes32","name":"provenance","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyRevealed","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721IncorrectOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721InsufficientApproval","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC721InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"ERC721InvalidOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ERC721InvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC721InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC721InvalidSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721NonexistentToken","type":"error"},{"inputs":[],"name":"MetadataLocked","type":"error"},{"inputs":[],"name":"MintClosed","type":"error"},{"inputs":[],"name":"NoToken","type":"error"},{"inputs":[],"name":"NotAgent","type":"error"},{"inputs":[],"name":"NotRevealed","type":"error"},{"inputs":[],"name":"NotTokenOwner","type":"error"},{"inputs":[],"name":"OnlyMiner","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"RevealTooEarly","type":"error"},{"inputs":[],"name":"SoldOut","type":"error"},{"inputs":[],"name":"WalletLimit","type":"error"},{"inputs":[],"name":"WrongPayment","type":"error"},{"inputs":[],"name":"ZeroQty","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":"address","name":"art","type":"address"}],"name":"ArtUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"MintOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offset","type":"uint256"},{"indexed":false,"internalType":"address","name":"by","type":"address"}],"name":"Revealed","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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"AGENT_ID","outputs":[{"internalType":"contract IAgentID","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DESIGNS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINER","outputs":[{"internalType":"contract AgentForgeMiner","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PER_ELEMENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROCEEDS","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_REVEAL_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_THRESHOLD","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":[],"name":"art","outputs":[{"internalType":"contract IRelicArt","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"elementOf","outputs":[{"internalType":"uint8","name":"element","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[5]","name":"ids","type":"uint256[5]"}],"name":"forgeBurn","outputs":[{"internalType":"uint8[5]","name":"elements","type":"uint8[5]"}],"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":"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":"metadataLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"newArt","type":"address"}],"name":"setArt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"}],"name":"slotData","outputs":[{"internalType":"uint8","name":"element","type":"uint8"},{"internalType":"uint16","name":"design","type":"uint16"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"slotOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"thresholdReachedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"","type":"uint256"}],"name":"transferNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"errors":{"ERC721IncorrectOwner(address,uint256,address)":[{"details":"Indicates an error related to the ownership over a particular token. Used in transfers.","params":{"owner":"Address of the current owner of a token.","sender":"Address whose tokens are being transferred.","tokenId":"Identifier number of a token."}}],"ERC721InsufficientApproval(address,uint256)":[{"details":"Indicates a failure with the `operator`’s approval. Used in transfers.","params":{"operator":"Address that may be allowed to operate on tokens without being their owner.","tokenId":"Identifier number of a token."}}],"ERC721InvalidApprover(address)":[{"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals.","params":{"approver":"Address initiating an approval operation."}}],"ERC721InvalidOperator(address)":[{"details":"Indicates a failure with the `operator` to be approved. Used in approvals.","params":{"operator":"Address that may be allowed to operate on tokens without being their owner."}}],"ERC721InvalidOwner(address)":[{"details":"Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20. Used in balance queries.","params":{"owner":"Address of the current owner of a token."}}],"ERC721InvalidReceiver(address)":[{"details":"Indicates a failure with the token `receiver`. Used in transfers.","params":{"receiver":"Address to which tokens are being transferred."}}],"ERC721InvalidSender(address)":[{"details":"Indicates a failure with the token `sender`. Used in transfers.","params":{"sender":"Address whose tokens are being transferred."}}],"ERC721NonexistentToken(uint256)":[{"details":"Indicates a `tokenId` whose `owner` is the zero address.","params":{"tokenId":"Identifier number of a token."}}],"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when `owner` enables `approved` to manage the `tokenId` token."},"ApprovalForAll(address,address,bool)":{"details":"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets."},"Transfer(address,address,uint256)":{"details":"Emitted when `tokenId` token is transferred from `from` to `to`."}},"kind":"dev","methods":{"approve(address,uint256)":{"details":"See {IERC721-approve}."},"balanceOf(address)":{"details":"See {IERC721-balanceOf}."},"getApproved(uint256)":{"details":"See {IERC721-getApproved}."},"isApprovedForAll(address,address)":{"details":"See {IERC721-isApprovedForAll}."},"name()":{"details":"See {IERC721Metadata-name}."},"owner()":{"details":"Returns the address of the current owner."},"ownerOf(uint256)":{"details":"See {IERC721-ownerOf}."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"safeTransferFrom(address,address,uint256)":{"details":"See {IERC721-safeTransferFrom}."},"safeTransferFrom(address,address,uint256,bytes)":{"details":"See {IERC721-safeTransferFrom}."},"setApprovalForAll(address,bool)":{"details":"See {IERC721-setApprovalForAll}."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"symbol()":{"details":"See {IERC721Metadata-symbol}."},"transferFrom(address,address,uint256)":{"details":"See {IERC721-transferFrom}."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"title":"AGENT FORGE - Relic","version":1},"userdoc":{"kind":"user","methods":{"MINER()":{"notice":"The Forge / Miner collection, deployed by this contract's constructor."},"PROCEEDS()":{"notice":"Mint proceeds can only ever go here."},"PROVENANCE()":{"notice":"keccak256 of the 15,000-byte table [element(1) | design(2, big-endian)] for slots 0..4999, i.e. exactly what slotData() returns. Committed at deploy, before any mint."},"PUBLIC_REVEAL_DELAY()":{"notice":"If the owner has not revealed 14 days after the 90% threshold was reached (or as soon as the collection is sold out), anyone may call reveal()."},"forgeBurn(address,uint256[5])":{"notice":"Called only by the Forge (MINER). Burns 5 Relics owned by `from` and returns their elements."},"metadataLocked()":{"notice":"Metadata is permanently locked once revealed (no setter can run afterwards)."},"openMint()":{"notice":"One-way switch: opens the mint. There is no way to pause or close it again."},"quote(address,uint256)":{"notice":"BNB due for `wallet` to mint `qty` more Relics now."},"reveal()":{"notice":"One-time reveal. Owner may call once >= 4,500 are minted. Anyone may call once the collection is sold out, or 14 days after the 4,500 threshold was reached."},"setArt(address)":{"notice":"Replace the relic renderer. Only possible BEFORE reveal; after reveal metadata is locked forever."},"slotData(uint256)":{"notice":"Pre-committed sequence entry for slot 0..4999: element 0..3 (Fire, Water, Earth, Lightning) and design 0..1727. Exactly 1,250 slots per element."},"transferNonce(uint256)":{"notice":"Increments on every wallet-to-wallet transfer; the Market uses it to expire stale listings."},"withdraw()":{"notice":"Anyone may trigger; funds can only go to the immutable PROCEEDS wallet."}},"notice":"5,000 pixel relics on BNB Chain. Mint is open only to wallets holding a .ai Agent ID. The first 2 per wallet are free, then 0.0005 BNB each, max 10 per wallet. Each Relic carries one of four elements (Fire, Water, Earth, Lightning; exactly 1,250 each), assigned by a one-time random offset at reveal over a pre-committed sequence (see PROVENANCE). Burn 5 Relics in the Forge (AgentForgeMiner) to mint 1 Miner. Art is fully on-chain SVG. Unofficial project, not affiliated with Binance or SPACE ID. Collectible only: no yield, return or value is promised.","version":1}},"settings":{"compilationTarget":{"AgentForgeRelic.sol":"AgentForgeRelic"},"evmVersion":"shanghai","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"@openzeppelin/contracts/access/Ownable.sol":{"keccak256":"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb","license":"MIT","urls":["bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6","dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a"]},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"keccak256":"0x880da465c203cec76b10d72dbd87c80f387df4102274f23eea1f9c9b0918792b","license":"MIT","urls":["bzz-raw://399594cd8bb0143bc9e55e0f1d071d0d8c850a394fb7a319d50edd55d9ed822b","dweb:/ipfs/QmbPZzgtT6LEm9CMqWfagQFwETbV1ztpECBB1DtQHrKiRz"]},"@openzeppelin/contracts/token/ERC721/ERC721.sol":{"keccak256":"0x39ed367e54765186281efcfe83e47cf0ad62cc879f10e191360712507125f29a","license":"MIT","urls":["bzz-raw://2c5ae6d85bd48cca8d6d2fcec8c63efd86f56f8a5832577a47e403ce0e65cb09","dweb:/ipfs/QmUtcS8AbRSWhuc61puYet58os8FvSqm329ChoW8wwZXZk"]},"@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0x5dc63d1c6a12fe1b17793e1745877b2fcbe1964c3edfd0a482fac21ca8f18261","license":"MIT","urls":["bzz-raw://6b7f97c5960a50fd1822cb298551ffc908e37b7893a68d6d08bce18a11cb0f11","dweb:/ipfs/QmQQvxBytoY1eBt3pRQDmvH2hZ2yjhs12YqVfzGm7KSURq"]},"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"keccak256":"0xb5afb8e8eebc4d1c6404df2f5e1e6d2c3d24fd01e5dfc855314951ecfaae462d","license":"MIT","urls":["bzz-raw://78586466c424f076c6a2a551d848cfbe3f7c49e723830807598484a1047b3b34","dweb:/ipfs/Qmb717ovcFxm7qgNKEShiV6M9SPR3v1qnNpAGH84D6w29p"]},"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol":{"keccak256":"0x37d1aaaa5a2908a09e9dcf56a26ddf762ecf295afb5964695937344fc6802ce1","license":"MIT","urls":["bzz-raw://ed0bfc1b92153c5000e50f4021367b931bbe96372ac6facec3c4961b72053d02","dweb:/ipfs/Qmbwp8VDerjS5SV1quwHH1oMXxPQ93fzfLVqJ2RCqbowGE"]},"@openzeppelin/contracts/token/ERC721/utils/ERC721Utils.sol":{"keccak256":"0x40399695922383778f9f540a620bec475a2f8e0f08d41f0005682842e28a9855","license":"MIT","urls":["bzz-raw://746d295e403931aeb9d6065fd5a0871f43ab5459814a60623611e4b6641a09fd","dweb:/ipfs/QmWrgT8YJrQ9FfD1o3YYArwo57e7MGdpFKuM74qJ4qE34E"]},"@openzeppelin/contracts/utils/Base64.sol":{"keccak256":"0xbee2b819e1b4bf569ffc1b1b9d560b4abd6a589575f3093edaab9244de18a0c2","license":"MIT","urls":["bzz-raw://e478c0e9bbf3eb8cd3b7784f9b397603e34747f9ffd16571ed1d89ce102de389","dweb:/ipfs/QmZ6zXpwy5xRxx9RkodJmDZSUTeEqPQUanAC5TUoYqW2VR"]},"@openzeppelin/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","license":"MIT","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"]},"@openzeppelin/contracts/utils/Panic.sol":{"keccak256":"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a","license":"MIT","urls":["bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a","dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG"]},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3","license":"MIT","urls":["bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a","dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA"]},"@openzeppelin/contracts/utils/Strings.sol":{"keccak256":"0x725209b582291bb83058e3078624b53d15a133f7401c30295e7f3704181d2aed","license":"MIT","urls":["bzz-raw://0564ddb19c6d870e27b789d8f985283d815267ad7224883c2d5243c8bacc7dc0","dweb:/ipfs/QmeC953H4sj88ZRFdJNFdmpf7J9SksP1wK4jyMHLo66z49"]},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"keccak256":"0xddce8e17e3d3f9ed818b4f4c4478a8262aab8b11ed322f1bf5ed705bb4bd97fa","license":"MIT","urls":["bzz-raw://8084aa71a4cc7d2980972412a88fe4f114869faea3fefa5436431644eb5c0287","dweb:/ipfs/Qmbqfs5dRdPvHVKY8kTaeyc65NdqXRQwRK7h9s5UJEhD1p"]},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8","license":"MIT","urls":["bzz-raw://f6fda447a62815e8064f47eff0dd1cf58d9207ad69b5d32280f8d7ed1d1e4621","dweb:/ipfs/QmfDRc7pxfaXB2Dh9np5Uf29Na3pQ7tafRS684wd3GLjVL"]},"@openzeppelin/contracts/utils/math/Math.sol":{"keccak256":"0xa00be322d7db5786750ce0ac7e2f5b633ac30a5ed5fa1ced1e74acfc19acecea","license":"MIT","urls":["bzz-raw://6c84e822f87cbdc4082533b626667b6928715bb2b1e8e7eb96954cebb9e38c8d","dweb:/ipfs/QmZmy9dgxLTerBAQDuuHqbL6EpgRxddqgv5KmwpXYVbKz1"]},"@openzeppelin/contracts/utils/math/SafeCast.sol":{"keccak256":"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54","license":"MIT","urls":["bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8","dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy"]},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"keccak256":"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3","license":"MIT","urls":["bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03","dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ"]},"AgentForgeMiner.sol":{"keccak256":"0x0ef37f385c765f6ffd9f193ec3035e5dc174f920e89c108f4eab6bd7775c4328","license":"MIT","urls":["bzz-raw://5810dff0a220b254d861abd79e291c8c56160a2fff952fbc5fb01b9cf600bfa2","dweb:/ipfs/QmVGSo5Q8aUm46CxdcDu9KdJ2SQLuJXykhr258Zj3MdAGs"]},"AgentForgeRelic.sol":{"keccak256":"0xac40c2f43db388cca43dc98d0278dad58e9eb43b3b505d0fd8b94c028150750a","license":"MIT","urls":["bzz-raw://58bddd5d2bbd35f31d3dd53968343dbcea0172241e2d9f67133f90bb43394f6c","dweb:/ipfs/QmVA2rPuMaNi5b9ybKz48FwXUGULAxrbHH2MZszKdUdQhG"]}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_string_storage":{"label":"string","encoding":"bytes","numberOfBytes":"32"},"t_contract(IRelicArt)8909":{"label":"contract IRelicArt","encoding":"inplace","numberOfBytes":"20"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_address)":{"key":"t_uint256","label":"mapping(uint256 => address)","value":"t_address","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_uint256)":{"key":"t_uint256","label":"mapping(uint256 => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_bool))":{"key":"t_address","label":"mapping(address => mapping(address => bool))","value":"t_mapping(t_address,t_bool)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_string_storage","astId":317,"label":"_name","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"1","type":"t_string_storage","astId":319,"label":"_symbol","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"2","type":"t_mapping(t_uint256,t_address)","astId":323,"label":"_owners","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"3","type":"t_mapping(t_address,t_uint256)","astId":327,"label":"_balances","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"4","type":"t_mapping(t_uint256,t_address)","astId":331,"label":"_tokenApprovals","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"5","type":"t_mapping(t_address,t_mapping(t_address,t_bool))","astId":337,"label":"_operatorApprovals","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"6","type":"t_address","astId":8,"label":"_owner","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"7","type":"t_contract(IRelicArt)8909","astId":8966,"label":"art","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"8","type":"t_uint256","astId":8968,"label":"totalMinted","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"9","type":"t_uint256","astId":8970,"label":"totalBurned","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"10","type":"t_bool","astId":8972,"label":"mintOpen","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"10","type":"t_bool","astId":8974,"label":"revealed","offset":1,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"11","type":"t_uint256","astId":8976,"label":"revealOffset","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"12","type":"t_uint256","astId":8978,"label":"thresholdReachedAt","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"13","type":"t_mapping(t_address,t_uint256)","astId":8982,"label":"mintedBy","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"14","type":"t_mapping(t_uint256,t_uint256)","astId":8987,"label":"transferNonce","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"}]},"transientStorageLayout":null,"userdoc":{"kind":"user","notice":"5,000 pixel relics on BNB Chain. Mint is open only to wallets holding a .ai Agent ID. The first 2 per wallet are free, then 0.0005 BNB each, max 10 per wallet. Each Relic carries one of four elements (Fire, Water, Earth, Lightning; exactly 1,250 each), assigned by a one-time random offset at reveal over a pre-committed sequence (see PROVENANCE). Burn 5 Relics in the Forge (AgentForgeMiner) to mint 1 Miner. Art is fully on-chain SVG. Unofficial project, not affiliated with Binance or SPACE ID. Collectible only: no yield, return or value is promised.","methods":{"MINER()":{"notice":"The Forge / Miner collection, deployed by this contract's constructor."},"reveal()":{"notice":"One-time reveal. Owner may call once >= 4,500 are minted. Anyone may call once the collection is sold out, or 14 days after the 4,500 threshold was reached."},"PROCEEDS()":{"notice":"Mint proceeds can only ever go here."},"openMint()":{"notice":"One-way switch: opens the mint. There is no way to pause or close it again."},"withdraw()":{"notice":"Anyone may trigger; funds can only go to the immutable PROCEEDS wallet."},"PROVENANCE()":{"notice":"keccak256 of the 15,000-byte table [element(1) | design(2, big-endian)] for slots 0..4999, i.e. exactly what slotData() returns. Committed at deploy, before any mint."},"setArt(address)":{"notice":"Replace the relic renderer. Only possible BEFORE reveal; after reveal metadata is locked forever."},"metadataLocked()":{"notice":"Metadata is permanently locked once revealed (no setter can run afterwards)."},"slotData(uint256)":{"notice":"Pre-committed sequence entry for slot 0..4999: element 0..3 (Fire, Water, Earth, Lightning) and design 0..1727. Exactly 1,250 slots per element."},"PUBLIC_REVEAL_DELAY()":{"notice":"If the owner has not revealed 14 days after the 90% threshold was reached (or as soon as the collection is sold out), anyone may call reveal()."},"quote(address,uint256)":{"notice":"BNB due for `wallet` to mint `qty` more Relics now."},"transferNonce(uint256)":{"notice":"Increments on every wallet-to-wallet transfer; the Market uses it to expire stale listings."},"forgeBurn(address,uint256[5])":{"notice":"Called only by the Forge (MINER). Burns 5 Relics owned by `from` and returns their elements."}},"version":1},"devdoc":{"kind":"dev","title":"AGENT FORGE - Relic","errors":{"ERC721InvalidOwner(address)":[{"params":{"owner":"Address of the current owner of a token."},"details":"Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20. Used in balance queries."}],"ERC721InvalidSender(address)":[{"params":{"sender":"Address whose tokens are being transferred."},"details":"Indicates a failure with the token `sender`. Used in transfers."}],"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"ERC721InvalidApprover(address)":[{"params":{"approver":"Address initiating an approval operation."},"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals."}],"ERC721InvalidOperator(address)":[{"params":{"operator":"Address that may be allowed to operate on tokens without being their owner."},"details":"Indicates a failure with the `operator` to be approved. Used in approvals."}],"ERC721InvalidReceiver(address)":[{"params":{"receiver":"Address to which tokens are being transferred."},"details":"Indicates a failure with the token `receiver`. Used in transfers."}],"ERC721NonexistentToken(uint256)":[{"params":{"tokenId":"Identifier number of a token."},"details":"Indicates a `tokenId` whose `owner` is the zero address."}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}],"ERC721InsufficientApproval(address,uint256)":[{"params":{"tokenId":"Identifier number of a token.","operator":"Address that may be allowed to operate on tokens without being their owner."},"details":"Indicates a failure with the `operator`’s approval. Used in transfers."}],"ERC721IncorrectOwner(address,uint256,address)":[{"params":{"owner":"Address of the current owner of a token.","sender":"Address whose tokens are being transferred.","tokenId":"Identifier number of a token."},"details":"Indicates an error related to the ownership over a particular token. Used in transfers."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when `owner` enables `approved` to manage the `tokenId` token."},"Transfer(address,address,uint256)":{"details":"Emitted when `tokenId` token is transferred from `from` to `to`."},"ApprovalForAll(address,address,bool)":{"details":"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets."}},"methods":{"name()":{"details":"See {IERC721Metadata-name}."},"owner()":{"details":"Returns the address of the current owner."},"symbol()":{"details":"See {IERC721Metadata-symbol}."},"ownerOf(uint256)":{"details":"See {IERC721-ownerOf}."},"balanceOf(address)":{"details":"See {IERC721-balanceOf}."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"getApproved(uint256)":{"details":"See {IERC721-getApproved}."},"approve(address,uint256)":{"details":"See {IERC721-approve}."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"setApprovalForAll(address,bool)":{"details":"See {IERC721-setApprovalForAll}."},"isApprovedForAll(address,address)":{"details":"See {IERC721-isApprovedForAll}."},"transferFrom(address,address,uint256)":{"details":"See {IERC721-transferFrom}."},"safeTransferFrom(address,address,uint256)":{"details":"See {IERC721-safeTransferFrom}."},"safeTransferFrom(address,address,uint256,bytes)":{"details":"See {IERC721-safeTransferFrom}."}},"version":1},"sourceIds":{"AgentForgeMiner.sol":{"id":18},"AgentForgeRelic.sol":{"id":21},"@openzeppelin/contracts/utils/Panic.sol":{"id":9},"@openzeppelin/contracts/utils/Base64.sol":{"id":7},"@openzeppelin/contracts/utils/Context.sol":{"id":8},"@openzeppelin/contracts/utils/Strings.sol":{"id":11},"@openzeppelin/contracts/access/Ownable.sol":{"id":0},"@openzeppelin/contracts/utils/math/Math.sol":{"id":14},"@openzeppelin/contracts/token/ERC721/ERC721.sol":{"id":2},"@openzeppelin/contracts/utils/math/SafeCast.sol":{"id":15},"@openzeppelin/contracts/token/ERC721/IERC721.sol":{"id":3},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"id":10},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"id":16},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"id":1},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"id":12},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"id":13},"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"id":4},"@openzeppelin/contracts/token/ERC721/utils/ERC721Utils.sol":{"id":6},"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol":{"id":5}},"additionalInput":null,"stdJsonInput":{"sources":{"AgentForgeMiner.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\nimport \"@openzeppelin/contracts/utils/Base64.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\n\ninterface IRelicForge {\n    function forgeBurn(address from, uint256[5] calldata ids) external returns (uint8[5] memory);\n    function owner() external view returns (address);\n}\n\ninterface IMinerArt {\n    function minerSVG(uint256 id, uint256 tier, uint256 element, uint256 seed) external view returns (string memory);\n    function minerAttributes(uint256 tier, uint256 element, uint256 seed) external view returns (string memory);\n}\n\n/// @title AGENT FORGE - Forge & Miner\n/// @notice Burn exactly 5 revealed Relics you own to mint 1 Miner.\n/// Tier: all 5 the same element = Legendary (weight 3); all 4 elements present = Rare (weight 2);\n/// otherwise Common (weight 1).\n/// Miner holders share a reward pool funded by 50% of AgentForgeMarket fees, pro rata by weight, through a\n/// reward-per-weight accumulator. Rewards are claimable any time and settle on every Miner transfer.\n/// The pool only pays out what the market actually collects: no yield, return or value is promised.\n/// This contract has NO owner functions. Unofficial project, not affiliated with Binance or SPACE ID.\ncontract AgentForgeMiner is ERC721, ReentrancyGuard {\n    using Strings for uint256;\n\n    uint256 private constant PRECISION = 1e24;\n\n    IRelicForge public immutable RELIC;\n    IMinerArt public immutable ART;\n\n    struct Info { uint8 tier; uint8 element; uint32 seed; }\n\n    uint256 public totalSupply;\n    mapping(uint256 => Info) public info;\n    uint256[3] public tierCount;\n    mapping(uint256 => uint256) public transferNonce;\n\n    // ---- rewards ----\n    uint256 public accRewardPerWeight; // scaled by PRECISION\n    uint256 public totalWeight;\n    uint256 public unallocated;        // received while no Miner existed; added on the next deposit\n    uint256 public totalDeposited;\n    uint256 public totalClaimed;\n    mapping(address => uint256) public weightOf;\n    mapping(address => uint256) public rewardDebt;\n    mapping(address => uint256) public owed;\n\n    event Forged(address indexed owner, uint256 indexed minerId, uint8 tier, uint8 element, uint256[5] relicIds);\n    event RewardsDeposited(address indexed from, uint256 amount);\n    event Claimed(address indexed account, uint256 amount);\n\n    error NotRelic();\n    error NothingToClaim();\n    error PayFailed();\n\n    constructor(address art) ERC721(\"Agent Forge Miner\", \"MINER\") {\n        RELIC = IRelicForge(msg.sender);\n        ART = IMinerArt(art);\n    }\n\n    /// @notice For marketplaces' collection pages only: mirrors the Relic owner. Grants no powers here.\n    function owner() external view returns (address) {\n        return RELIC.owner();\n    }\n\n    // ---------------- forge ----------------\n\n    function forge(uint256[5] calldata relicIds) external nonReentrant returns (uint256 minerId) {\n        uint8[5] memory els = RELIC.forgeBurn(msg.sender, relicIds);\n        uint256[4] memory cnt;\n        for (uint256 i; i < 5; ++i) ++cnt[els[i]];\n        uint8 tier;\n        uint8 element;\n        uint256 kinds;\n        uint256 best;\n        for (uint256 e; e < 4; ++e) {\n            if (cnt[e] > 0) ++kinds;\n            if (cnt[e] > best) { best = cnt[e]; element = uint8(e); }\n        }\n        if (best == 5) tier = 2;        // Legendary: all 5 the same element (element = that element)\n        else if (kinds == 4) tier = 1;  // Rare: all 4 elements present (element = the doubled one)\n        // else Common (0); element = dominant element, ties -> lowest index\n        minerId = ++totalSupply;\n        info[minerId] = Info(tier, element, uint32(uint256(keccak256(abi.encode(block.prevrandao, relicIds, minerId)))));\n        ++tierCount[tier];\n        _mint(msg.sender, minerId);\n        emit Forged(msg.sender, minerId, tier, element, relicIds);\n    }\n\n    function weightOfToken(uint256 id) public view returns (uint256) {\n        return uint256(info[id].tier) + 1;\n    }\n\n    // ---------------- rewards ----------------\n\n    /// @notice Anyone (normally the Market) can add BNB to the pool.\n    function depositRewards() external payable {\n        totalDeposited += msg.value;\n        uint256 amt = msg.value;\n        if (totalWeight == 0) {\n            unallocated += amt;\n        } else {\n            amt += unallocated;\n            unallocated = 0;\n            accRewardPerWeight += (amt * PRECISION) / totalWeight;\n        }\n        emit RewardsDeposited(msg.sender, msg.value);\n    }\n\n    function pendingRewards(address account) public view returns (uint256) {\n        return owed[account] + (weightOf[account] * accRewardPerWeight) / PRECISION - rewardDebt[account];\n    }\n\n    function claim() external nonReentrant returns (uint256 amt) {\n        _settle(msg.sender);\n        amt = owed[msg.sender];\n        if (amt == 0) revert NothingToClaim();\n        owed[msg.sender] = 0;\n        totalClaimed += amt;\n        (bool ok, ) = payable(msg.sender).call{value: amt}(\"\");\n        if (!ok) revert PayFailed();\n        emit Claimed(msg.sender, amt);\n    }\n\n    function _settle(address a) internal {\n        uint256 w = weightOf[a];\n        uint256 acc = (w * accRewardPerWeight) / PRECISION;\n        owed[a] += acc - rewardDebt[a];\n        rewardDebt[a] = acc;\n    }\n\n    function _update(address to, uint256 id, address auth) internal override returns (address from) {\n        from = super._update(to, id, auth);\n        uint256 w = weightOfToken(id);\n        if (from != address(0)) {\n            _settle(from);\n            weightOf[from] -= w;\n            rewardDebt[from] = (weightOf[from] * accRewardPerWeight) / PRECISION;\n            totalWeight -= w;\n        }\n        if (to != address(0)) {\n            _settle(to);\n            weightOf[to] += w;\n            rewardDebt[to] = (weightOf[to] * accRewardPerWeight) / PRECISION;\n            totalWeight += w;\n        }\n        if (from != address(0) && to != address(0)) ++transferNonce[id];\n    }\n\n    // ---------------- metadata ----------------\n\n    function tokenURI(uint256 id) public view override returns (string memory) {\n        _requireOwned(id);\n        Info memory m = info[id];\n        string memory tierName = m.tier == 0 ? \"Common\" : m.tier == 1 ? \"Rare\" : \"Legendary\";\n        return string.concat(\n            \"data:application/json;base64,\",\n            Base64.encode(bytes(string.concat(\n                '{\"name\":\"', tierName, \" Miner #\", id.toString(),\n                '\",\"description\":\"Agent Forge Miner, forged on-chain from 5 Relics on BNB Chain. Weight Common 1, Rare 2, Legendary 3 in the market fee reward pool. Unofficial, collectible only, no yield promised.\",\"image\":\"data:image/svg+xml;utf8,',\n                ART.minerSVG(id, m.tier, m.element, m.seed),\n                '\",\"attributes\":[', ART.minerAttributes(m.tier, m.element, m.seed), \"]}\"\n            )))\n        );\n    }\n}\n"},"AgentForgeRelic.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts/utils/Base64.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\nimport \"./AgentForgeMiner.sol\";\n\ninterface IAgentID {\n    function balanceOf(address owner) external view returns (uint256);\n}\n\ninterface IRelicArt {\n    function sealedSVG(uint256 id) external pure returns (string memory);\n    function relicSVG(uint256 id, uint256 element, uint256 design) external pure returns (string memory);\n    function relicAttributes(uint256 element, uint256 design) external pure returns (string memory);\n}\n\n/// @title AGENT FORGE - Relic\n/// @notice 5,000 pixel relics on BNB Chain. Mint is open only to wallets holding a .ai Agent ID.\n/// The first 2 per wallet are free, then 0.0005 BNB each, max 10 per wallet.\n/// Each Relic carries one of four elements (Fire, Water, Earth, Lightning; exactly 1,250 each),\n/// assigned by a one-time random offset at reveal over a pre-committed sequence (see PROVENANCE).\n/// Burn 5 Relics in the Forge (AgentForgeMiner) to mint 1 Miner.\n/// Art is fully on-chain SVG. Unofficial project, not affiliated with Binance or SPACE ID.\n/// Collectible only: no yield, return or value is promised.\ncontract AgentForgeRelic is ERC721, Ownable {\n    using Strings for uint256;\n\n    // ---------------- fixed rules (cannot be changed by anyone) ----------------\n    uint256 public constant MAX_SUPPLY = 5000;\n    uint256 public constant REVEAL_THRESHOLD = 4500; // 90%\n    uint256 public constant FREE_PER_WALLET = 2;\n    uint256 public constant MAX_PER_WALLET = 10;\n    uint256 public constant PRICE = 0.0005 ether;\n    uint256 public constant PER_ELEMENT = 1250;\n    uint256 public constant DESIGNS = 1728;\n    /// @notice If the owner has not revealed 14 days after the 90% threshold was reached\n    /// (or as soon as the collection is sold out), anyone may call reveal().\n    uint256 public constant PUBLIC_REVEAL_DELAY = 14 days;\n    IAgentID public constant AGENT_ID = IAgentID(0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F);\n    bytes32 private constant SEQ_KEY = keccak256(\"AGENT FORGE RELIC SEQUENCE\");\n\n    /// @notice keccak256 of the 15,000-byte table [element(1) | design(2, big-endian)] for slots 0..4999,\n    /// i.e. exactly what slotData() returns. Committed at deploy, before any mint.\n    bytes32 public immutable PROVENANCE;\n    /// @notice Mint proceeds can only ever go here.\n    address payable public immutable PROCEEDS;\n    /// @notice The Forge / Miner collection, deployed by this contract's constructor.\n    AgentForgeMiner public immutable MINER;\n\n    IRelicArt public art;\n    uint256 public totalMinted;\n    uint256 public totalBurned;\n    bool public mintOpen;\n    bool public revealed;\n    uint256 public revealOffset;\n    uint256 public thresholdReachedAt;\n\n    mapping(address => uint256) public mintedBy;\n    /// @notice Increments on every wallet-to-wallet transfer; the Market uses it to expire stale listings.\n    mapping(uint256 => uint256) public transferNonce;\n\n    event MintOpened();\n    event Revealed(uint256 offset, address by);\n    event ArtUpdated(address art);\n    event Withdrawn(uint256 amount);\n\n    error MintClosed();\n    error NotAgent();\n    error ZeroQty();\n    error SoldOut();\n    error WalletLimit();\n    error WrongPayment();\n    error NotRevealed();\n    error AlreadyRevealed();\n    error RevealTooEarly();\n    error MetadataLocked();\n    error OnlyMiner();\n    error NotTokenOwner();\n    error NoToken();\n\n    constructor(address relicArt, address minerArt, address payable proceeds, bytes32 provenance)\n        ERC721(\"Agent Forge Relic\", \"RELIC\")\n        Ownable(proceeds)\n    {\n        art = IRelicArt(relicArt);\n        PROCEEDS = proceeds;\n        PROVENANCE = provenance;\n        MINER = new AgentForgeMiner(minerArt);\n    }\n\n    // ---------------- mint ----------------\n\n    /// @notice BNB due for `wallet` to mint `qty` more Relics now.\n    function quote(address wallet, uint256 qty) public view returns (uint256) {\n        uint256 prev = mintedBy[wallet];\n        uint256 free = prev >= FREE_PER_WALLET ? 0 : FREE_PER_WALLET - prev;\n        return qty > free ? (qty - free) * PRICE : 0;\n    }\n\n    function mint(uint256 qty) external payable {\n        if (!mintOpen) revert MintClosed();\n        if (AGENT_ID.balanceOf(msg.sender) == 0) revert NotAgent();\n        if (qty == 0) revert ZeroQty();\n        uint256 start = totalMinted;\n        if (start + qty > MAX_SUPPLY) revert SoldOut();\n        if (mintedBy[msg.sender] + qty > MAX_PER_WALLET) revert WalletLimit();\n        if (msg.value != quote(msg.sender, qty)) revert WrongPayment();\n        mintedBy[msg.sender] += qty;\n        totalMinted = start + qty;\n        if (thresholdReachedAt == 0 && start + qty >= REVEAL_THRESHOLD) thresholdReachedAt = block.timestamp;\n        for (uint256 i = 1; i <= qty; ++i) _mint(msg.sender, start + i);\n    }\n\n    function totalSupply() external view returns (uint256) {\n        return totalMinted - totalBurned;\n    }\n\n    // ---------------- reveal & elements ----------------\n\n    /// @notice One-time reveal. Owner may call once >= 4,500 are minted. Anyone may call once the\n    /// collection is sold out, or 14 days after the 4,500 threshold was reached.\n    function reveal() external {\n        if (revealed) revert AlreadyRevealed();\n        if (totalMinted < REVEAL_THRESHOLD) revert RevealTooEarly();\n        if (msg.sender != owner() && totalMinted < MAX_SUPPLY\n            && block.timestamp < thresholdReachedAt + PUBLIC_REVEAL_DELAY) revert RevealTooEarly();\n        revealOffset = uint256(keccak256(abi.encode(block.prevrandao, blockhash(block.number - 1), totalMinted, address(this)))) % MAX_SUPPLY;\n        revealed = true;\n        emit Revealed(revealOffset, msg.sender);\n    }\n\n    /// @notice Metadata is permanently locked once revealed (no setter can run afterwards).\n    function metadataLocked() external view returns (bool) {\n        return revealed;\n    }\n\n    /// @notice Pre-committed sequence entry for slot 0..4999: element 0..3 (Fire, Water, Earth, Lightning)\n    /// and design 0..1727. Exactly 1,250 slots per element.\n    function slotData(uint256 slot) public pure returns (uint8 element, uint16 design) {\n        require(slot < MAX_SUPPLY, \"slot\");\n        element = uint8(_perm(slot) / PER_ELEMENT);\n        design = uint16(uint256(keccak256(abi.encode(SEQ_KEY, slot))) % DESIGNS);\n    }\n\n    function slotOf(uint256 id) public view returns (uint256) {\n        if (!revealed) revert NotRevealed();\n        if (id == 0 || id > totalMinted) revert NoToken();\n        return (id - 1 + revealOffset) % MAX_SUPPLY;\n    }\n\n    function elementOf(uint256 id) public view returns (uint8 element) {\n        (element, ) = slotData(slotOf(id));\n    }\n\n    /// @dev 4-round Feistel network over 14 bits with cycle-walking onto [0, 5000): a fixed bijection.\n    function _perm(uint256 x) internal pure returns (uint256) {\n        do {\n            uint256 l = x >> 7;\n            uint256 r = x & 127;\n            for (uint256 i; i < 4; ++i) {\n                uint256 f = uint256(keccak256(abi.encode(SEQ_KEY, i, r))) & 127;\n                (l, r) = (r, l ^ f);\n            }\n            x = (l << 7) | r;\n        } while (x >= MAX_SUPPLY);\n        return x;\n    }\n\n    // ---------------- forge hook ----------------\n\n    /// @notice Called only by the Forge (MINER). Burns 5 Relics owned by `from` and returns their elements.\n    function forgeBurn(address from, uint256[5] calldata ids) external returns (uint8[5] memory elements) {\n        if (msg.sender != address(MINER)) revert OnlyMiner();\n        if (!revealed) revert NotRevealed();\n        for (uint256 i; i < 5; ++i) {\n            if (_ownerOf(ids[i]) != from) revert NotTokenOwner(); // also rejects duplicates (burned on 1st use)\n            elements[i] = elementOf(ids[i]);\n            _burn(ids[i]);\n        }\n        totalBurned += 5;\n    }\n\n    function _update(address to, uint256 id, address auth) internal override returns (address from) {\n        from = super._update(to, id, auth);\n        if (from != address(0) && to != address(0)) ++transferNonce[id];\n    }\n\n    // ---------------- metadata ----------------\n\n    function tokenURI(uint256 id) public view override returns (string memory) {\n        _requireOwned(id);\n        string memory name;\n        string memory img;\n        string memory attrs;\n        if (!revealed) {\n            name = string.concat(\"Sealed Relic #\", id.toString());\n            img = art.sealedSVG(id);\n            attrs = '{\"trait_type\":\"Status\",\"value\":\"Sealed\"}';\n        } else {\n            (uint8 el, uint16 d) = slotData(slotOf(id));\n            name = string.concat(_elementName(el), \" Relic #\", id.toString());\n            img = art.relicSVG(id, el, d);\n            attrs = art.relicAttributes(el, d);\n        }\n        return string.concat(\n            \"data:application/json;base64,\",\n            Base64.encode(bytes(string.concat(\n                '{\"name\":\"', name,\n                '\",\"description\":\"Agent Forge: 5,000 on-chain pixel relics for .ai Agent ID holders on BNB Chain. Forge 5 Relics into 1 Miner. Unofficial, collectible only, no yield promised.\",\"image\":\"data:image/svg+xml;utf8,',\n                img, '\",\"attributes\":[', attrs, \"]}\"\n            )))\n        );\n    }\n\n    function contractURI() external view returns (string memory) {\n        return string.concat(\n            \"data:application/json;utf8,\",\n            '{\"name\":\"Agent Forge Relic\",\"description\":\"5,000 on-chain pixel relics in four elements for .ai Agent ID holders on BNB Chain. Burn 5 in the Forge to mint a Miner. Unofficial, collectible only.\",\"image\":\"data:image/svg+xml;utf8,',\n            art.sealedSVG(0), '\"}'\n        );\n    }\n\n    function _elementName(uint256 e) internal pure returns (string memory) {\n        if (e == 0) return \"Fire\";\n        if (e == 1) return \"Water\";\n        if (e == 2) return \"Earth\";\n        return \"Lightning\";\n    }\n\n    // ---------------- owner (minimal) ----------------\n\n    /// @notice One-way switch: opens the mint. There is no way to pause or close it again.\n    function openMint() external onlyOwner {\n        mintOpen = true;\n        emit MintOpened();\n    }\n\n    /// @notice Replace the relic renderer. Only possible BEFORE reveal; after reveal metadata is locked forever.\n    function setArt(address newArt) external onlyOwner {\n        if (revealed) revert MetadataLocked();\n        art = IRelicArt(newArt);\n        emit ArtUpdated(newArt);\n    }\n\n    // ---------------- proceeds ----------------\n\n    /// @notice Anyone may trigger; funds can only go to the immutable PROCEEDS wallet.\n    function withdraw() external {\n        uint256 bal = address(this).balance;\n        (bool ok, ) = PROCEEDS.call{value: bal}(\"\");\n        require(ok, \"withdraw failed\");\n        emit Withdrawn(bal);\n    }\n}\n"},"@openzeppelin/contracts/utils/Panic.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Panic.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Helper library for emitting standardized panic codes.\n *\n * ```solidity\n * contract Example {\n *      using Panic for uint256;\n *\n *      // Use any of the declared internal constants\n *      function foo() { Panic.GENERIC.panic(); }\n *\n *      // Alternatively\n *      function foo() { Panic.panic(Panic.GENERIC); }\n * }\n * ```\n *\n * Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].\n *\n * _Available since v5.1._\n */\n// slither-disable-next-line unused-state\nlibrary Panic {\n    /// @dev generic / unspecified error\n    uint256 internal constant GENERIC = 0x00;\n    /// @dev used by the assert() builtin\n    uint256 internal constant ASSERT = 0x01;\n    /// @dev arithmetic underflow or overflow\n    uint256 internal constant UNDER_OVERFLOW = 0x11;\n    /// @dev division or modulo by zero\n    uint256 internal constant DIVISION_BY_ZERO = 0x12;\n    /// @dev enum conversion error\n    uint256 internal constant ENUM_CONVERSION_ERROR = 0x21;\n    /// @dev invalid encoding in storage\n    uint256 internal constant STORAGE_ENCODING_ERROR = 0x22;\n    /// @dev empty array pop\n    uint256 internal constant EMPTY_ARRAY_POP = 0x31;\n    /// @dev array out of bounds access\n    uint256 internal constant ARRAY_OUT_OF_BOUNDS = 0x32;\n    /// @dev resource error (too large allocation or too large array)\n    uint256 internal constant RESOURCE_ERROR = 0x41;\n    /// @dev calling invalid internal function\n    uint256 internal constant INVALID_INTERNAL_FUNCTION = 0x51;\n\n    /// @dev Reverts with a panic code. Recommended to use with\n    /// the internal constants with predefined codes.\n    function panic(uint256 code) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0x00, 0x4e487b71)\n            mstore(0x20, code)\n            revert(0x1c, 0x24)\n        }\n    }\n}\n"},"@openzeppelin/contracts/utils/Base64.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Base64.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides a set of functions to operate with Base64 strings.\n */\nlibrary Base64 {\n    /**\n     * @dev Base64 Encoding/Decoding Table\n     * See sections 4 and 5 of https://datatracker.ietf.org/doc/html/rfc4648\n     */\n    string internal constant _TABLE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    string internal constant _TABLE_URL = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\n    /**\n     * @dev Converts a `bytes` to its Bytes64 `string` representation.\n     */\n    function encode(bytes memory data) internal pure returns (string memory) {\n        return _encode(data, _TABLE, true);\n    }\n\n    /**\n     * @dev Converts a `bytes` to its Bytes64Url `string` representation.\n     * Output is not padded with `=` as specified in https://www.rfc-editor.org/rfc/rfc4648[rfc4648].\n     */\n    function encodeURL(bytes memory data) internal pure returns (string memory) {\n        return _encode(data, _TABLE_URL, false);\n    }\n\n    /**\n     * @dev Internal table-agnostic conversion\n     */\n    function _encode(bytes memory data, string memory table, bool withPadding) private pure returns (string memory) {\n        /**\n         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\n         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\n         */\n        if (data.length == 0) return \"\";\n\n        // If padding is enabled, the final length should be `bytes` data length divided by 3 rounded up and then\n        // multiplied by 4 so that it leaves room for padding the last chunk\n        // - `data.length + 2`  -> Prepare for division rounding up\n        // - `/ 3`              -> Number of 3-bytes chunks (rounded up)\n        // - `4 *`              -> 4 characters for each chunk\n        // This is equivalent to: 4 * Math.ceil(data.length / 3)\n        //\n        // If padding is disabled, the final length should be `bytes` data length multiplied by 4/3 rounded up as\n        // opposed to when padding is required to fill the last chunk.\n        // - `4 * data.length`  -> 4 characters for each chunk\n        // - ` + 2`             -> Prepare for division rounding up\n        // - `/ 3`              -> Number of 3-bytes chunks (rounded up)\n        // This is equivalent to: Math.ceil((4 * data.length) / 3)\n        uint256 resultLength = withPadding ? 4 * ((data.length + 2) / 3) : (4 * data.length + 2) / 3;\n\n        string memory result = new string(resultLength);\n\n        assembly (\"memory-safe\") {\n            // Prepare the lookup table (skip the first \"length\" byte)\n            let tablePtr := add(table, 1)\n\n            // Prepare result pointer, jump over length\n            let resultPtr := add(result, 0x20)\n            let dataPtr := data\n            let endPtr := add(data, mload(data))\n\n            // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and\n            // set it to zero to make sure no dirty bytes are read in that section.\n            let afterPtr := add(endPtr, 0x20)\n            let afterCache := mload(afterPtr)\n            mstore(afterPtr, 0x00)\n\n            // Run over the input, 3 bytes at a time\n            for {\n\n            } lt(dataPtr, endPtr) {\n\n            } {\n                // Advance 3 bytes\n                dataPtr := add(dataPtr, 3)\n                let input := mload(dataPtr)\n\n                // To write each character, shift the 3 byte (24 bits) chunk\n                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\n                // and apply logical AND with 0x3F to bitmask the least significant 6 bits.\n                // Use this as an index into the lookup table, mload an entire word\n                // so the desired character is in the least significant byte, and\n                // mstore8 this least significant byte into the result and continue.\n\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n\n                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n\n                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\n                resultPtr := add(resultPtr, 1) // Advance\n            }\n\n            // Reset the value that was cached\n            mstore(afterPtr, afterCache)\n\n            if withPadding {\n                // When data `bytes` is not exactly 3 bytes long\n                // it is padded with `=` characters at the end\n                switch mod(mload(data), 3)\n                case 1 {\n                    mstore8(sub(resultPtr, 1), 0x3d)\n                    mstore8(sub(resultPtr, 2), 0x3d)\n                }\n                case 2 {\n                    mstore8(sub(resultPtr, 1), 0x3d)\n                }\n            }\n        }\n\n        return result;\n    }\n}\n"},"@openzeppelin/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},"@openzeppelin/contracts/utils/Strings.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n    bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n    uint8 private constant ADDRESS_LENGTH = 20;\n\n    /**\n     * @dev The `value` string doesn't fit in the specified `length`.\n     */\n    error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n     */\n    function toString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            uint256 length = Math.log10(value) + 1;\n            string memory buffer = new string(length);\n            uint256 ptr;\n            assembly (\"memory-safe\") {\n                ptr := add(buffer, add(32, length))\n            }\n            while (true) {\n                ptr--;\n                assembly (\"memory-safe\") {\n                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n                }\n                value /= 10;\n                if (value == 0) break;\n            }\n            return buffer;\n        }\n    }\n\n    /**\n     * @dev Converts a `int256` to its ASCII `string` decimal representation.\n     */\n    function toStringSigned(int256 value) internal pure returns (string memory) {\n        return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            return toHexString(value, Math.log256(value) + 1);\n        }\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n     */\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n        uint256 localValue = value;\n        bytes memory buffer = new bytes(2 * length + 2);\n        buffer[0] = \"0\";\n        buffer[1] = \"x\";\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\n            buffer[i] = HEX_DIGITS[localValue & 0xf];\n            localValue >>= 4;\n        }\n        if (localValue != 0) {\n            revert StringsInsufficientHexLength(value, length);\n        }\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n     * representation.\n     */\n    function toHexString(address addr) internal pure returns (string memory) {\n        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its checksummed ASCII `string` hexadecimal\n     * representation, according to EIP-55.\n     */\n    function toChecksumHexString(address addr) internal pure returns (string memory) {\n        bytes memory buffer = bytes(toHexString(addr));\n\n        // hash the hex part of buffer (skip length + 2 bytes, length 40)\n        uint256 hashValue;\n        assembly (\"memory-safe\") {\n            hashValue := shr(96, keccak256(add(buffer, 0x22), 40))\n        }\n\n        for (uint256 i = 41; i > 1; --i) {\n            // possible values for buffer[i] are 48 (0) to 57 (9) and 97 (a) to 102 (f)\n            if (hashValue & 0xf > 7 && uint8(buffer[i]) > 96) {\n                // case shift by xoring with 0x20\n                buffer[i] ^= 0x20;\n            }\n            hashValue >>= 4;\n        }\n        return string(buffer);\n    }\n\n    /**\n     * @dev Returns true if the two strings are equal.\n     */\n    function equal(string memory a, string memory b) internal pure returns (bool) {\n        return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n    }\n}\n"},"@openzeppelin/contracts/access/Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    /**\n     * @dev The caller account is not authorized to perform an operation.\n     */\n    error OwnableUnauthorizedAccount(address account);\n\n    /**\n     * @dev The owner is not a valid owner account. (eg. `address(0)`)\n     */\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n     */\n    constructor(address initialOwner) {\n        if (initialOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(initialOwner);\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        if (owner() != _msgSender()) {\n            revert OwnableUnauthorizedAccount(_msgSender());\n        }\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        if (newOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},"@openzeppelin/contracts/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\nimport {Panic} from \"../Panic.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n    enum Rounding {\n        Floor, // Toward negative infinity\n        Ceil, // Toward positive infinity\n        Trunc, // Toward zero\n        Expand // Away from zero\n    }\n\n    /**\n     * @dev Returns the addition of two unsigned integers, with an success flag (no overflow).\n     */\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            uint256 c = a + b;\n            if (c < a) return (false, 0);\n            return (true, c);\n        }\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, with an success flag (no overflow).\n     */\n    function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            if (b > a) return (false, 0);\n            return (true, a - b);\n        }\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, with an success flag (no overflow).\n     */\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n            // benefit is lost if 'b' is also tested.\n            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n            if (a == 0) return (true, 0);\n            uint256 c = a * b;\n            if (c / a != b) return (false, 0);\n            return (true, c);\n        }\n    }\n\n    /**\n     * @dev Returns the division of two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            if (b == 0) return (false, 0);\n            return (true, a / b);\n        }\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).\n     */\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {\n        unchecked {\n            if (b == 0) return (false, 0);\n            return (true, a % b);\n        }\n    }\n\n    /**\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, uint256 a, uint256 b) internal pure returns (uint256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * SafeCast.toUint(condition));\n        }\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a > b, a, b);\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return ternary(a < b, a, b);\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b) / 2 can overflow.\n        return (a & b) + (a ^ b) / 2;\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds towards infinity instead\n     * of rounding towards zero.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        if (b == 0) {\n            // Guarantee the same behavior as in a regular Solidity division.\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n\n        // The following calculation ensures accurate ceiling division without overflow.\n        // Since a is non-zero, (a - 1) / b will not overflow.\n        // The largest possible result occurs when (a - 1) / b is type(uint256).max,\n        // but the largest value we can obtain is type(uint256).max - 1, which happens\n        // when a = type(uint256).max and b = 1.\n        unchecked {\n            return SafeCast.toUint(a > 0) * ((a - 1) / b + 1);\n        }\n    }\n\n    /**\n     * @dev Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n     * denominator == 0.\n     *\n     * Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n     * Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2²⁵⁶ and mod 2²⁵⁶ - 1, then use\n            // the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2²⁵⁶ + prod0.\n            uint256 prod0 = x * y; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly {\n                let mm := mulmod(x, y, not(0))\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (prod1 == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return prod0 / denominator;\n            }\n\n            // Make sure the result is less than 2²⁵⁶. Also prevents denominator == 0.\n            if (denominator <= prod1) {\n                Panic.panic(ternary(denominator == 0, Panic.DIVISION_BY_ZERO, Panic.UNDER_OVERFLOW));\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0].\n            uint256 remainder;\n            assembly {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n            uint256 twos = denominator & (0 - denominator);\n            assembly {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [prod1 prod0] by twos.\n                prod0 := div(prod0, twos)\n\n                // Flip twos such that it is 2²⁵⁶ / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from prod1 into prod0.\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2²⁵⁶. Now that denominator is an odd number, it has an inverse modulo 2²⁵⁶ such\n            // that denominator * inv ≡ 1 mod 2²⁵⁶. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv ≡ 1 mod 2⁴.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n            // works in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹⁶\n            inverse *= 2 - denominator * inverse; // inverse mod 2³²\n            inverse *= 2 - denominator * inverse; // inverse mod 2⁶⁴\n            inverse *= 2 - denominator * inverse; // inverse mod 2¹²⁸\n            inverse *= 2 - denominator * inverse; // inverse mod 2²⁵⁶\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2²⁵⁶. Since the preconditions guarantee that the outcome is\n            // less than 2²⁵⁶, this is the final result. We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @dev Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        return mulDiv(x, y, denominator) + SafeCast.toUint(unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0);\n    }\n\n    /**\n     * @dev Calculate the modular multiplicative inverse of a number in Z/nZ.\n     *\n     * If n is a prime, then Z/nZ is a field. In that case all elements are inversible, except 0.\n     * If n is not a prime, then Z/nZ is not a field, and some elements might not be inversible.\n     *\n     * If the input value is not inversible, 0 is returned.\n     *\n     * NOTE: If you know for sure that n is (big) a prime, it may be cheaper to use Fermat's little theorem and get the\n     * inverse using `Math.modExp(a, n - 2, n)`. See {invModPrime}.\n     */\n    function invMod(uint256 a, uint256 n) internal pure returns (uint256) {\n        unchecked {\n            if (n == 0) return 0;\n\n            // The inverse modulo is calculated using the Extended Euclidean Algorithm (iterative version)\n            // Used to compute integers x and y such that: ax + ny = gcd(a, n).\n            // When the gcd is 1, then the inverse of a modulo n exists and it's x.\n            // ax + ny = 1\n            // ax = 1 + (-y)n\n            // ax ≡ 1 (mod n) # x is the inverse of a modulo n\n\n            // If the remainder is 0 the gcd is n right away.\n            uint256 remainder = a % n;\n            uint256 gcd = n;\n\n            // Therefore the initial coefficients are:\n            // ax + ny = gcd(a, n) = n\n            // 0a + 1n = n\n            int256 x = 0;\n            int256 y = 1;\n\n            while (remainder != 0) {\n                uint256 quotient = gcd / remainder;\n\n                (gcd, remainder) = (\n                    // The old remainder is the next gcd to try.\n                    remainder,\n                    // Compute the next remainder.\n                    // Can't overflow given that (a % gcd) * (gcd // (a % gcd)) <= gcd\n                    // where gcd is at most n (capped to type(uint256).max)\n                    gcd - remainder * quotient\n                );\n\n                (x, y) = (\n                    // Increment the coefficient of a.\n                    y,\n                    // Decrement the coefficient of n.\n                    // Can overflow, but the result is casted to uint256 so that the\n                    // next value of y is \"wrapped around\" to a value between 0 and n - 1.\n                    x - y * int256(quotient)\n                );\n            }\n\n            if (gcd != 1) return 0; // No inverse exists.\n            return ternary(x < 0, n - uint256(-x), uint256(x)); // Wrap the result if it's negative.\n        }\n    }\n\n    /**\n     * @dev Variant of {invMod}. More efficient, but only works if `p` is known to be a prime greater than `2`.\n     *\n     * From https://en.wikipedia.org/wiki/Fermat%27s_little_theorem[Fermat's little theorem], we know that if p is\n     * prime, then `a**(p-1) ≡ 1 mod p`. As a consequence, we have `a * a**(p-2) ≡ 1 mod p`, which means that\n     * `a**(p-2)` is the modular multiplicative inverse of a in Fp.\n     *\n     * NOTE: this function does NOT check that `p` is a prime greater than `2`.\n     */\n    function invModPrime(uint256 a, uint256 p) internal view returns (uint256) {\n        unchecked {\n            return Math.modExp(a, p - 2, p);\n        }\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m)\n     *\n     * Requirements:\n     * - modulus can't be zero\n     * - underlying staticcall to precompile must succeed\n     *\n     * IMPORTANT: The result is only valid if the underlying call succeeds. When using this function, make\n     * sure the chain you're using it on supports the precompiled contract for modular exponentiation\n     * at address 0x05 as specified in https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise,\n     * the underlying function will succeed given the lack of a revert, but the result may be incorrectly\n     * interpreted as 0.\n     */\n    function modExp(uint256 b, uint256 e, uint256 m) internal view returns (uint256) {\n        (bool success, uint256 result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the modular exponentiation of the specified base, exponent and modulus (b ** e % m).\n     * It includes a success flag indicating if the operation succeeded. Operation will be marked as failed if trying\n     * to operate modulo 0 or if the underlying precompile reverted.\n     *\n     * IMPORTANT: The result is only valid if the success flag is true. When using this function, make sure the chain\n     * you're using it on supports the precompiled contract for modular exponentiation at address 0x05 as specified in\n     * https://eips.ethereum.org/EIPS/eip-198[EIP-198]. Otherwise, the underlying function will succeed given the lack\n     * of a revert, but the result may be incorrectly interpreted as 0.\n     */\n    function tryModExp(uint256 b, uint256 e, uint256 m) internal view returns (bool success, uint256 result) {\n        if (m == 0) return (false, 0);\n        assembly (\"memory-safe\") {\n            let ptr := mload(0x40)\n            // | Offset    | Content    | Content (Hex)                                                      |\n            // |-----------|------------|--------------------------------------------------------------------|\n            // | 0x00:0x1f | size of b  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x20:0x3f | size of e  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x40:0x5f | size of m  | 0x0000000000000000000000000000000000000000000000000000000000000020 |\n            // | 0x60:0x7f | value of b | 0x<.............................................................b> |\n            // | 0x80:0x9f | value of e | 0x<.............................................................e> |\n            // | 0xa0:0xbf | value of m | 0x<.............................................................m> |\n            mstore(ptr, 0x20)\n            mstore(add(ptr, 0x20), 0x20)\n            mstore(add(ptr, 0x40), 0x20)\n            mstore(add(ptr, 0x60), b)\n            mstore(add(ptr, 0x80), e)\n            mstore(add(ptr, 0xa0), m)\n\n            // Given the result < m, it's guaranteed to fit in 32 bytes,\n            // so we can use the memory scratch space located at offset 0.\n            success := staticcall(gas(), 0x05, ptr, 0xc0, 0x00, 0x20)\n            result := mload(0x00)\n        }\n    }\n\n    /**\n     * @dev Variant of {modExp} that supports inputs of arbitrary length.\n     */\n    function modExp(bytes memory b, bytes memory e, bytes memory m) internal view returns (bytes memory) {\n        (bool success, bytes memory result) = tryModExp(b, e, m);\n        if (!success) {\n            Panic.panic(Panic.DIVISION_BY_ZERO);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Variant of {tryModExp} that supports inputs of arbitrary length.\n     */\n    function tryModExp(\n        bytes memory b,\n        bytes memory e,\n        bytes memory m\n    ) internal view returns (bool success, bytes memory result) {\n        if (_zeroBytes(m)) return (false, new bytes(0));\n\n        uint256 mLen = m.length;\n\n        // Encode call args in result and move the free memory pointer\n        result = abi.encodePacked(b.length, e.length, mLen, b, e, m);\n\n        assembly (\"memory-safe\") {\n            let dataPtr := add(result, 0x20)\n            // Write result on top of args to avoid allocating extra memory.\n            success := staticcall(gas(), 0x05, dataPtr, mload(result), dataPtr, mLen)\n            // Overwrite the length.\n            // result.length > returndatasize() is guaranteed because returndatasize() == m.length\n            mstore(result, mLen)\n            // Set the memory pointer after the returned data.\n            mstore(0x40, add(dataPtr, mLen))\n        }\n    }\n\n    /**\n     * @dev Returns whether the provided byte array is zero.\n     */\n    function _zeroBytes(bytes memory byteArray) private pure returns (bool) {\n        for (uint256 i = 0; i < byteArray.length; ++i) {\n            if (byteArray[i] != 0) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n     * towards zero.\n     *\n     * This method is based on Newton's method for computing square roots; the algorithm is restricted to only\n     * using integer operations.\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        unchecked {\n            // Take care of easy edge cases when a == 0 or a == 1\n            if (a <= 1) {\n                return a;\n            }\n\n            // In this function, we use Newton's method to get a root of `f(x) := x² - a`. It involves building a\n            // sequence x_n that converges toward sqrt(a). For each iteration x_n, we also define the error between\n            // the current value as `ε_n = | x_n - sqrt(a) |`.\n            //\n            // For our first estimation, we consider `e` the smallest power of 2 which is bigger than the square root\n            // of the target. (i.e. `2**(e-1) ≤ sqrt(a) < 2**e`). We know that `e ≤ 128` because `(2¹²⁸)² = 2²⁵⁶` is\n            // bigger than any uint256.\n            //\n            // By noticing that\n            // `2**(e-1) ≤ sqrt(a) < 2**e → (2**(e-1))² ≤ a < (2**e)² → 2**(2*e-2) ≤ a < 2**(2*e)`\n            // we can deduce that `e - 1` is `log2(a) / 2`. We can thus compute `x_n = 2**(e-1)` using a method similar\n            // to the msb function.\n            uint256 aa = a;\n            uint256 xn = 1;\n\n            if (aa >= (1 << 128)) {\n                aa >>= 128;\n                xn <<= 64;\n            }\n            if (aa >= (1 << 64)) {\n                aa >>= 64;\n                xn <<= 32;\n            }\n            if (aa >= (1 << 32)) {\n                aa >>= 32;\n                xn <<= 16;\n            }\n            if (aa >= (1 << 16)) {\n                aa >>= 16;\n                xn <<= 8;\n            }\n            if (aa >= (1 << 8)) {\n                aa >>= 8;\n                xn <<= 4;\n            }\n            if (aa >= (1 << 4)) {\n                aa >>= 4;\n                xn <<= 2;\n            }\n            if (aa >= (1 << 2)) {\n                xn <<= 1;\n            }\n\n            // We now have x_n such that `x_n = 2**(e-1) ≤ sqrt(a) < 2**e = 2 * x_n`. This implies ε_n ≤ 2**(e-1).\n            //\n            // We can refine our estimation by noticing that the middle of that interval minimizes the error.\n            // If we move x_n to equal 2**(e-1) + 2**(e-2), then we reduce the error to ε_n ≤ 2**(e-2).\n            // This is going to be our x_0 (and ε_0)\n            xn = (3 * xn) >> 1; // ε_0 := | x_0 - sqrt(a) | ≤ 2**(e-2)\n\n            // From here, Newton's method give us:\n            // x_{n+1} = (x_n + a / x_n) / 2\n            //\n            // One should note that:\n            // x_{n+1}² - a = ((x_n + a / x_n) / 2)² - a\n            //              = ((x_n² + a) / (2 * x_n))² - a\n            //              = (x_n⁴ + 2 * a * x_n² + a²) / (4 * x_n²) - a\n            //              = (x_n⁴ + 2 * a * x_n² + a² - 4 * a * x_n²) / (4 * x_n²)\n            //              = (x_n⁴ - 2 * a * x_n² + a²) / (4 * x_n²)\n            //              = (x_n² - a)² / (2 * x_n)²\n            //              = ((x_n² - a) / (2 * x_n))²\n            //              ≥ 0\n            // Which proves that for all n ≥ 1, sqrt(a) ≤ x_n\n            //\n            // This gives us the proof of quadratic convergence of the sequence:\n            // ε_{n+1} = | x_{n+1} - sqrt(a) |\n            //         = | (x_n + a / x_n) / 2 - sqrt(a) |\n            //         = | (x_n² + a - 2*x_n*sqrt(a)) / (2 * x_n) |\n            //         = | (x_n - sqrt(a))² / (2 * x_n) |\n            //         = | ε_n² / (2 * x_n) |\n            //         = ε_n² / | (2 * x_n) |\n            //\n            // For the first iteration, we have a special case where x_0 is known:\n            // ε_1 = ε_0² / | (2 * x_0) |\n            //     ≤ (2**(e-2))² / (2 * (2**(e-1) + 2**(e-2)))\n            //     ≤ 2**(2*e-4) / (3 * 2**(e-1))\n            //     ≤ 2**(e-3) / 3\n            //     ≤ 2**(e-3-log2(3))\n            //     ≤ 2**(e-4.5)\n            //\n            // For the following iterations, we use the fact that, 2**(e-1) ≤ sqrt(a) ≤ x_n:\n            // ε_{n+1} = ε_n² / | (2 * x_n) |\n            //         ≤ (2**(e-k))² / (2 * 2**(e-1))\n            //         ≤ 2**(2*e-2*k) / 2**e\n            //         ≤ 2**(e-2*k)\n            xn = (xn + a / xn) >> 1; // ε_1 := | x_1 - sqrt(a) | ≤ 2**(e-4.5)  -- special case, see above\n            xn = (xn + a / xn) >> 1; // ε_2 := | x_2 - sqrt(a) | ≤ 2**(e-9)    -- general case with k = 4.5\n            xn = (xn + a / xn) >> 1; // ε_3 := | x_3 - sqrt(a) | ≤ 2**(e-18)   -- general case with k = 9\n            xn = (xn + a / xn) >> 1; // ε_4 := | x_4 - sqrt(a) | ≤ 2**(e-36)   -- general case with k = 18\n            xn = (xn + a / xn) >> 1; // ε_5 := | x_5 - sqrt(a) | ≤ 2**(e-72)   -- general case with k = 36\n            xn = (xn + a / xn) >> 1; // ε_6 := | x_6 - sqrt(a) | ≤ 2**(e-144)  -- general case with k = 72\n\n            // Because e ≤ 128 (as discussed during the first estimation phase), we know have reached a precision\n            // ε_6 ≤ 2**(e-144) < 1. Given we're operating on integers, then we can ensure that xn is now either\n            // sqrt(a) or sqrt(a) + 1.\n            return xn - SafeCast.toUint(xn > a / xn);\n        }\n    }\n\n    /**\n     * @dev Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && result * result < a);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        uint256 exp;\n        unchecked {\n            exp = 128 * SafeCast.toUint(value > (1 << 128) - 1);\n            value >>= exp;\n            result += exp;\n\n            exp = 64 * SafeCast.toUint(value > (1 << 64) - 1);\n            value >>= exp;\n            result += exp;\n\n            exp = 32 * SafeCast.toUint(value > (1 << 32) - 1);\n            value >>= exp;\n            result += exp;\n\n            exp = 16 * SafeCast.toUint(value > (1 << 16) - 1);\n            value >>= exp;\n            result += exp;\n\n            exp = 8 * SafeCast.toUint(value > (1 << 8) - 1);\n            value >>= exp;\n            result += exp;\n\n            exp = 4 * SafeCast.toUint(value > (1 << 4) - 1);\n            value >>= exp;\n            result += exp;\n\n            exp = 2 * SafeCast.toUint(value > (1 << 2) - 1);\n            value >>= exp;\n            result += exp;\n\n            result += SafeCast.toUint(value > 1);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 10 ** result < value);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256 of a positive value rounded towards zero.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        uint256 isGt;\n        unchecked {\n            isGt = SafeCast.toUint(value > (1 << 128) - 1);\n            value >>= isGt * 128;\n            result += isGt * 16;\n\n            isGt = SafeCast.toUint(value > (1 << 64) - 1);\n            value >>= isGt * 64;\n            result += isGt * 8;\n\n            isGt = SafeCast.toUint(value > (1 << 32) - 1);\n            value >>= isGt * 32;\n            result += isGt * 4;\n\n            isGt = SafeCast.toUint(value > (1 << 16) - 1);\n            value >>= isGt * 16;\n            result += isGt * 2;\n\n            result += SafeCast.toUint(value > (1 << 8) - 1);\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + SafeCast.toUint(unsignedRoundsUp(rounding) && 1 << (result << 3) < value);\n        }\n    }\n\n    /**\n     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n     */\n    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n        return uint8(rounding) % 2 == 1;\n    }\n}\n"},"@openzeppelin/contracts/token/ERC721/ERC721.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721} from \"./IERC721.sol\";\nimport {IERC721Metadata} from \"./extensions/IERC721Metadata.sol\";\nimport {ERC721Utils} from \"./utils/ERC721Utils.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {Strings} from \"../../utils/Strings.sol\";\nimport {IERC165, ERC165} from \"../../utils/introspection/ERC165.sol\";\nimport {IERC721Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC-721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\nabstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {\n    using Strings for uint256;\n\n    // Token name\n    string private _name;\n\n    // Token symbol\n    string private _symbol;\n\n    mapping(uint256 tokenId => address) private _owners;\n\n    mapping(address owner => uint256) private _balances;\n\n    mapping(uint256 tokenId => address) private _tokenApprovals;\n\n    mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;\n\n    /**\n     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n     */\n    constructor(string memory name_, string memory symbol_) {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n        return\n            interfaceId == type(IERC721).interfaceId ||\n            interfaceId == type(IERC721Metadata).interfaceId ||\n            super.supportsInterface(interfaceId);\n    }\n\n    /**\n     * @dev See {IERC721-balanceOf}.\n     */\n    function balanceOf(address owner) public view virtual returns (uint256) {\n        if (owner == address(0)) {\n            revert ERC721InvalidOwner(address(0));\n        }\n        return _balances[owner];\n    }\n\n    /**\n     * @dev See {IERC721-ownerOf}.\n     */\n    function ownerOf(uint256 tokenId) public view virtual returns (address) {\n        return _requireOwned(tokenId);\n    }\n\n    /**\n     * @dev See {IERC721Metadata-name}.\n     */\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev See {IERC721Metadata-symbol}.\n     */\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev See {IERC721Metadata-tokenURI}.\n     */\n    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {\n        _requireOwned(tokenId);\n\n        string memory baseURI = _baseURI();\n        return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : \"\";\n    }\n\n    /**\n     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n     * by default, can be overridden in child contracts.\n     */\n    function _baseURI() internal view virtual returns (string memory) {\n        return \"\";\n    }\n\n    /**\n     * @dev See {IERC721-approve}.\n     */\n    function approve(address to, uint256 tokenId) public virtual {\n        _approve(to, tokenId, _msgSender());\n    }\n\n    /**\n     * @dev See {IERC721-getApproved}.\n     */\n    function getApproved(uint256 tokenId) public view virtual returns (address) {\n        _requireOwned(tokenId);\n\n        return _getApproved(tokenId);\n    }\n\n    /**\n     * @dev See {IERC721-setApprovalForAll}.\n     */\n    function setApprovalForAll(address operator, bool approved) public virtual {\n        _setApprovalForAll(_msgSender(), operator, approved);\n    }\n\n    /**\n     * @dev See {IERC721-isApprovedForAll}.\n     */\n    function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {\n        return _operatorApprovals[owner][operator];\n    }\n\n    /**\n     * @dev See {IERC721-transferFrom}.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) public virtual {\n        if (to == address(0)) {\n            revert ERC721InvalidReceiver(address(0));\n        }\n        // Setting an \"auth\" arguments enables the `_isAuthorized` check which verifies that the token exists\n        // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.\n        address previousOwner = _update(to, tokenId, _msgSender());\n        if (previousOwner != from) {\n            revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n        }\n    }\n\n    /**\n     * @dev See {IERC721-safeTransferFrom}.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) public {\n        safeTransferFrom(from, to, tokenId, \"\");\n    }\n\n    /**\n     * @dev See {IERC721-safeTransferFrom}.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {\n        transferFrom(from, to, tokenId);\n        ERC721Utils.checkOnERC721Received(_msgSender(), from, to, tokenId, data);\n    }\n\n    /**\n     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n     *\n     * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the\n     * core ERC-721 logic MUST be matched with the use of {_increaseBalance} to keep balances\n     * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by\n     * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.\n     */\n    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n        return _owners[tokenId];\n    }\n\n    /**\n     * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.\n     */\n    function _getApproved(uint256 tokenId) internal view virtual returns (address) {\n        return _tokenApprovals[tokenId];\n    }\n\n    /**\n     * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in\n     * particular (ignoring whether it is owned by `owner`).\n     *\n     * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n     * assumption.\n     */\n    function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {\n        return\n            spender != address(0) &&\n            (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);\n    }\n\n    /**\n     * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.\n     * Reverts if:\n     * - `spender` does not have approval from `owner` for `tokenId`.\n     * - `spender` does not have approval to manage all of `owner`'s assets.\n     *\n     * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\n     * assumption.\n     */\n    function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {\n        if (!_isAuthorized(owner, spender, tokenId)) {\n            if (owner == address(0)) {\n                revert ERC721NonexistentToken(tokenId);\n            } else {\n                revert ERC721InsufficientApproval(spender, tokenId);\n            }\n        }\n    }\n\n    /**\n     * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n     *\n     * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that\n     * a uint256 would ever overflow from increments when these increments are bounded to uint128 values.\n     *\n     * WARNING: Increasing an account's balance using this function tends to be paired with an override of the\n     * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership\n     * remain consistent with one another.\n     */\n    function _increaseBalance(address account, uint128 value) internal virtual {\n        unchecked {\n            _balances[account] += value;\n        }\n    }\n\n    /**\n     * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner\n     * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.\n     *\n     * The `auth` argument is optional. If the value passed is non 0, then this function will check that\n     * `auth` is either the owner of the token, or approved to operate on the token (by the owner).\n     *\n     * Emits a {Transfer} event.\n     *\n     * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.\n     */\n    function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {\n        address from = _ownerOf(tokenId);\n\n        // Perform (optional) operator check\n        if (auth != address(0)) {\n            _checkAuthorized(from, auth, tokenId);\n        }\n\n        // Execute the update\n        if (from != address(0)) {\n            // Clear approval. No need to re-authorize or emit the Approval event\n            _approve(address(0), tokenId, address(0), false);\n\n            unchecked {\n                _balances[from] -= 1;\n            }\n        }\n\n        if (to != address(0)) {\n            unchecked {\n                _balances[to] += 1;\n            }\n        }\n\n        _owners[tokenId] = to;\n\n        emit Transfer(from, to, tokenId);\n\n        return from;\n    }\n\n    /**\n     * @dev Mints `tokenId` and transfers it to `to`.\n     *\n     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n     *\n     * Requirements:\n     *\n     * - `tokenId` must not exist.\n     * - `to` cannot be the zero address.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _mint(address to, uint256 tokenId) internal {\n        if (to == address(0)) {\n            revert ERC721InvalidReceiver(address(0));\n        }\n        address previousOwner = _update(to, tokenId, address(0));\n        if (previousOwner != address(0)) {\n            revert ERC721InvalidSender(address(0));\n        }\n    }\n\n    /**\n     * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must not exist.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeMint(address to, uint256 tokenId) internal {\n        _safeMint(to, tokenId, \"\");\n    }\n\n    /**\n     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n     */\n    function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\n        _mint(to, tokenId);\n        ERC721Utils.checkOnERC721Received(_msgSender(), address(0), to, tokenId, data);\n    }\n\n    /**\n     * @dev Destroys `tokenId`.\n     * The approval is cleared when the token is burned.\n     * This is an internal function that does not check if the sender is authorized to operate on the token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _burn(uint256 tokenId) internal {\n        address previousOwner = _update(address(0), tokenId, address(0));\n        if (previousOwner == address(0)) {\n            revert ERC721NonexistentToken(tokenId);\n        }\n    }\n\n    /**\n     * @dev Transfers `tokenId` from `from` to `to`.\n     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _transfer(address from, address to, uint256 tokenId) internal {\n        if (to == address(0)) {\n            revert ERC721InvalidReceiver(address(0));\n        }\n        address previousOwner = _update(to, tokenId, address(0));\n        if (previousOwner == address(0)) {\n            revert ERC721NonexistentToken(tokenId);\n        } else if (previousOwner != from) {\n            revert ERC721IncorrectOwner(from, tokenId, previousOwner);\n        }\n    }\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients\n     * are aware of the ERC-721 standard to prevent tokens from being forever locked.\n     *\n     * `data` is additional data, it has no specified format and it is sent in call to `to`.\n     *\n     * This internal function is like {safeTransferFrom} in the sense that it invokes\n     * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.\n     * implement alternative mechanisms to perform token transfer, such as signature-based.\n     *\n     * Requirements:\n     *\n     * - `tokenId` token must exist and be owned by `from`.\n     * - `to` cannot be the zero address.\n     * - `from` cannot be the zero address.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeTransfer(address from, address to, uint256 tokenId) internal {\n        _safeTransfer(from, to, tokenId, \"\");\n    }\n\n    /**\n     * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n     */\n    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\n        _transfer(from, to, tokenId);\n        ERC721Utils.checkOnERC721Received(_msgSender(), from, to, tokenId, data);\n    }\n\n    /**\n     * @dev Approve `to` to operate on `tokenId`\n     *\n     * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is\n     * either the owner of the token, or approved to operate on all tokens held by this owner.\n     *\n     * Emits an {Approval} event.\n     *\n     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n     */\n    function _approve(address to, uint256 tokenId, address auth) internal {\n        _approve(to, tokenId, auth, true);\n    }\n\n    /**\n     * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not\n     * emitted in the context of transfers.\n     */\n    function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {\n        // Avoid reading the owner unless necessary\n        if (emitEvent || auth != address(0)) {\n            address owner = _requireOwned(tokenId);\n\n            // We do not use _isAuthorized because single-token approvals should not be able to call approve\n            if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {\n                revert ERC721InvalidApprover(auth);\n            }\n\n            if (emitEvent) {\n                emit Approval(owner, to, tokenId);\n            }\n        }\n\n        _tokenApprovals[tokenId] = to;\n    }\n\n    /**\n     * @dev Approve `operator` to operate on all of `owner` tokens\n     *\n     * Requirements:\n     * - operator can't be the address zero.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n        if (operator == address(0)) {\n            revert ERC721InvalidOperator(operator);\n        }\n        _operatorApprovals[owner][operator] = approved;\n        emit ApprovalForAll(owner, operator, approved);\n    }\n\n    /**\n     * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).\n     * Returns the owner.\n     *\n     * Overrides to ownership logic should be done to {_ownerOf}.\n     */\n    function _requireOwned(uint256 tokenId) internal view returns (address) {\n        address owner = _ownerOf(tokenId);\n        if (owner == address(0)) {\n            revert ERC721NonexistentToken(tokenId);\n        }\n        return owner;\n    }\n}\n"},"@openzeppelin/contracts/utils/math/SafeCast.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeCast {\n    /**\n     * @dev Value doesn't fit in an uint of `bits` size.\n     */\n    error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);\n\n    /**\n     * @dev An int value doesn't fit in an uint of `bits` size.\n     */\n    error SafeCastOverflowedIntToUint(int256 value);\n\n    /**\n     * @dev Value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);\n\n    /**\n     * @dev An uint value doesn't fit in an int of `bits` size.\n     */\n    error SafeCastOverflowedUintToInt(uint256 value);\n\n    /**\n     * @dev Returns the downcasted uint248 from uint256, reverting on\n     * overflow (when the input is greater than largest uint248).\n     *\n     * Counterpart to Solidity's `uint248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toUint248(uint256 value) internal pure returns (uint248) {\n        if (value > type(uint248).max) {\n            revert SafeCastOverflowedUintDowncast(248, value);\n        }\n        return uint248(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint240 from uint256, reverting on\n     * overflow (when the input is greater than largest uint240).\n     *\n     * Counterpart to Solidity's `uint240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toUint240(uint256 value) internal pure returns (uint240) {\n        if (value > type(uint240).max) {\n            revert SafeCastOverflowedUintDowncast(240, value);\n        }\n        return uint240(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint232 from uint256, reverting on\n     * overflow (when the input is greater than largest uint232).\n     *\n     * Counterpart to Solidity's `uint232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toUint232(uint256 value) internal pure returns (uint232) {\n        if (value > type(uint232).max) {\n            revert SafeCastOverflowedUintDowncast(232, value);\n        }\n        return uint232(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint224 from uint256, reverting on\n     * overflow (when the input is greater than largest uint224).\n     *\n     * Counterpart to Solidity's `uint224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toUint224(uint256 value) internal pure returns (uint224) {\n        if (value > type(uint224).max) {\n            revert SafeCastOverflowedUintDowncast(224, value);\n        }\n        return uint224(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint216 from uint256, reverting on\n     * overflow (when the input is greater than largest uint216).\n     *\n     * Counterpart to Solidity's `uint216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toUint216(uint256 value) internal pure returns (uint216) {\n        if (value > type(uint216).max) {\n            revert SafeCastOverflowedUintDowncast(216, value);\n        }\n        return uint216(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint208 from uint256, reverting on\n     * overflow (when the input is greater than largest uint208).\n     *\n     * Counterpart to Solidity's `uint208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toUint208(uint256 value) internal pure returns (uint208) {\n        if (value > type(uint208).max) {\n            revert SafeCastOverflowedUintDowncast(208, value);\n        }\n        return uint208(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint200 from uint256, reverting on\n     * overflow (when the input is greater than largest uint200).\n     *\n     * Counterpart to Solidity's `uint200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toUint200(uint256 value) internal pure returns (uint200) {\n        if (value > type(uint200).max) {\n            revert SafeCastOverflowedUintDowncast(200, value);\n        }\n        return uint200(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint192 from uint256, reverting on\n     * overflow (when the input is greater than largest uint192).\n     *\n     * Counterpart to Solidity's `uint192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toUint192(uint256 value) internal pure returns (uint192) {\n        if (value > type(uint192).max) {\n            revert SafeCastOverflowedUintDowncast(192, value);\n        }\n        return uint192(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint184 from uint256, reverting on\n     * overflow (when the input is greater than largest uint184).\n     *\n     * Counterpart to Solidity's `uint184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toUint184(uint256 value) internal pure returns (uint184) {\n        if (value > type(uint184).max) {\n            revert SafeCastOverflowedUintDowncast(184, value);\n        }\n        return uint184(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint176 from uint256, reverting on\n     * overflow (when the input is greater than largest uint176).\n     *\n     * Counterpart to Solidity's `uint176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toUint176(uint256 value) internal pure returns (uint176) {\n        if (value > type(uint176).max) {\n            revert SafeCastOverflowedUintDowncast(176, value);\n        }\n        return uint176(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint168 from uint256, reverting on\n     * overflow (when the input is greater than largest uint168).\n     *\n     * Counterpart to Solidity's `uint168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toUint168(uint256 value) internal pure returns (uint168) {\n        if (value > type(uint168).max) {\n            revert SafeCastOverflowedUintDowncast(168, value);\n        }\n        return uint168(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint160 from uint256, reverting on\n     * overflow (when the input is greater than largest uint160).\n     *\n     * Counterpart to Solidity's `uint160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toUint160(uint256 value) internal pure returns (uint160) {\n        if (value > type(uint160).max) {\n            revert SafeCastOverflowedUintDowncast(160, value);\n        }\n        return uint160(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint152 from uint256, reverting on\n     * overflow (when the input is greater than largest uint152).\n     *\n     * Counterpart to Solidity's `uint152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toUint152(uint256 value) internal pure returns (uint152) {\n        if (value > type(uint152).max) {\n            revert SafeCastOverflowedUintDowncast(152, value);\n        }\n        return uint152(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint144 from uint256, reverting on\n     * overflow (when the input is greater than largest uint144).\n     *\n     * Counterpart to Solidity's `uint144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toUint144(uint256 value) internal pure returns (uint144) {\n        if (value > type(uint144).max) {\n            revert SafeCastOverflowedUintDowncast(144, value);\n        }\n        return uint144(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint136 from uint256, reverting on\n     * overflow (when the input is greater than largest uint136).\n     *\n     * Counterpart to Solidity's `uint136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toUint136(uint256 value) internal pure returns (uint136) {\n        if (value > type(uint136).max) {\n            revert SafeCastOverflowedUintDowncast(136, value);\n        }\n        return uint136(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint128 from uint256, reverting on\n     * overflow (when the input is greater than largest uint128).\n     *\n     * Counterpart to Solidity's `uint128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toUint128(uint256 value) internal pure returns (uint128) {\n        if (value > type(uint128).max) {\n            revert SafeCastOverflowedUintDowncast(128, value);\n        }\n        return uint128(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint120 from uint256, reverting on\n     * overflow (when the input is greater than largest uint120).\n     *\n     * Counterpart to Solidity's `uint120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toUint120(uint256 value) internal pure returns (uint120) {\n        if (value > type(uint120).max) {\n            revert SafeCastOverflowedUintDowncast(120, value);\n        }\n        return uint120(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint112 from uint256, reverting on\n     * overflow (when the input is greater than largest uint112).\n     *\n     * Counterpart to Solidity's `uint112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toUint112(uint256 value) internal pure returns (uint112) {\n        if (value > type(uint112).max) {\n            revert SafeCastOverflowedUintDowncast(112, value);\n        }\n        return uint112(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint104 from uint256, reverting on\n     * overflow (when the input is greater than largest uint104).\n     *\n     * Counterpart to Solidity's `uint104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toUint104(uint256 value) internal pure returns (uint104) {\n        if (value > type(uint104).max) {\n            revert SafeCastOverflowedUintDowncast(104, value);\n        }\n        return uint104(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint96 from uint256, reverting on\n     * overflow (when the input is greater than largest uint96).\n     *\n     * Counterpart to Solidity's `uint96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toUint96(uint256 value) internal pure returns (uint96) {\n        if (value > type(uint96).max) {\n            revert SafeCastOverflowedUintDowncast(96, value);\n        }\n        return uint96(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint88 from uint256, reverting on\n     * overflow (when the input is greater than largest uint88).\n     *\n     * Counterpart to Solidity's `uint88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toUint88(uint256 value) internal pure returns (uint88) {\n        if (value > type(uint88).max) {\n            revert SafeCastOverflowedUintDowncast(88, value);\n        }\n        return uint88(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint80 from uint256, reverting on\n     * overflow (when the input is greater than largest uint80).\n     *\n     * Counterpart to Solidity's `uint80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toUint80(uint256 value) internal pure returns (uint80) {\n        if (value > type(uint80).max) {\n            revert SafeCastOverflowedUintDowncast(80, value);\n        }\n        return uint80(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint72 from uint256, reverting on\n     * overflow (when the input is greater than largest uint72).\n     *\n     * Counterpart to Solidity's `uint72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toUint72(uint256 value) internal pure returns (uint72) {\n        if (value > type(uint72).max) {\n            revert SafeCastOverflowedUintDowncast(72, value);\n        }\n        return uint72(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint64 from uint256, reverting on\n     * overflow (when the input is greater than largest uint64).\n     *\n     * Counterpart to Solidity's `uint64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toUint64(uint256 value) internal pure returns (uint64) {\n        if (value > type(uint64).max) {\n            revert SafeCastOverflowedUintDowncast(64, value);\n        }\n        return uint64(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint56 from uint256, reverting on\n     * overflow (when the input is greater than largest uint56).\n     *\n     * Counterpart to Solidity's `uint56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toUint56(uint256 value) internal pure returns (uint56) {\n        if (value > type(uint56).max) {\n            revert SafeCastOverflowedUintDowncast(56, value);\n        }\n        return uint56(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint48 from uint256, reverting on\n     * overflow (when the input is greater than largest uint48).\n     *\n     * Counterpart to Solidity's `uint48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toUint48(uint256 value) internal pure returns (uint48) {\n        if (value > type(uint48).max) {\n            revert SafeCastOverflowedUintDowncast(48, value);\n        }\n        return uint48(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint40 from uint256, reverting on\n     * overflow (when the input is greater than largest uint40).\n     *\n     * Counterpart to Solidity's `uint40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toUint40(uint256 value) internal pure returns (uint40) {\n        if (value > type(uint40).max) {\n            revert SafeCastOverflowedUintDowncast(40, value);\n        }\n        return uint40(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint32 from uint256, reverting on\n     * overflow (when the input is greater than largest uint32).\n     *\n     * Counterpart to Solidity's `uint32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toUint32(uint256 value) internal pure returns (uint32) {\n        if (value > type(uint32).max) {\n            revert SafeCastOverflowedUintDowncast(32, value);\n        }\n        return uint32(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint24 from uint256, reverting on\n     * overflow (when the input is greater than largest uint24).\n     *\n     * Counterpart to Solidity's `uint24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toUint24(uint256 value) internal pure returns (uint24) {\n        if (value > type(uint24).max) {\n            revert SafeCastOverflowedUintDowncast(24, value);\n        }\n        return uint24(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint16 from uint256, reverting on\n     * overflow (when the input is greater than largest uint16).\n     *\n     * Counterpart to Solidity's `uint16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toUint16(uint256 value) internal pure returns (uint16) {\n        if (value > type(uint16).max) {\n            revert SafeCastOverflowedUintDowncast(16, value);\n        }\n        return uint16(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint8 from uint256, reverting on\n     * overflow (when the input is greater than largest uint8).\n     *\n     * Counterpart to Solidity's `uint8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toUint8(uint256 value) internal pure returns (uint8) {\n        if (value > type(uint8).max) {\n            revert SafeCastOverflowedUintDowncast(8, value);\n        }\n        return uint8(value);\n    }\n\n    /**\n     * @dev Converts a signed int256 into an unsigned uint256.\n     *\n     * Requirements:\n     *\n     * - input must be greater than or equal to 0.\n     */\n    function toUint256(int256 value) internal pure returns (uint256) {\n        if (value < 0) {\n            revert SafeCastOverflowedIntToUint(value);\n        }\n        return uint256(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int248 from int256, reverting on\n     * overflow (when the input is less than smallest int248 or\n     * greater than largest int248).\n     *\n     * Counterpart to Solidity's `int248` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 248 bits\n     */\n    function toInt248(int256 value) internal pure returns (int248 downcasted) {\n        downcasted = int248(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(248, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int240 from int256, reverting on\n     * overflow (when the input is less than smallest int240 or\n     * greater than largest int240).\n     *\n     * Counterpart to Solidity's `int240` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 240 bits\n     */\n    function toInt240(int256 value) internal pure returns (int240 downcasted) {\n        downcasted = int240(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(240, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int232 from int256, reverting on\n     * overflow (when the input is less than smallest int232 or\n     * greater than largest int232).\n     *\n     * Counterpart to Solidity's `int232` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 232 bits\n     */\n    function toInt232(int256 value) internal pure returns (int232 downcasted) {\n        downcasted = int232(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(232, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int224 from int256, reverting on\n     * overflow (when the input is less than smallest int224 or\n     * greater than largest int224).\n     *\n     * Counterpart to Solidity's `int224` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 224 bits\n     */\n    function toInt224(int256 value) internal pure returns (int224 downcasted) {\n        downcasted = int224(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(224, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int216 from int256, reverting on\n     * overflow (when the input is less than smallest int216 or\n     * greater than largest int216).\n     *\n     * Counterpart to Solidity's `int216` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 216 bits\n     */\n    function toInt216(int256 value) internal pure returns (int216 downcasted) {\n        downcasted = int216(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(216, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int208 from int256, reverting on\n     * overflow (when the input is less than smallest int208 or\n     * greater than largest int208).\n     *\n     * Counterpart to Solidity's `int208` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 208 bits\n     */\n    function toInt208(int256 value) internal pure returns (int208 downcasted) {\n        downcasted = int208(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(208, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int200 from int256, reverting on\n     * overflow (when the input is less than smallest int200 or\n     * greater than largest int200).\n     *\n     * Counterpart to Solidity's `int200` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 200 bits\n     */\n    function toInt200(int256 value) internal pure returns (int200 downcasted) {\n        downcasted = int200(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(200, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int192 from int256, reverting on\n     * overflow (when the input is less than smallest int192 or\n     * greater than largest int192).\n     *\n     * Counterpart to Solidity's `int192` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 192 bits\n     */\n    function toInt192(int256 value) internal pure returns (int192 downcasted) {\n        downcasted = int192(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(192, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int184 from int256, reverting on\n     * overflow (when the input is less than smallest int184 or\n     * greater than largest int184).\n     *\n     * Counterpart to Solidity's `int184` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 184 bits\n     */\n    function toInt184(int256 value) internal pure returns (int184 downcasted) {\n        downcasted = int184(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(184, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int176 from int256, reverting on\n     * overflow (when the input is less than smallest int176 or\n     * greater than largest int176).\n     *\n     * Counterpart to Solidity's `int176` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 176 bits\n     */\n    function toInt176(int256 value) internal pure returns (int176 downcasted) {\n        downcasted = int176(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(176, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int168 from int256, reverting on\n     * overflow (when the input is less than smallest int168 or\n     * greater than largest int168).\n     *\n     * Counterpart to Solidity's `int168` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 168 bits\n     */\n    function toInt168(int256 value) internal pure returns (int168 downcasted) {\n        downcasted = int168(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(168, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int160 from int256, reverting on\n     * overflow (when the input is less than smallest int160 or\n     * greater than largest int160).\n     *\n     * Counterpart to Solidity's `int160` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 160 bits\n     */\n    function toInt160(int256 value) internal pure returns (int160 downcasted) {\n        downcasted = int160(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(160, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int152 from int256, reverting on\n     * overflow (when the input is less than smallest int152 or\n     * greater than largest int152).\n     *\n     * Counterpart to Solidity's `int152` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 152 bits\n     */\n    function toInt152(int256 value) internal pure returns (int152 downcasted) {\n        downcasted = int152(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(152, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int144 from int256, reverting on\n     * overflow (when the input is less than smallest int144 or\n     * greater than largest int144).\n     *\n     * Counterpart to Solidity's `int144` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 144 bits\n     */\n    function toInt144(int256 value) internal pure returns (int144 downcasted) {\n        downcasted = int144(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(144, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int136 from int256, reverting on\n     * overflow (when the input is less than smallest int136 or\n     * greater than largest int136).\n     *\n     * Counterpart to Solidity's `int136` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 136 bits\n     */\n    function toInt136(int256 value) internal pure returns (int136 downcasted) {\n        downcasted = int136(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(136, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int128 from int256, reverting on\n     * overflow (when the input is less than smallest int128 or\n     * greater than largest int128).\n     *\n     * Counterpart to Solidity's `int128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toInt128(int256 value) internal pure returns (int128 downcasted) {\n        downcasted = int128(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(128, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int120 from int256, reverting on\n     * overflow (when the input is less than smallest int120 or\n     * greater than largest int120).\n     *\n     * Counterpart to Solidity's `int120` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 120 bits\n     */\n    function toInt120(int256 value) internal pure returns (int120 downcasted) {\n        downcasted = int120(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(120, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int112 from int256, reverting on\n     * overflow (when the input is less than smallest int112 or\n     * greater than largest int112).\n     *\n     * Counterpart to Solidity's `int112` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 112 bits\n     */\n    function toInt112(int256 value) internal pure returns (int112 downcasted) {\n        downcasted = int112(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(112, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int104 from int256, reverting on\n     * overflow (when the input is less than smallest int104 or\n     * greater than largest int104).\n     *\n     * Counterpart to Solidity's `int104` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 104 bits\n     */\n    function toInt104(int256 value) internal pure returns (int104 downcasted) {\n        downcasted = int104(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(104, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int96 from int256, reverting on\n     * overflow (when the input is less than smallest int96 or\n     * greater than largest int96).\n     *\n     * Counterpart to Solidity's `int96` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 96 bits\n     */\n    function toInt96(int256 value) internal pure returns (int96 downcasted) {\n        downcasted = int96(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(96, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int88 from int256, reverting on\n     * overflow (when the input is less than smallest int88 or\n     * greater than largest int88).\n     *\n     * Counterpart to Solidity's `int88` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 88 bits\n     */\n    function toInt88(int256 value) internal pure returns (int88 downcasted) {\n        downcasted = int88(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(88, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int80 from int256, reverting on\n     * overflow (when the input is less than smallest int80 or\n     * greater than largest int80).\n     *\n     * Counterpart to Solidity's `int80` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 80 bits\n     */\n    function toInt80(int256 value) internal pure returns (int80 downcasted) {\n        downcasted = int80(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(80, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int72 from int256, reverting on\n     * overflow (when the input is less than smallest int72 or\n     * greater than largest int72).\n     *\n     * Counterpart to Solidity's `int72` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 72 bits\n     */\n    function toInt72(int256 value) internal pure returns (int72 downcasted) {\n        downcasted = int72(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(72, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int64 from int256, reverting on\n     * overflow (when the input is less than smallest int64 or\n     * greater than largest int64).\n     *\n     * Counterpart to Solidity's `int64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toInt64(int256 value) internal pure returns (int64 downcasted) {\n        downcasted = int64(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(64, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int56 from int256, reverting on\n     * overflow (when the input is less than smallest int56 or\n     * greater than largest int56).\n     *\n     * Counterpart to Solidity's `int56` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 56 bits\n     */\n    function toInt56(int256 value) internal pure returns (int56 downcasted) {\n        downcasted = int56(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(56, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int48 from int256, reverting on\n     * overflow (when the input is less than smallest int48 or\n     * greater than largest int48).\n     *\n     * Counterpart to Solidity's `int48` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 48 bits\n     */\n    function toInt48(int256 value) internal pure returns (int48 downcasted) {\n        downcasted = int48(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(48, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int40 from int256, reverting on\n     * overflow (when the input is less than smallest int40 or\n     * greater than largest int40).\n     *\n     * Counterpart to Solidity's `int40` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 40 bits\n     */\n    function toInt40(int256 value) internal pure returns (int40 downcasted) {\n        downcasted = int40(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(40, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int32 from int256, reverting on\n     * overflow (when the input is less than smallest int32 or\n     * greater than largest int32).\n     *\n     * Counterpart to Solidity's `int32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toInt32(int256 value) internal pure returns (int32 downcasted) {\n        downcasted = int32(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(32, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int24 from int256, reverting on\n     * overflow (when the input is less than smallest int24 or\n     * greater than largest int24).\n     *\n     * Counterpart to Solidity's `int24` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 24 bits\n     */\n    function toInt24(int256 value) internal pure returns (int24 downcasted) {\n        downcasted = int24(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(24, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int16 from int256, reverting on\n     * overflow (when the input is less than smallest int16 or\n     * greater than largest int16).\n     *\n     * Counterpart to Solidity's `int16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toInt16(int256 value) internal pure returns (int16 downcasted) {\n        downcasted = int16(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(16, value);\n        }\n    }\n\n    /**\n     * @dev Returns the downcasted int8 from int256, reverting on\n     * overflow (when the input is less than smallest int8 or\n     * greater than largest int8).\n     *\n     * Counterpart to Solidity's `int8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits\n     */\n    function toInt8(int256 value) internal pure returns (int8 downcasted) {\n        downcasted = int8(value);\n        if (downcasted != value) {\n            revert SafeCastOverflowedIntDowncast(8, value);\n        }\n    }\n\n    /**\n     * @dev Converts an unsigned uint256 into a signed int256.\n     *\n     * Requirements:\n     *\n     * - input must be less than or equal to maxInt256.\n     */\n    function toInt256(uint256 value) internal pure returns (int256) {\n        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n        if (value > uint256(type(int256).max)) {\n            revert SafeCastOverflowedUintToInt(value);\n        }\n        return int256(value);\n    }\n\n    /**\n     * @dev Cast a boolean (false or true) to a uint256 (0 or 1) with no jump.\n     */\n    function toUint(bool b) internal pure returns (uint256 u) {\n        assembly (\"memory-safe\") {\n            u := iszero(iszero(b))\n        }\n    }\n}\n"},"@openzeppelin/contracts/token/ERC721/IERC721.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC-721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n    /**\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n     */\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n     */\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n    /**\n     * @dev Returns the number of tokens in ``owner``'s account.\n     */\n    function balanceOf(address owner) external view returns (uint256 balance);\n\n    /**\n     * @dev Returns the owner of the `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function ownerOf(uint256 tokenId) external view returns (address owner);\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n     *   a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n     * are aware of the ERC-721 protocol to prevent tokens from being forever locked.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or\n     *   {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n     *   a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Transfers `tokenId` token from `from` to `to`.\n     *\n     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC-721\n     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n     * understand this adds an external call which potentially creates a reentrancy vulnerability.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n     * The approval is cleared when the token is transferred.\n     *\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n     *\n     * Requirements:\n     *\n     * - The caller must own the token or be an approved operator.\n     * - `tokenId` must exist.\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address to, uint256 tokenId) external;\n\n    /**\n     * @dev Approve or remove `operator` as an operator for the caller.\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n     *\n     * Requirements:\n     *\n     * - The `operator` cannot be the address zero.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function setApprovalForAll(address operator, bool approved) external;\n\n    /**\n     * @dev Returns the account approved for `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function getApproved(uint256 tokenId) external view returns (address operator);\n\n    /**\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n     *\n     * See {setApprovalForAll}\n     */\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n"},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant NOT_ENTERED = 1;\n    uint256 private constant ENTERED = 2;\n\n    uint256 private _status;\n\n    /**\n     * @dev Unauthorized reentrant call.\n     */\n    error ReentrancyGuardReentrantCall();\n\n    constructor() {\n        _status = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        _nonReentrantBefore();\n        _;\n        _nonReentrantAfter();\n    }\n\n    function _nonReentrantBefore() private {\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\n        if (_status == ENTERED) {\n            revert ReentrancyGuardReentrantCall();\n        }\n\n        // Any calls to nonReentrant after this point will fail\n        _status = ENTERED;\n    }\n\n    function _nonReentrantAfter() private {\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _status = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n     * `nonReentrant` function in the call stack.\n     */\n    function _reentrancyGuardEntered() internal view returns (bool) {\n        return _status == ENTERED;\n    }\n}\n"},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n    /**\n     * @dev Branchless ternary evaluation for `a ? b : c`. Gas costs are constant.\n     *\n     * IMPORTANT: This function may reduce bytecode size and consume less gas when used standalone.\n     * However, the compiler may optimize Solidity ternary operations (i.e. `a ? b : c`) to only compute\n     * one branch when needed, making this function more expensive.\n     */\n    function ternary(bool condition, int256 a, int256 b) internal pure returns (int256) {\n        unchecked {\n            // branchless ternary works because:\n            // b ^ (a ^ b) == a\n            // b ^ 0 == b\n            return b ^ ((a ^ b) * int256(SafeCast.toUint(condition)));\n        }\n    }\n\n    /**\n     * @dev Returns the largest of two signed numbers.\n     */\n    function max(int256 a, int256 b) internal pure returns (int256) {\n        return ternary(a > b, a, b);\n    }\n\n    /**\n     * @dev Returns the smallest of two signed numbers.\n     */\n    function min(int256 a, int256 b) internal pure returns (int256) {\n        return ternary(a < b, a, b);\n    }\n\n    /**\n     * @dev Returns the average of two signed numbers without overflow.\n     * The result is rounded towards zero.\n     */\n    function average(int256 a, int256 b) internal pure returns (int256) {\n        // Formula from the book \"Hacker's Delight\"\n        int256 x = (a & b) + ((a ^ b) >> 1);\n        return x + (int256(uint256(x) >> 255) & (a ^ b));\n    }\n\n    /**\n     * @dev Returns the absolute unsigned value of a signed value.\n     */\n    function abs(int256 n) internal pure returns (uint256) {\n        unchecked {\n            // Formula from the \"Bit Twiddling Hacks\" by Sean Eron Anderson.\n            // Since `n` is a signed integer, the generated bytecode will use the SAR opcode to perform the right shift,\n            // taking advantage of the most significant (or \"sign\" bit) in two's complement representation.\n            // This opcode adds new most significant bits set to the value of the previous most significant bit. As a result,\n            // the mask will either be `bytes32(0)` (if n is positive) or `~bytes32(0)` (if n is negative).\n            int256 mask = n >> 255;\n\n            // A `bytes32(0)` mask leaves the input unchanged, while a `~bytes32(0)` mask complements it.\n            return uint256((n + mask) ^ mask);\n        }\n    }\n}\n"},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC20InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC20InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     * @param allowance Amount of tokens a `spender` is allowed to operate with.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC20InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n    /**\n     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n     * Used in balance queries.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721InvalidOwner(address owner);\n\n    /**\n     * @dev Indicates a `tokenId` whose `owner` is the zero address.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721NonexistentToken(uint256 tokenId);\n\n    /**\n     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param tokenId Identifier number of a token.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC721InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC721InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC721InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC1155InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC1155InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC1155MissingApprovalForAll(address operator, address owner);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC1155InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC1155InvalidOperator(address operator);\n\n    /**\n     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n     * Used in batch transfers.\n     * @param idsLength Length of the array of token identifiers\n     * @param valuesLength Length of the array of token amounts\n     */\n    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == type(IERC165).interfaceId;\n    }\n}\n"},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @title ERC-721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC-721 asset contracts.\n */\ninterface IERC721Receiver {\n    /**\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n     * by `operator` from `from`, this function is called.\n     *\n     * It must return its Solidity selector to confirm the token transfer.\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be\n     * reverted.\n     *\n     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n     */\n    function onERC721Received(\n        address operator,\n        address from,\n        uint256 tokenId,\n        bytes calldata data\n    ) external returns (bytes4);\n}\n"},"@openzeppelin/contracts/token/ERC721/utils/ERC721Utils.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/utils/ERC721Utils.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721Receiver} from \"../IERC721Receiver.sol\";\nimport {IERC721Errors} from \"../../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Library that provide common ERC-721 utility functions.\n *\n * See https://eips.ethereum.org/EIPS/eip-721[ERC-721].\n *\n * _Available since v5.1._\n */\nlibrary ERC721Utils {\n    /**\n     * @dev Performs an acceptance check for the provided `operator` by calling {IERC721-onERC721Received}\n     * on the `to` address. The `operator` is generally the address that initiated the token transfer (i.e. `msg.sender`).\n     *\n     * The acceptance call is not executed and treated as a no-op if the target address doesn't contain code (i.e. an EOA).\n     * Otherwise, the recipient must implement {IERC721Receiver-onERC721Received} and return the acceptance magic value to accept\n     * the transfer.\n     */\n    function checkOnERC721Received(\n        address operator,\n        address from,\n        address to,\n        uint256 tokenId,\n        bytes memory data\n    ) internal {\n        if (to.code.length > 0) {\n            try IERC721Receiver(to).onERC721Received(operator, from, tokenId, data) returns (bytes4 retval) {\n                if (retval != IERC721Receiver.onERC721Received.selector) {\n                    // Token rejected\n                    revert IERC721Errors.ERC721InvalidReceiver(to);\n                }\n            } catch (bytes memory reason) {\n                if (reason.length == 0) {\n                    // non-IERC721Receiver implementer\n                    revert IERC721Errors.ERC721InvalidReceiver(to);\n                } else {\n                    assembly (\"memory-safe\") {\n                        revert(add(32, reason), mload(reason))\n                    }\n                }\n            }\n        }\n    }\n}\n"},"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC721} from \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n    /**\n     * @dev Returns the token collection name.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the token collection symbol.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n     */\n    function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n"}},"language":"Solidity","settings":{"optimizer":{"runs":200,"enabled":true},"evmVersion":"shanghai"}},"stdJsonOutput":{"sources":{"AgentForgeMiner.sol":{"id":18},"AgentForgeRelic.sol":{"id":21},"@openzeppelin/contracts/utils/Panic.sol":{"id":9},"@openzeppelin/contracts/utils/Base64.sol":{"id":7},"@openzeppelin/contracts/utils/Context.sol":{"id":8},"@openzeppelin/contracts/utils/Strings.sol":{"id":11},"@openzeppelin/contracts/access/Ownable.sol":{"id":0},"@openzeppelin/contracts/utils/math/Math.sol":{"id":14},"@openzeppelin/contracts/token/ERC721/ERC721.sol":{"id":2},"@openzeppelin/contracts/utils/math/SafeCast.sol":{"id":15},"@openzeppelin/contracts/token/ERC721/IERC721.sol":{"id":3},"@openzeppelin/contracts/utils/ReentrancyGuard.sol":{"id":10},"@openzeppelin/contracts/utils/math/SignedMath.sol":{"id":16},"@openzeppelin/contracts/interfaces/draft-IERC6093.sol":{"id":1},"@openzeppelin/contracts/utils/introspection/ERC165.sol":{"id":12},"@openzeppelin/contracts/utils/introspection/IERC165.sol":{"id":13},"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol":{"id":4},"@openzeppelin/contracts/token/ERC721/utils/ERC721Utils.sol":{"id":6},"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol":{"id":5}},"contracts":{"AgentForgeRelic.sol":{"AgentForgeRelic":{"abi":[{"type":"constructor","inputs":[{"name":"relicArt","type":"address","internalType":"address"},{"name":"minerArt","type":"address","internalType":"address"},{"name":"proceeds","type":"address","internalType":"address payable"},{"name":"provenance","type":"bytes32","internalType":"bytes32"}],"stateMutability":"nonpayable"},{"name":"AlreadyRevealed","type":"error","inputs":[]},{"name":"ERC721IncorrectOwner","type":"error","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"owner","type":"address","internalType":"address"}]},{"name":"ERC721InsufficientApproval","type":"error","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"name":"ERC721InvalidApprover","type":"error","inputs":[{"name":"approver","type":"address","internalType":"address"}]},{"name":"ERC721InvalidOperator","type":"error","inputs":[{"name":"operator","type":"address","internalType":"address"}]},{"name":"ERC721InvalidOwner","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"name":"ERC721InvalidReceiver","type":"error","inputs":[{"name":"receiver","type":"address","internalType":"address"}]},{"name":"ERC721InvalidSender","type":"error","inputs":[{"name":"sender","type":"address","internalType":"address"}]},{"name":"ERC721NonexistentToken","type":"error","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}]},{"name":"MetadataLocked","type":"error","inputs":[]},{"name":"MintClosed","type":"error","inputs":[]},{"name":"NoToken","type":"error","inputs":[]},{"name":"NotAgent","type":"error","inputs":[]},{"name":"NotRevealed","type":"error","inputs":[]},{"name":"NotTokenOwner","type":"error","inputs":[]},{"name":"OnlyMiner","type":"error","inputs":[]},{"name":"OwnableInvalidOwner","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"name":"OwnableUnauthorizedAccount","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"name":"RevealTooEarly","type":"error","inputs":[]},{"name":"SoldOut","type":"error","inputs":[]},{"name":"WalletLimit","type":"error","inputs":[]},{"name":"WrongPayment","type":"error","inputs":[]},{"name":"ZeroQty","type":"error","inputs":[]},{"name":"Approval","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"ApprovalForAll","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"approved","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"ArtUpdated","type":"event","inputs":[{"name":"art","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"MintOpened","type":"event","inputs":[],"anonymous":false},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Revealed","type":"event","inputs":[{"name":"offset","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"by","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"Withdrawn","type":"event","inputs":[{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"AGENT_ID","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAgentID"}],"stateMutability":"view"},{"name":"DESIGNS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"FREE_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MAX_SUPPLY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"MINER","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract AgentForgeMiner"}],"stateMutability":"view"},{"name":"PER_ELEMENT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PRICE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"PROCEEDS","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address payable"}],"stateMutability":"view"},{"name":"PROVENANCE","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"PUBLIC_REVEAL_DELAY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"REVEAL_THRESHOLD","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"approve","type":"function","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"art","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IRelicArt"}],"stateMutability":"view"},{"name":"balanceOf","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"contractURI","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"elementOf","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"element","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"name":"forgeBurn","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"ids","type":"uint256[5]","internalType":"uint256[5]"}],"outputs":[{"name":"elements","type":"uint8[5]","internalType":"uint8[5]"}],"stateMutability":"nonpayable"},{"name":"getApproved","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isApprovedForAll","type":"function","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"metadataLocked","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"name":"mintOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mintedBy","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"openMint","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"ownerOf","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"quote","type":"function","inputs":[{"name":"wallet","type":"address","internalType":"address"},{"name":"qty","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"renounceOwnership","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"reveal","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"revealOffset","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"revealed","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"safeTransferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"safeTransferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setApprovalForAll","type":"function","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"approved","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setArt","type":"function","inputs":[{"name":"newArt","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"slotData","type":"function","inputs":[{"name":"slot","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"element","type":"uint8","internalType":"uint8"},{"name":"design","type":"uint16","internalType":"uint16"}],"stateMutability":"pure"},{"name":"slotOf","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"supportsInterface","type":"function","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"thresholdReachedAt","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"tokenURI","type":"function","inputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalBurned","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferFrom","type":"function","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transferNonce","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"withdraw","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"relicArt\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"minerArt\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"proceeds\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"provenance\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyRevealed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MetadataLocked\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintClosed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAgent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotRevealed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotTokenOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyMiner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RevealTooEarly\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SoldOut\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WalletLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongPayment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroQty\",\"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\":\"address\",\"name\":\"art\",\"type\":\"address\"}],\"name\":\"ArtUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"MintOpened\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"by\",\"type\":\"address\"}],\"name\":\"Revealed\",\"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\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"AGENT_ID\",\"outputs\":[{\"internalType\":\"contract IAgentID\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DESIGNS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FREE_PER_WALLET\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_PER_WALLET\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_SUPPLY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINER\",\"outputs\":[{\"internalType\":\"contract AgentForgeMiner\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PER_ELEMENT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PRICE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROCEEDS\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROVENANCE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PUBLIC_REVEAL_DELAY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REVEAL_THRESHOLD\",\"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\":[],\"name\":\"art\",\"outputs\":[{\"internalType\":\"contract IRelicArt\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"contractURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"elementOf\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"element\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256[5]\",\"name\":\"ids\",\"type\":\"uint256[5]\"}],\"name\":\"forgeBurn\",\"outputs\":[{\"internalType\":\"uint8[5]\",\"name\":\"elements\",\"type\":\"uint8[5]\"}],\"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\":\"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\":\"metadataLocked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"qty\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mintOpen\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"mintedBy\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"openMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"qty\",\"type\":\"uint256\"}],\"name\":\"quote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reveal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revealOffset\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revealed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"address\",\"name\":\"newArt\",\"type\":\"address\"}],\"name\":\"setArt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"slot\",\"type\":\"uint256\"}],\"name\":\"slotData\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"element\",\"type\":\"uint8\"},{\"internalType\":\"uint16\",\"name\":\"design\",\"type\":\"uint16\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"slotOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"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\":[],\"name\":\"thresholdReachedAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBurned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalMinted\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"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\":\"\",\"type\":\"uint256\"}],\"name\":\"transferNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"ERC721IncorrectOwner(address,uint256,address)\":[{\"details\":\"Indicates an error related to the ownership over a particular token. Used in transfers.\",\"params\":{\"owner\":\"Address of the current owner of a token.\",\"sender\":\"Address whose tokens are being transferred.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InsufficientApproval(address,uint256)\":[{\"details\":\"Indicates a failure with the `operator`’s approval. Used in transfers.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC721InvalidOperator(address)\":[{\"details\":\"Indicates a failure with the `operator` to be approved. Used in approvals.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC721InvalidOwner(address)\":[{\"details\":\"Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20. Used in balance queries.\",\"params\":{\"owner\":\"Address of the current owner of a token.\"}}],\"ERC721InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC721InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC721NonexistentToken(uint256)\":[{\"details\":\"Indicates a `tokenId` whose `owner` is the zero address.\",\"params\":{\"tokenId\":\"Identifier number of a token.\"}}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"AGENT FORGE - Relic\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"MINER()\":{\"notice\":\"The Forge / Miner collection, deployed by this contract's constructor.\"},\"PROCEEDS()\":{\"notice\":\"Mint proceeds can only ever go here.\"},\"PROVENANCE()\":{\"notice\":\"keccak256 of the 15,000-byte table [element(1) | design(2, big-endian)] for slots 0..4999, i.e. exactly what slotData() returns. Committed at deploy, before any mint.\"},\"PUBLIC_REVEAL_DELAY()\":{\"notice\":\"If the owner has not revealed 14 days after the 90% threshold was reached (or as soon as the collection is sold out), anyone may call reveal().\"},\"forgeBurn(address,uint256[5])\":{\"notice\":\"Called only by the Forge (MINER). Burns 5 Relics owned by `from` and returns their elements.\"},\"metadataLocked()\":{\"notice\":\"Metadata is permanently locked once revealed (no setter can run afterwards).\"},\"openMint()\":{\"notice\":\"One-way switch: opens the mint. There is no way to pause or close it again.\"},\"quote(address,uint256)\":{\"notice\":\"BNB due for `wallet` to mint `qty` more Relics now.\"},\"reveal()\":{\"notice\":\"One-time reveal. Owner may call once >= 4,500 are minted. Anyone may call once the collection is sold out, or 14 days after the 4,500 threshold was reached.\"},\"setArt(address)\":{\"notice\":\"Replace the relic renderer. Only possible BEFORE reveal; after reveal metadata is locked forever.\"},\"slotData(uint256)\":{\"notice\":\"Pre-committed sequence entry for slot 0..4999: element 0..3 (Fire, Water, Earth, Lightning) and design 0..1727. Exactly 1,250 slots per element.\"},\"transferNonce(uint256)\":{\"notice\":\"Increments on every wallet-to-wallet transfer; the Market uses it to expire stale listings.\"},\"withdraw()\":{\"notice\":\"Anyone may trigger; funds can only go to the immutable PROCEEDS wallet.\"}},\"notice\":\"5,000 pixel relics on BNB Chain. Mint is open only to wallets holding a .ai Agent ID. The first 2 per wallet are free, then 0.0005 BNB each, max 10 per wallet. Each Relic carries one of four elements (Fire, Water, Earth, Lightning; exactly 1,250 each), assigned by a one-time random offset at reveal over a pre-committed sequence (see PROVENANCE). Burn 5 Relics in the Forge (AgentForgeMiner) to mint 1 Miner. Art is fully on-chain SVG. Unofficial project, not affiliated with Binance or SPACE ID. Collectible only: no yield, return or value is promised.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"AgentForgeRelic.sol\":\"AgentForgeRelic\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6\",\"dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a\"]},\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"keccak256\":\"0x880da465c203cec76b10d72dbd87c80f387df4102274f23eea1f9c9b0918792b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://399594cd8bb0143bc9e55e0f1d071d0d8c850a394fb7a319d50edd55d9ed822b\",\"dweb:/ipfs/QmbPZzgtT6LEm9CMqWfagQFwETbV1ztpECBB1DtQHrKiRz\"]},\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"keccak256\":\"0x39ed367e54765186281efcfe83e47cf0ad62cc879f10e191360712507125f29a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2c5ae6d85bd48cca8d6d2fcec8c63efd86f56f8a5832577a47e403ce0e65cb09\",\"dweb:/ipfs/QmUtcS8AbRSWhuc61puYet58os8FvSqm329ChoW8wwZXZk\"]},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5dc63d1c6a12fe1b17793e1745877b2fcbe1964c3edfd0a482fac21ca8f18261\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b7f97c5960a50fd1822cb298551ffc908e37b7893a68d6d08bce18a11cb0f11\",\"dweb:/ipfs/QmQQvxBytoY1eBt3pRQDmvH2hZ2yjhs12YqVfzGm7KSURq\"]},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"keccak256\":\"0xb5afb8e8eebc4d1c6404df2f5e1e6d2c3d24fd01e5dfc855314951ecfaae462d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://78586466c424f076c6a2a551d848cfbe3f7c49e723830807598484a1047b3b34\",\"dweb:/ipfs/Qmb717ovcFxm7qgNKEShiV6M9SPR3v1qnNpAGH84D6w29p\"]},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"keccak256\":\"0x37d1aaaa5a2908a09e9dcf56a26ddf762ecf295afb5964695937344fc6802ce1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ed0bfc1b92153c5000e50f4021367b931bbe96372ac6facec3c4961b72053d02\",\"dweb:/ipfs/Qmbwp8VDerjS5SV1quwHH1oMXxPQ93fzfLVqJ2RCqbowGE\"]},\"@openzeppelin/contracts/token/ERC721/utils/ERC721Utils.sol\":{\"keccak256\":\"0x40399695922383778f9f540a620bec475a2f8e0f08d41f0005682842e28a9855\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://746d295e403931aeb9d6065fd5a0871f43ab5459814a60623611e4b6641a09fd\",\"dweb:/ipfs/QmWrgT8YJrQ9FfD1o3YYArwo57e7MGdpFKuM74qJ4qE34E\"]},\"@openzeppelin/contracts/utils/Base64.sol\":{\"keccak256\":\"0xbee2b819e1b4bf569ffc1b1b9d560b4abd6a589575f3093edaab9244de18a0c2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e478c0e9bbf3eb8cd3b7784f9b397603e34747f9ffd16571ed1d89ce102de389\",\"dweb:/ipfs/QmZ6zXpwy5xRxx9RkodJmDZSUTeEqPQUanAC5TUoYqW2VR\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"@openzeppelin/contracts/utils/Panic.sol\":{\"keccak256\":\"0xf7fe324703a64fc51702311dc51562d5cb1497734f074e4f483bfb6717572d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6a5ff4f9fd8649b7ee20800b7fa387d3465bd77cf20c2d1068cd5c98e1ed57a\",\"dweb:/ipfs/QmVSaVJf9FXFhdYEYeCEfjMVHrxDh5qL4CGkxdMWpQCrqG\"]},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a\",\"dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x725209b582291bb83058e3078624b53d15a133f7401c30295e7f3704181d2aed\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0564ddb19c6d870e27b789d8f985283d815267ad7224883c2d5243c8bacc7dc0\",\"dweb:/ipfs/QmeC953H4sj88ZRFdJNFdmpf7J9SksP1wK4jyMHLo66z49\"]},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0xddce8e17e3d3f9ed818b4f4c4478a8262aab8b11ed322f1bf5ed705bb4bd97fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8084aa71a4cc7d2980972412a88fe4f114869faea3fefa5436431644eb5c0287\",\"dweb:/ipfs/Qmbqfs5dRdPvHVKY8kTaeyc65NdqXRQwRK7h9s5UJEhD1p\"]},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f6fda447a62815e8064f47eff0dd1cf58d9207ad69b5d32280f8d7ed1d1e4621\",\"dweb:/ipfs/QmfDRc7pxfaXB2Dh9np5Uf29Na3pQ7tafRS684wd3GLjVL\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa00be322d7db5786750ce0ac7e2f5b633ac30a5ed5fa1ced1e74acfc19acecea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6c84e822f87cbdc4082533b626667b6928715bb2b1e8e7eb96954cebb9e38c8d\",\"dweb:/ipfs/QmZmy9dgxLTerBAQDuuHqbL6EpgRxddqgv5KmwpXYVbKz1\"]},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xb1970fac7b64e6c09611e6691791e848d5e3fe410fa5899e7df2e0afd77a99e3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://db5fbb3dddd8b7047465b62575d96231ba8a2774d37fb4737fbf23340fabbb03\",\"dweb:/ipfs/QmVUSvooZKEdEdap619tcJjTLcAuH6QBdZqAzWwnAXZAWJ\"]},\"AgentForgeMiner.sol\":{\"keccak256\":\"0x0ef37f385c765f6ffd9f193ec3035e5dc174f920e89c108f4eab6bd7775c4328\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5810dff0a220b254d861abd79e291c8c56160a2fff952fbc5fb01b9cf600bfa2\",\"dweb:/ipfs/QmVGSo5Q8aUm46CxdcDu9KdJ2SQLuJXykhr258Zj3MdAGs\"]},\"AgentForgeRelic.sol\":{\"keccak256\":\"0xac40c2f43db388cca43dc98d0278dad58e9eb43b3b505d0fd8b94c028150750a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://58bddd5d2bbd35f31d3dd53968343dbcea0172241e2d9f67133f90bb43394f6c\",\"dweb:/ipfs/QmVA2rPuMaNi5b9ybKz48FwXUGULAxrbHH2MZszKdUdQhG\"]}},\"version\":1}","userdoc":{"kind":"user","notice":"5,000 pixel relics on BNB Chain. Mint is open only to wallets holding a .ai Agent ID. The first 2 per wallet are free, then 0.0005 BNB each, max 10 per wallet. Each Relic carries one of four elements (Fire, Water, Earth, Lightning; exactly 1,250 each), assigned by a one-time random offset at reveal over a pre-committed sequence (see PROVENANCE). Burn 5 Relics in the Forge (AgentForgeMiner) to mint 1 Miner. Art is fully on-chain SVG. Unofficial project, not affiliated with Binance or SPACE ID. Collectible only: no yield, return or value is promised.","methods":{"MINER()":{"notice":"The Forge / Miner collection, deployed by this contract's constructor."},"reveal()":{"notice":"One-time reveal. Owner may call once >= 4,500 are minted. Anyone may call once the collection is sold out, or 14 days after the 4,500 threshold was reached."},"PROCEEDS()":{"notice":"Mint proceeds can only ever go here."},"openMint()":{"notice":"One-way switch: opens the mint. There is no way to pause or close it again."},"withdraw()":{"notice":"Anyone may trigger; funds can only go to the immutable PROCEEDS wallet."},"PROVENANCE()":{"notice":"keccak256 of the 15,000-byte table [element(1) | design(2, big-endian)] for slots 0..4999, i.e. exactly what slotData() returns. Committed at deploy, before any mint."},"setArt(address)":{"notice":"Replace the relic renderer. Only possible BEFORE reveal; after reveal metadata is locked forever."},"metadataLocked()":{"notice":"Metadata is permanently locked once revealed (no setter can run afterwards)."},"slotData(uint256)":{"notice":"Pre-committed sequence entry for slot 0..4999: element 0..3 (Fire, Water, Earth, Lightning) and design 0..1727. Exactly 1,250 slots per element."},"PUBLIC_REVEAL_DELAY()":{"notice":"If the owner has not revealed 14 days after the 90% threshold was reached (or as soon as the collection is sold out), anyone may call reveal()."},"quote(address,uint256)":{"notice":"BNB due for `wallet` to mint `qty` more Relics now."},"transferNonce(uint256)":{"notice":"Increments on every wallet-to-wallet transfer; the Market uses it to expire stale listings."},"forgeBurn(address,uint256[5])":{"notice":"Called only by the Forge (MINER). Burns 5 Relics owned by `from` and returns their elements."}},"version":1},"devdoc":{"kind":"dev","title":"AGENT FORGE - Relic","errors":{"ERC721InvalidOwner(address)":[{"params":{"owner":"Address of the current owner of a token."},"details":"Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20. Used in balance queries."}],"ERC721InvalidSender(address)":[{"params":{"sender":"Address whose tokens are being transferred."},"details":"Indicates a failure with the token `sender`. Used in transfers."}],"OwnableInvalidOwner(address)":[{"details":"The owner is not a valid owner account. (eg. `address(0)`)"}],"ERC721InvalidApprover(address)":[{"params":{"approver":"Address initiating an approval operation."},"details":"Indicates a failure with the `approver` of a token to be approved. Used in approvals."}],"ERC721InvalidOperator(address)":[{"params":{"operator":"Address that may be allowed to operate on tokens without being their owner."},"details":"Indicates a failure with the `operator` to be approved. Used in approvals."}],"ERC721InvalidReceiver(address)":[{"params":{"receiver":"Address to which tokens are being transferred."},"details":"Indicates a failure with the token `receiver`. Used in transfers."}],"ERC721NonexistentToken(uint256)":[{"params":{"tokenId":"Identifier number of a token."},"details":"Indicates a `tokenId` whose `owner` is the zero address."}],"OwnableUnauthorizedAccount(address)":[{"details":"The caller account is not authorized to perform an operation."}],"ERC721InsufficientApproval(address,uint256)":[{"params":{"tokenId":"Identifier number of a token.","operator":"Address that may be allowed to operate on tokens without being their owner."},"details":"Indicates a failure with the `operator`’s approval. Used in transfers."}],"ERC721IncorrectOwner(address,uint256,address)":[{"params":{"owner":"Address of the current owner of a token.","sender":"Address whose tokens are being transferred.","tokenId":"Identifier number of a token."},"details":"Indicates an error related to the ownership over a particular token. Used in transfers."}]},"events":{"Approval(address,address,uint256)":{"details":"Emitted when `owner` enables `approved` to manage the `tokenId` token."},"Transfer(address,address,uint256)":{"details":"Emitted when `tokenId` token is transferred from `from` to `to`."},"ApprovalForAll(address,address,bool)":{"details":"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets."}},"methods":{"name()":{"details":"See {IERC721Metadata-name}."},"owner()":{"details":"Returns the address of the current owner."},"symbol()":{"details":"See {IERC721Metadata-symbol}."},"ownerOf(uint256)":{"details":"See {IERC721-ownerOf}."},"balanceOf(address)":{"details":"See {IERC721-balanceOf}."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"getApproved(uint256)":{"details":"See {IERC721-getApproved}."},"approve(address,uint256)":{"details":"See {IERC721-approve}."},"supportsInterface(bytes4)":{"details":"See {IERC165-supportsInterface}."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"setApprovalForAll(address,bool)":{"details":"See {IERC721-setApprovalForAll}."},"isApprovedForAll(address,address)":{"details":"See {IERC721-isApprovedForAll}."},"transferFrom(address,address,uint256)":{"details":"See {IERC721-transferFrom}."},"safeTransferFrom(address,address,uint256)":{"details":"See {IERC721-safeTransferFrom}."},"safeTransferFrom(address,address,uint256,bytes)":{"details":"See {IERC721-safeTransferFrom}."}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_string_storage":{"label":"string","encoding":"bytes","numberOfBytes":"32"},"t_contract(IRelicArt)8909":{"label":"contract IRelicArt","encoding":"inplace","numberOfBytes":"20"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_address)":{"key":"t_uint256","label":"mapping(uint256 => address)","value":"t_address","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_uint256)":{"key":"t_uint256","label":"mapping(uint256 => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_mapping(t_address,t_bool))":{"key":"t_address","label":"mapping(address => mapping(address => bool))","value":"t_mapping(t_address,t_bool)","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_string_storage","astId":317,"label":"_name","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"1","type":"t_string_storage","astId":319,"label":"_symbol","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"2","type":"t_mapping(t_uint256,t_address)","astId":323,"label":"_owners","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"3","type":"t_mapping(t_address,t_uint256)","astId":327,"label":"_balances","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"4","type":"t_mapping(t_uint256,t_address)","astId":331,"label":"_tokenApprovals","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"5","type":"t_mapping(t_address,t_mapping(t_address,t_bool))","astId":337,"label":"_operatorApprovals","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"6","type":"t_address","astId":8,"label":"_owner","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"7","type":"t_contract(IRelicArt)8909","astId":8966,"label":"art","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"8","type":"t_uint256","astId":8968,"label":"totalMinted","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"9","type":"t_uint256","astId":8970,"label":"totalBurned","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"10","type":"t_bool","astId":8972,"label":"mintOpen","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"10","type":"t_bool","astId":8974,"label":"revealed","offset":1,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"11","type":"t_uint256","astId":8976,"label":"revealOffset","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"12","type":"t_uint256","astId":8978,"label":"thresholdReachedAt","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"13","type":"t_mapping(t_address,t_uint256)","astId":8982,"label":"mintedBy","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"},{"slot":"14","type":"t_mapping(t_uint256,t_uint256)","astId":8987,"label":"transferNonce","offset":0,"contract":"AgentForgeRelic.sol:AgentForgeRelic"}]},"transientStorageLayout":null,"evm":{"bytecode":{"object":"60e060405234801561000f575f80fd5b5060405161548838038061548883398101604081905261002e916101b9565b81604051806040016040528060118152602001704167656e7420466f7267652052656c696360781b8152506040518060400160405280600581526020016452454c494360d81b815250815f908161008591906102a1565b50600161009282826102a1565b5050506001600160a01b0381166100c257604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100cb81610144565b50600780546001600160a01b0319166001600160a01b0386811691909117909155821660a0526080819052604051839061010490610195565b6001600160a01b039091168152602001604051809103905ff08015801561012d573d5f803e3d5ffd5b506001600160a01b031660c0525061035b92505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b61268180612e0783390190565b6001600160a01b03811681146101b6575f80fd5b50565b5f805f80608085870312156101cc575f80fd5b84516101d7816101a2565b60208601519094506101e8816101a2565b60408601519093506101f9816101a2565b6060959095015193969295505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061023157607f821691505b60208210810361024f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561029c57805f5260205f20601f840160051c8101602085101561027a5750805b601f840160051c820191505b81811015610299575f8155600101610286565b50505b505050565b81516001600160401b038111156102ba576102ba610209565b6102ce816102c8845461021d565b84610255565b6020601f821160018114610300575f83156102e95750848201515b5f19600385901b1c1916600184901b178455610299565b5f84815260208120601f198516915b8281101561032f578785015182556020948501946001909201910161030f565b508482101561034c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60805160a05160c051612a746103935f395f81816106cb0152610a0d01525f818161076e0152610d4f01525f6105b40152612a745ff3fe6080604052600436106102bf575f3560e01c806370a082311161016f578063a624c3db116100d8578063d89135cd11610092578063e905182a1161006d578063e905182a14610853578063e985e9c51461087a578063f2fde38b14610899578063fc659491146108b8575f80fd5b8063d89135cd1461080b578063e6b1a3ae14610820578063e8a3d4851461083f575f80fd5b8063a624c3db1461075d578063b88d4fde14610790578063bce6d672146107af578063c87b56dd146107c3578063cd90e5af146107e2578063d21ff494146107f6575f80fd5b806396d597171161012957806396d59717146106ba5780639ba06ab8146106ed578063a0712d6814610702578063a22cb46514610715578063a2309ff814610734578063a475b5dd14610749575f80fd5b806370a082311461061d578063715018a61461063c5780638d859f3e146106505780638da5cb5b1461066a5780638f79306e1461068757806395d89b41146106a6575f80fd5b806324bbd0491161022b57806342842e0e116101e55780636352211e116101c05780636352211e146105845780636373a6b1146105a357806369d2ceb1146105d65780636e303cad146105f2575f80fd5b806342842e0e146105325780634ae23bd7146105515780635183022714610566575f80fd5b806324bbd04914610487578063263f3e7e146104a0578063301bd28e146104bf57806332cb6b0c146104de5780633ccfd60b146104f35780633cef28d214610507575f80fd5b8063193ee7b51161027c578063193ee7b5146103a6578063204aecb1146103d25780632097ac3b146103e757806322acaf04146103fc57806323b872dd1461043757806323f1892014610456575f80fd5b806301ffc9a7146102c357806306fdde03146102f7578063081812fc14610318578063095ea7b31461034f5780630f2cdd6c1461037057806318160ddd14610392575b5f80fd5b3480156102ce575f80fd5b506102e26102dd366004612156565b6108ce565b60405190151581526020015b60405180910390f35b348015610302575f80fd5b5061030b61091f565b6040516102ee91906121be565b348015610323575f80fd5b506103376103323660046121d0565b6109ae565b6040516001600160a01b0390911681526020016102ee565b34801561035a575f80fd5b5061036e610369366004612202565b6109d5565b005b34801561037b575f80fd5b50610384600a81565b6040519081526020016102ee565b34801561039d575f80fd5b506103846109e4565b3480156103b1575f80fd5b506103c56103c036600461222a565b6109fa565b6040516102ee9190612261565b3480156103dd575f80fd5b50610384600c5481565b3480156103f2575f80fd5b50610384600b5481565b348015610407575f80fd5b5061041b6104163660046121d0565b610b67565b6040805160ff909316835261ffff9091166020830152016102ee565b348015610442575f80fd5b5061036e610451366004612294565b610c25565b348015610461575f80fd5b506104756104703660046121d0565b610cae565b60405160ff90911681526020016102ee565b348015610492575f80fd5b50600a546102e29060ff1681565b3480156104ab575f80fd5b506103846104ba3660046121d0565b610cc2565b3480156104ca575f80fd5b50600754610337906001600160a01b031681565b3480156104e9575f80fd5b5061038461138881565b3480156104fe575f80fd5b5061036e610d3e565b348015610512575f80fd5b506103846105213660046122ce565b600d6020525f908152604090205481565b34801561053d575f80fd5b5061036e61054c366004612294565b610e27565b34801561055c575f80fd5b506103846104e281565b348015610571575f80fd5b50600a546102e290610100900460ff1681565b34801561058f575f80fd5b5061033761059e3660046121d0565b610e46565b3480156105ae575f80fd5b506103847f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e1575f80fd5b50600a54610100900460ff166102e2565b3480156105fd575f80fd5b5061038461060c3660046121d0565b600e6020525f908152604090205481565b348015610628575f80fd5b506103846106373660046122ce565b610e50565b348015610647575f80fd5b5061036e610e95565b34801561065b575f80fd5b506103846601c6bf5263400081565b348015610675575f80fd5b506006546001600160a01b0316610337565b348015610692575f80fd5b506103846106a1366004612202565b610ea8565b3480156106b1575f80fd5b5061030b610f10565b3480156106c5575f80fd5b506103377f000000000000000000000000000000000000000000000000000000000000000081565b3480156106f8575f80fd5b5061038461119481565b61036e6107103660046121d0565b610f1f565b348015610720575f80fd5b5061036e61072f3660046122e7565b611108565b34801561073f575f80fd5b5061038460085481565b348015610754575f80fd5b5061036e611113565b348015610768575f80fd5b506103377f000000000000000000000000000000000000000000000000000000000000000081565b34801561079b575f80fd5b5061036e6107aa36600461238c565b61125d565b3480156107ba575f80fd5b5061036e611275565b3480156107ce575f80fd5b5061030b6107dd3660046121d0565b6112b4565b3480156107ed575f80fd5b50610384600281565b348015610801575f80fd5b506103846106c081565b348015610816575f80fd5b5061038460095481565b34801561082b575f80fd5b5061036e61083a3660046122ce565b61152b565b34801561084a575f80fd5b5061030b6115b0565b34801561085e575f80fd5b506103377360b9262456de011f7d15a54cdd8c48baaa8b022f81565b348015610885575f80fd5b506102e2610894366004612430565b611641565b3480156108a4575f80fd5b5061036e6108b33660046122ce565b61166e565b3480156108c3575f80fd5b506103846212750081565b5f6001600160e01b031982166380ac58cd60e01b14806108fe57506001600160e01b03198216635b5e139f60e01b145b8061091957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f805461092d90612461565b80601f016020809104026020016040519081016040528092919081815260200182805461095990612461565b80156109a45780601f1061097b576101008083540402835291602001916109a4565b820191905f5260205f20905b81548152906001019060200180831161098757829003601f168201915b5050505050905090565b5f6109b8826116ab565b505f828152600460205260409020546001600160a01b0316610919565b6109e08282336116e3565b5050565b5f6009546008546109f591906124ad565b905090565b610a02612123565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a4b5760405163f3883b7560e01b815260040160405180910390fd5b600a54610100900460ff16610a7357604051631659379160e31b815260040160405180910390fd5b5f5b6005811015610b4857836001600160a01b0316610abc848360058110610a9d57610a9d6124c0565b60200201355f908152600260205260409020546001600160a01b031690565b6001600160a01b031614610ae3576040516359dc379f60e01b815260040160405180910390fd5b610b02838260058110610af857610af86124c0565b6020020135610cae565b828260058110610b1457610b146124c0565b60ff9092166020929092020152610b40838260058110610b3657610b366124c0565b60200201356116f0565b600101610a75565b50600560095f828254610b5b91906124d4565b90915550909392505050565b5f806113888310610bac5760405162461bcd60e51b8152600401610ba3906020808252600490820152631cdb1bdd60e21b604082015260600190565b60405180910390fd5b6104e2610bb884611728565b610bc291906124fb565b604080517f1d03a41ff33612e152ff5fa34d0d3c0f1e464becfd80c3cf15b9494ac7bc60db60208201529081018590529092506106c090606001604051602081830303815290604052805190602001205f1c610c1e919061250e565b9050915091565b6001600160a01b038216610c4e57604051633250574960e11b81525f6004820152602401610ba3565b5f610c5a8383336117be565b9050836001600160a01b0316816001600160a01b031614610ca8576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610ba3565b50505050565b5f610cbb61041683610cc2565b5092915050565b600a545f90610100900460ff16610cec57604051631659379160e31b815260040160405180910390fd5b811580610cfa575060085482115b15610d18576040516379d93f4960e01b815260040160405180910390fd5b600b5461138890610d2a6001856124ad565b610d3491906124d4565b610919919061250e565b60405147905f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169083908381818185875af1925050503d805f8114610da8576040519150601f19603f3d011682016040523d82523d5f602084013e610dad565b606091505b5050905080610df05760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610ba3565b6040518281527f430648de173157e069201c943adb2d4e340e7cf5b27b1b09c9cb852f03d63b569060200160405180910390a15050565b610e4183838360405180602001604052805f81525061125d565b505050565b5f610919826116ab565b5f6001600160a01b038216610e7a576040516322718ad960e21b81525f6004820152602401610ba3565b506001600160a01b03165f9081526003602052604090205490565b610e9d611818565b610ea65f611845565b565b6001600160a01b0382165f908152600d6020526040812054816002821015610eda57610ed58260026124ad565b610edc565b5f5b9050808411610eeb575f610f07565b6601c6bf52634000610efd82866124ad565b610f079190612521565b95945050505050565b60606001805461092d90612461565b600a5460ff16610f425760405163589ed34b60e01b815260040160405180910390fd5b6040516370a0823160e01b81523360048201527360b9262456de011f7d15a54cdd8c48baaa8b022f906370a0823190602401602060405180830381865afa158015610f8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb39190612538565b5f03610fd257604051630d9ab13f60e01b815260040160405180910390fd5b805f03610ff257604051635caa42ff60e01b815260040160405180910390fd5b60085461138861100283836124d4565b1115611021576040516352df9fe560e01b815260040160405180910390fd5b335f908152600d6020526040902054600a9061103e9084906124d4565b111561105c5760405162a84d4b60e71b815260040160405180910390fd5b6110663383610ea8565b34146110855760405163788a686f60e01b815260040160405180910390fd5b335f908152600d6020526040812080548492906110a39084906124d4565b909155506110b3905082826124d4565b600855600c541580156110d157506111946110ce83836124d4565b10155b156110db5742600c555b60015b828111610e41576110f8336110f383856124d4565b611896565b6111018161254f565b90506110de565b6109e03383836118f7565b600a54610100900460ff161561113c5760405163a89ac15160e01b815260040160405180910390fd5b61119460085410156111615760405163c349402d60e01b815260040160405180910390fd5b6006546001600160a01b0316331480159061117f5750611388600854105b801561119a575062127500600c5461119791906124d4565b42105b156111b85760405163c349402d60e01b815260040160405180910390fd5b611388446111c76001436124ad565b600854604080516020810194909452914091830191909152606082015230608082015260a001604051602081830303815290604052805190602001205f1c61120f919061250e565b600b819055600a805461ff001916610100179055604080519182523360208301527f6e9dac3f3f833c1d527aa989d3a673884ddc11e31fdccc11ccd8aebf1ae069ac910160405180910390a1565b611268848484610c25565b610ca83385858585611995565b61127d611818565b600a805460ff191660011790556040517f4301b55b3d4fd9018308a6bd66bf37880623a9548566d1b12867ab619a993ca1905f90a1565b60606112bf826116ab565b506060806060600a60019054906101000a900460ff16611390576112e285611abd565b6040516020016112f29190612582565b60408051808303601f190181529082905260075463c1b27b6160e01b8352600483018890529094506001600160a01b03169063c1b27b61906024015f60405180830381865afa158015611347573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261136e91908101906125b7565b9150604051806060016040528060288152602001612a176028913990506114d6565b5f8061139e61041688610cc2565b915091506113ae8260ff16611b4d565b6113b788611abd565b6040516020016113c8929190612620565b60408051808303601f19018152908290526007546399faa5b360e01b8352600483018a905260ff8516602484015261ffff841660448401529096506001600160a01b0316906399faa5b3906064015f60405180830381865afa158015611430573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261145791908101906125b7565b6007546040516318f6670d60e21b815260ff8516600482015261ffff841660248201529195506001600160a01b0316906363d99c34906044015f60405180830381865afa1580156114aa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114d191908101906125b7565b925050505b6115028383836040516020016114ee93929190612662565b604051602081830303815290604052611bed565b60405160200161151291906127cf565b6040516020818303038152906040529350505050919050565b611533611818565b600a54610100900460ff161561155c576040516313ef243160e11b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527f89382d75256b43b6826ad8d6cbd8e517eaf5e10f1ef4c8f123c9a25ac4529b559060200160405180910390a150565b60075460405163c1b27b6160e01b81525f60048201526060916001600160a01b03169063c1b27b61906024015f60405180830381865afa1580156115f6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261161d91908101906125b7565b60405160200161162d9190612813565b604051602081830303815290604052905090565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b611676611818565b6001600160a01b03811661169f57604051631e4fbdf760e01b81525f6004820152602401610ba3565b6116a881611845565b50565b5f818152600260205260408120546001600160a01b03168061091957604051637e27328960e01b815260048101849052602401610ba3565b610e418383836001611c13565b5f6116fc5f835f6117be565b90506001600160a01b0381166109e057604051637e27328960e01b815260048101839052602401610ba3565b5f5b600782901c607f83165f5b60048110156117a657604080517f1d03a41ff33612e152ff5fa34d0d3c0f1e464becfd80c3cf15b9494ac7bc60db6020820152908101829052606081018390525f9060800160408051808303601f1901815291905280516020909101209293607f9093169092189150600101611735565b5060079190911b17915061138882101561172a575090565b5f6117ca848484611d17565b90506001600160a01b038116158015906117ec57506001600160a01b03841615155b15611811575f838152600e60205260408120805490919061180c9061254f565b909155505b9392505050565b6006546001600160a01b03163314610ea65760405163118cdaa760e01b8152336004820152602401610ba3565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166118bf57604051633250574960e11b81525f6004820152602401610ba3565b5f6118cb83835f6117be565b90506001600160a01b03811615610e41576040516339e3563760e11b81525f6004820152602401610ba3565b6001600160a01b03821661192957604051630b61174360e31b81526001600160a01b0383166004820152602401610ba3565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b15611ab657604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906119d790889088908790879060040161297f565b6020604051808303815f875af1925050508015611a11575060408051601f3d908101601f19168201909252611a0e918101906129bb565b60015b611a78573d808015611a3e576040519150601f19603f3d011682016040523d82523d5f602084013e611a43565b606091505b5080515f03611a7057604051633250574960e11b81526001600160a01b0385166004820152602401610ba3565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14611ab457604051633250574960e11b81526001600160a01b0385166004820152602401610ba3565b505b5050505050565b60605f611ac983611e09565b60010190505f8167ffffffffffffffff811115611ae857611ae8612320565b6040519080825280601f01601f191660200182016040528015611b12576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611b1c57509392505050565b6060815f03611b765750506040805180820190915260048152634669726560e01b602082015290565b81600103611b9f5750506040805180820190915260058152642bb0ba32b960d91b602082015290565b81600203611bc857505060408051808201909152600581526408ac2e4e8d60db1b602082015290565b50506040805180820190915260098152684c696768746e696e6760b81b602082015290565b6060610919826040518060600160405280604081526020016129d7604091396001611ee0565b8080611c2757506001600160a01b03821615155b15611ce8575f611c36846116ab565b90506001600160a01b03831615801590611c625750826001600160a01b0316816001600160a01b031614155b8015611c755750611c738184611641565b155b15611c9e5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610ba3565b8115611ce65783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f828152600260205260408120546001600160a01b0390811690831615611d4357611d4381848661205b565b6001600160a01b03811615611d7d57611d5e5f855f80611c13565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615611dab576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e475772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611e73576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611e9157662386f26fc10000830492506010015b6305f5e1008310611ea9576305f5e100830492506008015b6127108310611ebd57612710830492506004015b60648310611ecf576064830492506002015b600a83106109195760010192915050565b606083515f03611efe575060408051602081019091525f8152611811565b5f82611f2e57600385516004611f149190612521565b611f1f9060026124d4565b611f2991906124fb565b611f53565b600385516002611f3e91906124d4565b611f4891906124fb565b611f53906004612521565b90505f8167ffffffffffffffff811115611f6f57611f6f612320565b6040519080825280601f01601f191660200182016040528015611f99576020820181803683370190505b509050600185016020820187885189016020810180515f82525b8284101561200e576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450611fb3565b90525050851561204f5760038851066001811461203257600281146120455761204d565b603d6001830353603d600283035361204d565b603d60018303535b505b50909695505050505050565b6120668383836120bf565b610e41576001600160a01b03831661209457604051637e27328960e01b815260048101829052602401610ba3565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610ba3565b5f6001600160a01b0383161580159061211b5750826001600160a01b0316846001600160a01b031614806120f857506120f88484611641565b8061211b57505f828152600460205260409020546001600160a01b038481169116145b949350505050565b6040518060a001604052806005906020820280368337509192915050565b6001600160e01b0319811681146116a8575f80fd5b5f60208284031215612166575f80fd5b813561181181612141565b5f5b8381101561218b578181015183820152602001612173565b50505f910152565b5f81518084526121aa816020860160208601612171565b601f01601f19169290920160200192915050565b602081525f6118116020830184612193565b5f602082840312156121e0575f80fd5b5035919050565b80356001600160a01b03811681146121fd575f80fd5b919050565b5f8060408385031215612213575f80fd5b61221c836121e7565b946020939093013593505050565b5f8060c0838503121561223b575f80fd5b612244836121e7565b91508360c084011115612255575f80fd5b50926020919091019150565b60a0810181835f5b600581101561228b57815160ff16835260209283019290910190600101612269565b50505092915050565b5f805f606084860312156122a6575f80fd5b6122af846121e7565b92506122bd602085016121e7565b929592945050506040919091013590565b5f602082840312156122de575f80fd5b611811826121e7565b5f80604083850312156122f8575f80fd5b612301836121e7565b915060208301358015158114612315575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561235d5761235d612320565b604052919050565b5f67ffffffffffffffff82111561237e5761237e612320565b50601f01601f191660200190565b5f805f806080858703121561239f575f80fd5b6123a8856121e7565b93506123b6602086016121e7565b925060408501359150606085013567ffffffffffffffff8111156123d8575f80fd5b8501601f810187136123e8575f80fd5b80356123fb6123f682612365565b612334565b81815288602083850101111561240f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215612441575f80fd5b61244a836121e7565b9150612458602084016121e7565b90509250929050565b600181811c9082168061247557607f821691505b60208210810361249357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561091957610919612499565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561091957610919612499565b634e487b7160e01b5f52601260045260245ffd5b5f82612509576125096124e7565b500490565b5f8261251c5761251c6124e7565b500690565b808202811582820484141761091957610919612499565b5f60208284031215612548575f80fd5b5051919050565b5f6001820161256057612560612499565b5060010190565b5f8151612578818560208601612171565b9290920192915050565b6d5365616c65642052656c6963202360901b81525f82516125aa81600e850160208701612171565b91909101600e0192915050565b5f602082840312156125c7575f80fd5b815167ffffffffffffffff8111156125dd575f80fd5b8201601f810184136125ed575f80fd5b80516125fb6123f682612365565b81815285602083850101111561260f575f80fd5b610f07826020830160208601612171565b5f8351612631818460208801612171565b672052656c6963202360c01b9083019081528351612656816008840160208801612171565b01600801949350505050565b683d913730b6b2911d1160b91b815283515f90612686816009850160208901612171565b7f222c226465736372697074696f6e223a224167656e7420466f7267653a20352c6009918401918201527f303030206f6e2d636861696e20706978656c2072656c69637320666f72202e6160298201527f69204167656e7420494420686f6c64657273206f6e20424e4220436861696e2e60498201527f20466f72676520352052656c69637320696e746f2031204d696e65722e20556e60698201527f6f6666696369616c2c20636f6c6c65637469626c65206f6e6c792c206e6f207960898201527f69656c642070726f6d697365642e222c22696d616765223a22646174613a696d60a9820152701859d94bdcdd99cade1b5b0edd5d198e0b607a1b60c982015261279560da820186612567565b6f222c2261747472696275746573223a5b60801b815290506127ba6010820185612567565b615d7d60f01b81526002019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161280681601d850160208701612171565b91909101601d0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081527f7b226e616d65223a224167656e7420466f7267652052656c6963222c22646573601b8201527f6372697074696f6e223a22352c303030206f6e2d636861696e20706978656c20603b8201527f72656c69637320696e20666f757220656c656d656e747320666f72202e616920605b8201527f4167656e7420494420686f6c64657273206f6e20424e4220436861696e2e2042607b8201527f75726e203520696e2074686520466f72676520746f206d696e742061204d696e609b8201527f65722e20556e6f6666696369616c2c20636f6c6c65637469626c65206f6e6c7960bb8201527f2e222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b7560db820152631d198e0b60e21b60fb8201525f82516129618160ff850160208701612171565b820161297460ff820161227d60f01b9052565b610101019392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906129b190830184612193565b9695505050505050565b5f602082840312156129cb575f80fd5b81516118118161214156fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f7b2274726169745f74797065223a22537461747573222c2276616c7565223a225365616c6564227da264697066735822122048023ede6f67d3681b9045c99c65b5db0a558760d9abe82b0ee0e395dd37670764736f6c634300081a003360c060405234801561000f575f80fd5b5060405161268138038061268183398101604081905261002e916100ae565b6040518060400160405280601181526020017020b3b2b73a102337b933b29026b4b732b960791b8152506040518060400160405280600581526020016426a4a722a960d91b815250815f90816100849190610173565b5060016100918282610173565b5050600160065550336080526001600160a01b031660a05261022d565b5f602082840312156100be575f80fd5b81516001600160a01b03811681146100d4575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061010357607f821691505b60208210810361012157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561016e57805f5260205f20601f840160051c8101602085101561014c5750805b601f840160051c820191505b8181101561016b575f8155600101610158565b50505b505050565b81516001600160401b0381111561018c5761018c6100db565b6101a08161019a84546100ef565b84610127565b6020601f8211600181146101d2575f83156101bb5750848201515b5f19600385901b1c1916600184901b17845561016b565b5f84815260208120601f198516915b8281101561020157878501518255602094850194600190920191016101e1565b508482101561021e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60805160a05161241761026a5f395f81816104de01528181610f85015261103101525f8181610511015281816109890152610db301526124175ff3fe6080604052600436106101e6575f3560e01c806370a0823111610108578063aa6bb09a1161009d578063dd4bc1011161006d578063dd4bc101146105ba578063df18e047146105e5578063df1c455c14610610578063e985e9c514610625578063ff50abdc14610644575f80fd5b8063aa6bb09a14610552578063b88d4fde14610567578063c87b56dd14610586578063d54ad2a1146105a5575f80fd5b806396c82e57116100d857806396c82e57146104b85780639cb84a01146104cd5780639fe45cb414610500578063a22cb46514610533575f80fd5b806370a08231146104525780638c715407146104715780638da5cb5b1461049057806395d89b41146104a4575f80fd5b806331d7a2621161017e5780634e71d92d1161014e5780634e71d92d146103c95780635873eb9b146103dd5780636352211e146104085780636e303cad14610427575f80fd5b806331d7a2621461034d57806342842e0e1461036c57806348380a101461038b5780634e2a08a7146103aa575f80fd5b8063152111f7116101b9578063152111f71461029757806318160ddd1461029f57806323b872dd146102c25780632e340599146102e1575f80fd5b806301ffc9a7146101ea57806306fdde031461021e578063081812fc1461023f578063095ea7b314610276575b5f80fd5b3480156101f5575f80fd5b50610209610204366004611c2b565b610659565b60405190151581526020015b60405180910390f35b348015610229575f80fd5b506102326106aa565b6040516102159190611c93565b34801561024a575f80fd5b5061025e610259366004611ca5565b610739565b6040516001600160a01b039091168152602001610215565b348015610281575f80fd5b50610295610290366004611cd0565b610760565b005b61029561076f565b3480156102aa575f80fd5b506102b460075481565b604051908152602001610215565b3480156102cd575f80fd5b506102956102dc366004611cfa565b61082f565b3480156102ec575f80fd5b506103276102fb366004611ca5565b60086020525f908152604090205460ff8082169161010081049091169062010000900463ffffffff1683565b6040805160ff948516815293909216602084015263ffffffff1690820152606001610215565b348015610358575f80fd5b506102b4610367366004611d38565b6108bd565b348015610377575f80fd5b50610295610386366004611cfa565b610932565b348015610396575f80fd5b506102b46103a5366004611ca5565b610951565b3480156103b5575f80fd5b506102b46103c4366004611d53565b610967565b3480156103d4575f80fd5b506102b4610c31565b3480156103e8575f80fd5b506102b46103f7366004611d38565b60136020525f908152604090205481565b348015610413575f80fd5b5061025e610422366004611ca5565b610d45565b348015610432575f80fd5b506102b4610441366004611ca5565b600c6020525f908152604090205481565b34801561045d575f80fd5b506102b461046c366004611d38565b610d4f565b34801561047c575f80fd5b506102b461048b366004611ca5565b610d94565b34801561049b575f80fd5b5061025e610db0565b3480156104af575f80fd5b50610232610e36565b3480156104c3575f80fd5b506102b4600e5481565b3480156104d8575f80fd5b5061025e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561050b575f80fd5b5061025e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561053e575f80fd5b5061029561054d366004611d78565b610e45565b34801561055d575f80fd5b506102b4600d5481565b348015610572575f80fd5b50610295610581366004611e1f565b610e50565b348015610591575f80fd5b506102326105a0366004611ca5565b610e68565b3480156105b0575f80fd5b506102b460115481565b3480156105c5575f80fd5b506102b46105d4366004611d38565b60126020525f908152604090205481565b3480156105f0575f80fd5b506102b46105ff366004611d38565b60146020525f908152604090205481565b34801561061b575f80fd5b506102b4600f5481565b348015610630575f80fd5b5061020961063f366004611ec7565b6110f3565b34801561064f575f80fd5b506102b460105481565b5f6001600160e01b031982166380ac58cd60e01b148061068957506001600160e01b03198216635b5e139f60e01b145b806106a457506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f80546106b890611ef3565b80601f01602080910402602001604051908101604052809291908181526020018280546106e490611ef3565b801561072f5780601f106107065761010080835404028352916020019161072f565b820191905f5260205f20905b81548152906001019060200180831161071257829003601f168201915b5050505050905090565b5f61074382611120565b505f828152600460205260409020546001600160a01b03166106a4565b61076b828233611158565b5050565b3460105f8282546107809190611f39565b9091555050600e5434905f036107ac5780600f5f8282546107a19190611f39565b909155506107f79050565b600f546107b99082611f39565b5f600f55600e549091506107d769d3c21bcecceda100000083611f4c565b6107e19190611f63565b600d5f8282546107f19190611f39565b90915550505b60405134815233907fb8b27d0db504fa5d914f1fd330347096e88d5ff94b6c612d32797e7c12a8f66f9060200160405180910390a250565b6001600160a01b03821661085d57604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f610869838333611165565b9050836001600160a01b0316816001600160a01b0316146108b7576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610854565b50505050565b6001600160a01b0381165f90815260136020908152604080832054600d54601290935290832054909169d3c21bcecceda1000000916108fc9190611f4c565b6109069190611f63565b6001600160a01b0384165f908152601460205260409020546109289190611f39565b6106a49190611f82565b61094c83838360405180602001604052805f815250610e50565b505050565b60098160038110610960575f80fd5b0154905081565b5f61097061132e565b60405163193ee7b560e01b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063193ee7b5906109c09033908790600401611f95565b60a0604051808303815f875af11580156109dc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a009190611fb4565b9050610a0a611bf5565b5f5b6005811015610a595781838260058110610a2857610a2861203c565b602002015160ff1660048110610a4057610a4061203c565b602002018051610a4f90612050565b9052600101610a0c565b505f805f805f5b6004811015610ad6575f868260048110610a7c57610a7c61203c565b60200201511115610a9357610a9083612050565b92505b81868260048110610aa657610aa661203c565b60200201511115610ace57858160048110610ac357610ac361203c565b602002015191508093505b600101610a60565b5080600503610ae85760029350610af5565b81600403610af557600193505b60075f8154610b0390612050565b919050819055965060405180606001604052808560ff1681526020018460ff168152602001448a8a604051602001610b3d93929190612068565b60408051601f19818403018152918152815160209283012063ffffffff9081169093525f8b81526008835281902084518154938601519590920151909316620100000265ffffffff00001960ff9586166101000261ffff19909416928616929092179290921716179055600990851660038110610bbc57610bbc61203c565b015f8154610bc990612050565b90915550610bd73388611358565b86336001600160a01b03167ed277013b02e1a1b26a701cc2c235f4cacbb71e1b5210bab28f6cb73ffaa3b186868c604051610c1493929190612085565b60405180910390a3505050505050610c2c6001600655565b919050565b5f610c3a61132e565b610c43336113b9565b50335f9081526014602052604081205490819003610c74576040516312d37ee560e31b815260040160405180910390fd5b335f90815260146020526040812081905560118054839290610c97908490611f39565b90915550506040515f90339083908381818185875af1925050503d805f8114610cdb576040519150601f19603f3d011682016040523d82523d5f602084013e610ce0565b606091505b5050905080610d025760405163197121f560e01b815260040160405180910390fd5b60405182815233907fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a9060200160405180910390a250610d426001600655565b90565b5f6106a482611120565b5f6001600160a01b038216610d79576040516322718ad960e21b81525f6004820152602401610854565b506001600160a01b03165f9081526003602052604090205490565b5f818152600860205260408120546106a49060ff166001611f39565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3191906120a7565b905090565b6060600180546106b890611ef3565b61076b338383611467565b610e5b84848461082f565b6108b73385858585611505565b6060610e7382611120565b505f8281526008602090815260408083208151606081018352905460ff80821680845261010083049091169483019490945262010000900463ffffffff1691810191909152919015610f1657815f015160ff16600114610ef457604051806040016040528060098152602001684c6567656e6461727960b81b815250610f36565b604051806040016040528060048152602001635261726560e01b815250610f36565b6040518060400160405280600681526020016521b7b6b6b7b760d11b8152505b90506110cb81610f458661162d565b8451602086015160408088015190516303cf49a760e61b8152600481018b905260ff938416602482015292909116604483015263ffffffff1660648201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f3d269c0906084015f60405180830381865afa158015610fd1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ff891908101906120c2565b85516020870151604080890151905163acafc2cb60e01b815260ff938416600482015292909116602483015263ffffffff1660448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063acafc2cb906064015f60405180830381865afa15801561107d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110a491908101906120c2565b6040516020016110b7949392919061214f565b6040516020818303038152906040526116bd565b6040516020016110db9190612306565b60405160208183030381529060405292505050919050565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b5f818152600260205260408120546001600160a01b0316806106a457604051637e27328960e01b815260048101849052602401610854565b61094c83838360016116e3565b5f6111718484846117e7565b90505f61117d84610d94565b90506001600160a01b0382161561123057611197826113b9565b6001600160a01b0382165f90815260126020526040812080548392906111be908490611f82565b9091555050600d546001600160a01b0383165f9081526012602052604090205469d3c21bcecceda1000000916111f391611f4c565b6111fd9190611f63565b6001600160a01b0383165f90815260136020526040812091909155600e805483929061122a908490611f82565b90915550505b6001600160a01b038516156112e157611248856113b9565b6001600160a01b0385165f908152601260205260408120805483929061126f908490611f39565b9091555050600d546001600160a01b0386165f9081526012602052604090205469d3c21bcecceda1000000916112a491611f4c565b6112ae9190611f63565b6001600160a01b0386165f90815260136020526040812091909155600e80548392906112db908490611f39565b90915550505b6001600160a01b0382161580159061130157506001600160a01b03851615155b15611326575f848152600c60205260408120805490919061132190612050565b909155505b509392505050565b60026006540361135157604051633ee5aeb560e01b815260040160405180910390fd5b6002600655565b6001600160a01b03821661138157604051633250574960e11b81525f6004820152602401610854565b5f61138d83835f611165565b90506001600160a01b0381161561094c576040516339e3563760e11b81525f6004820152602401610854565b6001600160a01b0381165f90815260126020526040812054600d5490919069d3c21bcecceda1000000906113ed9084611f4c565b6113f79190611f63565b6001600160a01b0384165f9081526013602052604090205490915061141c9082611f82565b6001600160a01b0384165f9081526014602052604081208054909190611443908490611f39565b90915550506001600160a01b039092165f9081526013602052604090209190915550565b6001600160a01b03821661149957604051630b61174360e31b81526001600160a01b0383166004820152602401610854565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561162657604051630a85bd0160e11b81526001600160a01b0384169063150b7a029061154790889088908790879060040161234a565b6020604051808303815f875af1925050508015611581575060408051601f3d908101601f1916820190925261157e91810190612386565b60015b6115e8573d8080156115ae576040519150601f19603f3d011682016040523d82523d5f602084013e6115b3565b606091505b5080515f036115e057604051633250574960e11b81526001600160a01b0385166004820152602401610854565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461162457604051633250574960e11b81526001600160a01b0385166004820152602401610854565b505b5050505050565b60605f611639836118db565b60010190505f8167ffffffffffffffff81111561165857611658611db3565b6040519080825280601f01601f191660200182016040528015611682576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461168c57509392505050565b60606106a4826040518060600160405280604081526020016123a26040913960016119b2565b80806116f757506001600160a01b03821615155b156117b8575f61170684611120565b90506001600160a01b038316158015906117325750826001600160a01b0316816001600160a01b031614155b8015611745575061174381846110f3565b155b1561176e5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610854565b81156117b65783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f828152600260205260408120546001600160a01b039081169083161561181357611813818486611b2d565b6001600160a01b0381161561184d5761182e5f855f806116e3565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b0385161561187b576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a490505b9392505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106119195772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611945576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061196357662386f26fc10000830492506010015b6305f5e100831061197b576305f5e100830492506008015b612710831061198f57612710830492506004015b606483106119a1576064830492506002015b600a83106106a45760010192915050565b606083515f036119d0575060408051602081019091525f81526118d4565b5f82611a00576003855160046119e69190611f4c565b6119f1906002611f39565b6119fb9190611f63565b611a25565b600385516002611a109190611f39565b611a1a9190611f63565b611a25906004611f4c565b90505f8167ffffffffffffffff811115611a4157611a41611db3565b6040519080825280601f01601f191660200182016040528015611a6b576020820181803683370190505b509050600185016020820187885189016020810180515f82525b82841015611ae0576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450611a85565b905250508515611b2157600388510660018114611b045760028114611b1757611b1f565b603d6001830353603d6002830353611b1f565b603d60018303535b505b50909695505050505050565b611b38838383611b91565b61094c576001600160a01b038316611b6657604051637e27328960e01b815260048101829052602401610854565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610854565b5f6001600160a01b03831615801590611bed5750826001600160a01b0316846001600160a01b03161480611bca5750611bca84846110f3565b80611bed57505f828152600460205260409020546001600160a01b038481169116145b949350505050565b60405180608001604052806004906020820280368337509192915050565b6001600160e01b031981168114611c28575f80fd5b50565b5f60208284031215611c3b575f80fd5b81356118d481611c13565b5f5b83811015611c60578181015183820152602001611c48565b50505f910152565b5f8151808452611c7f816020860160208601611c46565b601f01601f19169290920160200192915050565b602081525f6118d46020830184611c68565b5f60208284031215611cb5575f80fd5b5035919050565b6001600160a01b0381168114611c28575f80fd5b5f8060408385031215611ce1575f80fd5b8235611cec81611cbc565b946020939093013593505050565b5f805f60608486031215611d0c575f80fd5b8335611d1781611cbc565b92506020840135611d2781611cbc565b929592945050506040919091013590565b5f60208284031215611d48575f80fd5b81356118d481611cbc565b5f60a08284031215611d63575f80fd5b8260a083011115611d72575f80fd5b50919050565b5f8060408385031215611d89575f80fd5b8235611d9481611cbc565b915060208301358015158114611da8575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611df057611df0611db3565b604052919050565b5f67ffffffffffffffff821115611e1157611e11611db3565b50601f01601f191660200190565b5f805f8060808587031215611e32575f80fd5b8435611e3d81611cbc565b93506020850135611e4d81611cbc565b925060408501359150606085013567ffffffffffffffff811115611e6f575f80fd5b8501601f81018713611e7f575f80fd5b8035611e92611e8d82611df8565b611dc7565b818152886020838501011115611ea6575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215611ed8575f80fd5b8235611ee381611cbc565b91506020830135611da881611cbc565b600181811c90821680611f0757607f821691505b602082108103611d7257634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106a4576106a4611f25565b80820281158282048414176106a4576106a4611f25565b5f82611f7d57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156106a4576106a4611f25565b6001600160a01b038316815260c0810160a08360208401379392505050565b5f60a08284031215611fc4575f80fd5b82601f830112611fd2575f80fd5b60405160a0810167ffffffffffffffff81118282101715611ff557611ff5611db3565b6040528060a0840185811115612009575f80fd5b845b8181101561203157805160ff81168114612023575f80fd5b83526020928301920161200b565b509195945050505050565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161206157612061611f25565b5060010190565b83815260e0810160a08460208401378260c0830152949350505050565b60ff84811682528316602082015260e0810160a0836040840137949350505050565b5f602082840312156120b7575f80fd5b81516118d481611cbc565b5f602082840312156120d2575f80fd5b815167ffffffffffffffff8111156120e8575f80fd5b8201601f810184136120f8575f80fd5b8051612106611e8d82611df8565b81815285602083850101111561211a575f80fd5b61212b826020830160208601611c46565b95945050505050565b5f8151612145818560208601611c46565b9290920192915050565b683d913730b6b2911d1160b91b815284515f90612173816009850160208a01611c46565b67204d696e6572202360c01b600991840191820152855161219b816011840160208a01611c46565b6009818301019150507f222c226465736372697074696f6e223a224167656e7420466f726765204d696e60088201527f65722c20666f72676564206f6e2d636861696e2066726f6d20352052656c696360288201527f73206f6e20424e4220436861696e2e2057656967687420436f6d6d6f6e20312c60488201527f205261726520322c204c6567656e64617279203320696e20746865206d61726b60688201527f6574206665652072657761726420706f6f6c2e20556e6f6666696369616c2c2060888201527f636f6c6c65637469626c65206f6e6c792c206e6f207969656c642070726f6d6960a88201527f7365642e222c22696d616765223a22646174613a696d6167652f7376672b786d60c8820152661b0edd5d198e0b60ca1b60e88201526122cb60ef820186612134565b6f222c2261747472696275746573223a5b60801b815290506122f06010820185612134565b615d7d60f01b8152600201979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161233d81601d850160208701611c46565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061237c90830184611c68565b9695505050505050565b5f60208284031215612396575f80fd5b81516118d481611c1356fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220f72817b5cb4edfac9be80b9075d6e9fea914ccc1373feb754439aeeac18000e064736f6c634300081a0033","sourceMap":"1328:9634:21:-:0;;;3599:320;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3754:8;1380:113:2;;;;;;;;;;;;;-1:-1:-1;;;1380:113:2;;;;;;;;;;;;;;;;-1:-1:-1;;;1380:113:2;;;1454:5;1446;:13;;;;;;:::i;:::-;-1:-1:-1;1469:7:2;:17;1479:7;1469;:17;:::i;:::-;-1:-1:-1;;;;;;;;1273:26:0;;1269:95;;1322:31;;-1:-1:-1;;;1322:31:0;;1350:1;1322:31;;;3531:51:23;3504:18;;1322:31:0;;;;;;;1269:95;1373:32;1392:12;1373:18;:32::i;:::-;-1:-1:-1;3778:3:21::2;:25:::0;;-1:-1:-1;;;;;;3778:25:21::2;-1:-1:-1::0;;;;;3778:25:21;;::::2;::::0;;;::::2;::::0;;;3813:19;::::2;;::::0;3842:23:::2;::::0;;;3883:29:::2;::::0;3903:8;;3883:29:::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;;;;;3549:32:23;;;3531:51;;3519:2;3504:18;3883:29:21::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;;;3875:37:21::2;;::::0;-1:-1:-1;1328:9634:21;;-1:-1:-1;;;1328:9634:21;2912:187:0;3004:6;;;-1:-1:-1;;;;;3020:17:0;;;-1:-1:-1;;;;;;3020:17:0;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;1328:9634:21:-;;;;;;;;:::o;14:131:23:-;-1:-1:-1;;;;;89:31:23;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:589::-;255:6;263;271;279;332:3;320:9;311:7;307:23;303:33;300:53;;;349:1;346;339:12;300:53;381:9;375:16;400:31;425:5;400:31;:::i;:::-;500:2;485:18;;479:25;450:5;;-1:-1:-1;513:33:23;479:25;513:33;:::i;:::-;617:2;602:18;;596:25;565:7;;-1:-1:-1;630:33:23;596:25;630:33;:::i;:::-;729:2;714:18;;;;708:25;150:589;;;;-1:-1:-1;;;150:589:23:o;744:127::-;805:10;800:3;796:20;793:1;786:31;836:4;833:1;826:15;860:4;857:1;850:15;876:380;955:1;951:12;;;;998;;;1019:61;;1073:4;1065:6;1061:17;1051:27;;1019:61;1126:2;1118:6;1115:14;1095:18;1092:38;1089:161;;1172:10;1167:3;1163:20;1160:1;1153:31;1207:4;1204:1;1197:15;1235:4;1232:1;1225:15;1089:161;;876:380;;;:::o;1387:518::-;1489:2;1484:3;1481:11;1478:421;;;1525:5;1522:1;1515:16;1569:4;1566:1;1556:18;1639:2;1627:10;1623:19;1620:1;1616:27;1610:4;1606:38;1675:4;1663:10;1660:20;1657:47;;;-1:-1:-1;1698:4:23;1657:47;1753:2;1748:3;1744:12;1741:1;1737:20;1731:4;1727:31;1717:41;;1808:81;1826:2;1819:5;1816:13;1808:81;;;1885:1;1871:16;;1852:1;1841:13;1808:81;;;1812:3;;1478:421;1387:518;;;:::o;2081:1299::-;2201:10;;-1:-1:-1;;;;;2223:30:23;;2220:56;;;2256:18;;:::i;:::-;2285:97;2375:6;2335:38;2367:4;2361:11;2335:38;:::i;:::-;2329:4;2285:97;:::i;:::-;2431:4;2462:2;2451:14;;2479:1;2474:649;;;;3167:1;3184:6;3181:89;;;-1:-1:-1;3236:19:23;;;3230:26;3181:89;-1:-1:-1;;2038:1:23;2034:11;;;2030:24;2026:29;2016:40;2062:1;2058:11;;;2013:57;3283:81;;2444:930;;2474:649;1334:1;1327:14;;;1371:4;1358:18;;-1:-1:-1;;2510:20:23;;;2628:222;2642:7;2639:1;2636:14;2628:222;;;2724:19;;;2718:26;2703:42;;2831:4;2816:20;;;;2784:1;2772:14;;;;2658:12;2628:222;;;2632:3;2878:6;2869:7;2866:19;2863:201;;;2939:19;;;2933:26;-1:-1:-1;;3022:1:23;3018:14;;;3034:3;3014:24;3010:37;3006:42;2991:58;2976:74;;2863:201;-1:-1:-1;;;;3110:1:23;3094:14;;;3090:22;3077:36;;-1:-1:-1;2081:1299:23:o;3385:203::-;1328:9634:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"6080604052600436106102bf575f3560e01c806370a082311161016f578063a624c3db116100d8578063d89135cd11610092578063e905182a1161006d578063e905182a14610853578063e985e9c51461087a578063f2fde38b14610899578063fc659491146108b8575f80fd5b8063d89135cd1461080b578063e6b1a3ae14610820578063e8a3d4851461083f575f80fd5b8063a624c3db1461075d578063b88d4fde14610790578063bce6d672146107af578063c87b56dd146107c3578063cd90e5af146107e2578063d21ff494146107f6575f80fd5b806396d597171161012957806396d59717146106ba5780639ba06ab8146106ed578063a0712d6814610702578063a22cb46514610715578063a2309ff814610734578063a475b5dd14610749575f80fd5b806370a082311461061d578063715018a61461063c5780638d859f3e146106505780638da5cb5b1461066a5780638f79306e1461068757806395d89b41146106a6575f80fd5b806324bbd0491161022b57806342842e0e116101e55780636352211e116101c05780636352211e146105845780636373a6b1146105a357806369d2ceb1146105d65780636e303cad146105f2575f80fd5b806342842e0e146105325780634ae23bd7146105515780635183022714610566575f80fd5b806324bbd04914610487578063263f3e7e146104a0578063301bd28e146104bf57806332cb6b0c146104de5780633ccfd60b146104f35780633cef28d214610507575f80fd5b8063193ee7b51161027c578063193ee7b5146103a6578063204aecb1146103d25780632097ac3b146103e757806322acaf04146103fc57806323b872dd1461043757806323f1892014610456575f80fd5b806301ffc9a7146102c357806306fdde03146102f7578063081812fc14610318578063095ea7b31461034f5780630f2cdd6c1461037057806318160ddd14610392575b5f80fd5b3480156102ce575f80fd5b506102e26102dd366004612156565b6108ce565b60405190151581526020015b60405180910390f35b348015610302575f80fd5b5061030b61091f565b6040516102ee91906121be565b348015610323575f80fd5b506103376103323660046121d0565b6109ae565b6040516001600160a01b0390911681526020016102ee565b34801561035a575f80fd5b5061036e610369366004612202565b6109d5565b005b34801561037b575f80fd5b50610384600a81565b6040519081526020016102ee565b34801561039d575f80fd5b506103846109e4565b3480156103b1575f80fd5b506103c56103c036600461222a565b6109fa565b6040516102ee9190612261565b3480156103dd575f80fd5b50610384600c5481565b3480156103f2575f80fd5b50610384600b5481565b348015610407575f80fd5b5061041b6104163660046121d0565b610b67565b6040805160ff909316835261ffff9091166020830152016102ee565b348015610442575f80fd5b5061036e610451366004612294565b610c25565b348015610461575f80fd5b506104756104703660046121d0565b610cae565b60405160ff90911681526020016102ee565b348015610492575f80fd5b50600a546102e29060ff1681565b3480156104ab575f80fd5b506103846104ba3660046121d0565b610cc2565b3480156104ca575f80fd5b50600754610337906001600160a01b031681565b3480156104e9575f80fd5b5061038461138881565b3480156104fe575f80fd5b5061036e610d3e565b348015610512575f80fd5b506103846105213660046122ce565b600d6020525f908152604090205481565b34801561053d575f80fd5b5061036e61054c366004612294565b610e27565b34801561055c575f80fd5b506103846104e281565b348015610571575f80fd5b50600a546102e290610100900460ff1681565b34801561058f575f80fd5b5061033761059e3660046121d0565b610e46565b3480156105ae575f80fd5b506103847f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e1575f80fd5b50600a54610100900460ff166102e2565b3480156105fd575f80fd5b5061038461060c3660046121d0565b600e6020525f908152604090205481565b348015610628575f80fd5b506103846106373660046122ce565b610e50565b348015610647575f80fd5b5061036e610e95565b34801561065b575f80fd5b506103846601c6bf5263400081565b348015610675575f80fd5b506006546001600160a01b0316610337565b348015610692575f80fd5b506103846106a1366004612202565b610ea8565b3480156106b1575f80fd5b5061030b610f10565b3480156106c5575f80fd5b506103377f000000000000000000000000000000000000000000000000000000000000000081565b3480156106f8575f80fd5b5061038461119481565b61036e6107103660046121d0565b610f1f565b348015610720575f80fd5b5061036e61072f3660046122e7565b611108565b34801561073f575f80fd5b5061038460085481565b348015610754575f80fd5b5061036e611113565b348015610768575f80fd5b506103377f000000000000000000000000000000000000000000000000000000000000000081565b34801561079b575f80fd5b5061036e6107aa36600461238c565b61125d565b3480156107ba575f80fd5b5061036e611275565b3480156107ce575f80fd5b5061030b6107dd3660046121d0565b6112b4565b3480156107ed575f80fd5b50610384600281565b348015610801575f80fd5b506103846106c081565b348015610816575f80fd5b5061038460095481565b34801561082b575f80fd5b5061036e61083a3660046122ce565b61152b565b34801561084a575f80fd5b5061030b6115b0565b34801561085e575f80fd5b506103377360b9262456de011f7d15a54cdd8c48baaa8b022f81565b348015610885575f80fd5b506102e2610894366004612430565b611641565b3480156108a4575f80fd5b5061036e6108b33660046122ce565b61166e565b3480156108c3575f80fd5b506103846212750081565b5f6001600160e01b031982166380ac58cd60e01b14806108fe57506001600160e01b03198216635b5e139f60e01b145b8061091957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f805461092d90612461565b80601f016020809104026020016040519081016040528092919081815260200182805461095990612461565b80156109a45780601f1061097b576101008083540402835291602001916109a4565b820191905f5260205f20905b81548152906001019060200180831161098757829003601f168201915b5050505050905090565b5f6109b8826116ab565b505f828152600460205260409020546001600160a01b0316610919565b6109e08282336116e3565b5050565b5f6009546008546109f591906124ad565b905090565b610a02612123565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a4b5760405163f3883b7560e01b815260040160405180910390fd5b600a54610100900460ff16610a7357604051631659379160e31b815260040160405180910390fd5b5f5b6005811015610b4857836001600160a01b0316610abc848360058110610a9d57610a9d6124c0565b60200201355f908152600260205260409020546001600160a01b031690565b6001600160a01b031614610ae3576040516359dc379f60e01b815260040160405180910390fd5b610b02838260058110610af857610af86124c0565b6020020135610cae565b828260058110610b1457610b146124c0565b60ff9092166020929092020152610b40838260058110610b3657610b366124c0565b60200201356116f0565b600101610a75565b50600560095f828254610b5b91906124d4565b90915550909392505050565b5f806113888310610bac5760405162461bcd60e51b8152600401610ba3906020808252600490820152631cdb1bdd60e21b604082015260600190565b60405180910390fd5b6104e2610bb884611728565b610bc291906124fb565b604080517f1d03a41ff33612e152ff5fa34d0d3c0f1e464becfd80c3cf15b9494ac7bc60db60208201529081018590529092506106c090606001604051602081830303815290604052805190602001205f1c610c1e919061250e565b9050915091565b6001600160a01b038216610c4e57604051633250574960e11b81525f6004820152602401610ba3565b5f610c5a8383336117be565b9050836001600160a01b0316816001600160a01b031614610ca8576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610ba3565b50505050565b5f610cbb61041683610cc2565b5092915050565b600a545f90610100900460ff16610cec57604051631659379160e31b815260040160405180910390fd5b811580610cfa575060085482115b15610d18576040516379d93f4960e01b815260040160405180910390fd5b600b5461138890610d2a6001856124ad565b610d3491906124d4565b610919919061250e565b60405147905f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169083908381818185875af1925050503d805f8114610da8576040519150601f19603f3d011682016040523d82523d5f602084013e610dad565b606091505b5050905080610df05760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610ba3565b6040518281527f430648de173157e069201c943adb2d4e340e7cf5b27b1b09c9cb852f03d63b569060200160405180910390a15050565b610e4183838360405180602001604052805f81525061125d565b505050565b5f610919826116ab565b5f6001600160a01b038216610e7a576040516322718ad960e21b81525f6004820152602401610ba3565b506001600160a01b03165f9081526003602052604090205490565b610e9d611818565b610ea65f611845565b565b6001600160a01b0382165f908152600d6020526040812054816002821015610eda57610ed58260026124ad565b610edc565b5f5b9050808411610eeb575f610f07565b6601c6bf52634000610efd82866124ad565b610f079190612521565b95945050505050565b60606001805461092d90612461565b600a5460ff16610f425760405163589ed34b60e01b815260040160405180910390fd5b6040516370a0823160e01b81523360048201527360b9262456de011f7d15a54cdd8c48baaa8b022f906370a0823190602401602060405180830381865afa158015610f8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fb39190612538565b5f03610fd257604051630d9ab13f60e01b815260040160405180910390fd5b805f03610ff257604051635caa42ff60e01b815260040160405180910390fd5b60085461138861100283836124d4565b1115611021576040516352df9fe560e01b815260040160405180910390fd5b335f908152600d6020526040902054600a9061103e9084906124d4565b111561105c5760405162a84d4b60e71b815260040160405180910390fd5b6110663383610ea8565b34146110855760405163788a686f60e01b815260040160405180910390fd5b335f908152600d6020526040812080548492906110a39084906124d4565b909155506110b3905082826124d4565b600855600c541580156110d157506111946110ce83836124d4565b10155b156110db5742600c555b60015b828111610e41576110f8336110f383856124d4565b611896565b6111018161254f565b90506110de565b6109e03383836118f7565b600a54610100900460ff161561113c5760405163a89ac15160e01b815260040160405180910390fd5b61119460085410156111615760405163c349402d60e01b815260040160405180910390fd5b6006546001600160a01b0316331480159061117f5750611388600854105b801561119a575062127500600c5461119791906124d4565b42105b156111b85760405163c349402d60e01b815260040160405180910390fd5b611388446111c76001436124ad565b600854604080516020810194909452914091830191909152606082015230608082015260a001604051602081830303815290604052805190602001205f1c61120f919061250e565b600b819055600a805461ff001916610100179055604080519182523360208301527f6e9dac3f3f833c1d527aa989d3a673884ddc11e31fdccc11ccd8aebf1ae069ac910160405180910390a1565b611268848484610c25565b610ca83385858585611995565b61127d611818565b600a805460ff191660011790556040517f4301b55b3d4fd9018308a6bd66bf37880623a9548566d1b12867ab619a993ca1905f90a1565b60606112bf826116ab565b506060806060600a60019054906101000a900460ff16611390576112e285611abd565b6040516020016112f29190612582565b60408051808303601f190181529082905260075463c1b27b6160e01b8352600483018890529094506001600160a01b03169063c1b27b61906024015f60405180830381865afa158015611347573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261136e91908101906125b7565b9150604051806060016040528060288152602001612a176028913990506114d6565b5f8061139e61041688610cc2565b915091506113ae8260ff16611b4d565b6113b788611abd565b6040516020016113c8929190612620565b60408051808303601f19018152908290526007546399faa5b360e01b8352600483018a905260ff8516602484015261ffff841660448401529096506001600160a01b0316906399faa5b3906064015f60405180830381865afa158015611430573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261145791908101906125b7565b6007546040516318f6670d60e21b815260ff8516600482015261ffff841660248201529195506001600160a01b0316906363d99c34906044015f60405180830381865afa1580156114aa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114d191908101906125b7565b925050505b6115028383836040516020016114ee93929190612662565b604051602081830303815290604052611bed565b60405160200161151291906127cf565b6040516020818303038152906040529350505050919050565b611533611818565b600a54610100900460ff161561155c576040516313ef243160e11b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527f89382d75256b43b6826ad8d6cbd8e517eaf5e10f1ef4c8f123c9a25ac4529b559060200160405180910390a150565b60075460405163c1b27b6160e01b81525f60048201526060916001600160a01b03169063c1b27b61906024015f60405180830381865afa1580156115f6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261161d91908101906125b7565b60405160200161162d9190612813565b604051602081830303815290604052905090565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b611676611818565b6001600160a01b03811661169f57604051631e4fbdf760e01b81525f6004820152602401610ba3565b6116a881611845565b50565b5f818152600260205260408120546001600160a01b03168061091957604051637e27328960e01b815260048101849052602401610ba3565b610e418383836001611c13565b5f6116fc5f835f6117be565b90506001600160a01b0381166109e057604051637e27328960e01b815260048101839052602401610ba3565b5f5b600782901c607f83165f5b60048110156117a657604080517f1d03a41ff33612e152ff5fa34d0d3c0f1e464becfd80c3cf15b9494ac7bc60db6020820152908101829052606081018390525f9060800160408051808303601f1901815291905280516020909101209293607f9093169092189150600101611735565b5060079190911b17915061138882101561172a575090565b5f6117ca848484611d17565b90506001600160a01b038116158015906117ec57506001600160a01b03841615155b15611811575f838152600e60205260408120805490919061180c9061254f565b909155505b9392505050565b6006546001600160a01b03163314610ea65760405163118cdaa760e01b8152336004820152602401610ba3565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166118bf57604051633250574960e11b81525f6004820152602401610ba3565b5f6118cb83835f6117be565b90506001600160a01b03811615610e41576040516339e3563760e11b81525f6004820152602401610ba3565b6001600160a01b03821661192957604051630b61174360e31b81526001600160a01b0383166004820152602401610ba3565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b15611ab657604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906119d790889088908790879060040161297f565b6020604051808303815f875af1925050508015611a11575060408051601f3d908101601f19168201909252611a0e918101906129bb565b60015b611a78573d808015611a3e576040519150601f19603f3d011682016040523d82523d5f602084013e611a43565b606091505b5080515f03611a7057604051633250574960e11b81526001600160a01b0385166004820152602401610ba3565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b14611ab457604051633250574960e11b81526001600160a01b0385166004820152602401610ba3565b505b5050505050565b60605f611ac983611e09565b60010190505f8167ffffffffffffffff811115611ae857611ae8612320565b6040519080825280601f01601f191660200182016040528015611b12576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611b1c57509392505050565b6060815f03611b765750506040805180820190915260048152634669726560e01b602082015290565b81600103611b9f5750506040805180820190915260058152642bb0ba32b960d91b602082015290565b81600203611bc857505060408051808201909152600581526408ac2e4e8d60db1b602082015290565b50506040805180820190915260098152684c696768746e696e6760b81b602082015290565b6060610919826040518060600160405280604081526020016129d7604091396001611ee0565b8080611c2757506001600160a01b03821615155b15611ce8575f611c36846116ab565b90506001600160a01b03831615801590611c625750826001600160a01b0316816001600160a01b031614155b8015611c755750611c738184611641565b155b15611c9e5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610ba3565b8115611ce65783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f828152600260205260408120546001600160a01b0390811690831615611d4357611d4381848661205b565b6001600160a01b03811615611d7d57611d5e5f855f80611c13565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615611dab576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e475772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611e73576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611e9157662386f26fc10000830492506010015b6305f5e1008310611ea9576305f5e100830492506008015b6127108310611ebd57612710830492506004015b60648310611ecf576064830492506002015b600a83106109195760010192915050565b606083515f03611efe575060408051602081019091525f8152611811565b5f82611f2e57600385516004611f149190612521565b611f1f9060026124d4565b611f2991906124fb565b611f53565b600385516002611f3e91906124d4565b611f4891906124fb565b611f53906004612521565b90505f8167ffffffffffffffff811115611f6f57611f6f612320565b6040519080825280601f01601f191660200182016040528015611f99576020820181803683370190505b509050600185016020820187885189016020810180515f82525b8284101561200e576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450611fb3565b90525050851561204f5760038851066001811461203257600281146120455761204d565b603d6001830353603d600283035361204d565b603d60018303535b505b50909695505050505050565b6120668383836120bf565b610e41576001600160a01b03831661209457604051637e27328960e01b815260048101829052602401610ba3565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610ba3565b5f6001600160a01b0383161580159061211b5750826001600160a01b0316846001600160a01b031614806120f857506120f88484611641565b8061211b57505f828152600460205260409020546001600160a01b038481169116145b949350505050565b6040518060a001604052806005906020820280368337509192915050565b6001600160e01b0319811681146116a8575f80fd5b5f60208284031215612166575f80fd5b813561181181612141565b5f5b8381101561218b578181015183820152602001612173565b50505f910152565b5f81518084526121aa816020860160208601612171565b601f01601f19169290920160200192915050565b602081525f6118116020830184612193565b5f602082840312156121e0575f80fd5b5035919050565b80356001600160a01b03811681146121fd575f80fd5b919050565b5f8060408385031215612213575f80fd5b61221c836121e7565b946020939093013593505050565b5f8060c0838503121561223b575f80fd5b612244836121e7565b91508360c084011115612255575f80fd5b50926020919091019150565b60a0810181835f5b600581101561228b57815160ff16835260209283019290910190600101612269565b50505092915050565b5f805f606084860312156122a6575f80fd5b6122af846121e7565b92506122bd602085016121e7565b929592945050506040919091013590565b5f602082840312156122de575f80fd5b611811826121e7565b5f80604083850312156122f8575f80fd5b612301836121e7565b915060208301358015158114612315575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561235d5761235d612320565b604052919050565b5f67ffffffffffffffff82111561237e5761237e612320565b50601f01601f191660200190565b5f805f806080858703121561239f575f80fd5b6123a8856121e7565b93506123b6602086016121e7565b925060408501359150606085013567ffffffffffffffff8111156123d8575f80fd5b8501601f810187136123e8575f80fd5b80356123fb6123f682612365565b612334565b81815288602083850101111561240f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215612441575f80fd5b61244a836121e7565b9150612458602084016121e7565b90509250929050565b600181811c9082168061247557607f821691505b60208210810361249357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561091957610919612499565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561091957610919612499565b634e487b7160e01b5f52601260045260245ffd5b5f82612509576125096124e7565b500490565b5f8261251c5761251c6124e7565b500690565b808202811582820484141761091957610919612499565b5f60208284031215612548575f80fd5b5051919050565b5f6001820161256057612560612499565b5060010190565b5f8151612578818560208601612171565b9290920192915050565b6d5365616c65642052656c6963202360901b81525f82516125aa81600e850160208701612171565b91909101600e0192915050565b5f602082840312156125c7575f80fd5b815167ffffffffffffffff8111156125dd575f80fd5b8201601f810184136125ed575f80fd5b80516125fb6123f682612365565b81815285602083850101111561260f575f80fd5b610f07826020830160208601612171565b5f8351612631818460208801612171565b672052656c6963202360c01b9083019081528351612656816008840160208801612171565b01600801949350505050565b683d913730b6b2911d1160b91b815283515f90612686816009850160208901612171565b7f222c226465736372697074696f6e223a224167656e7420466f7267653a20352c6009918401918201527f303030206f6e2d636861696e20706978656c2072656c69637320666f72202e6160298201527f69204167656e7420494420686f6c64657273206f6e20424e4220436861696e2e60498201527f20466f72676520352052656c69637320696e746f2031204d696e65722e20556e60698201527f6f6666696369616c2c20636f6c6c65637469626c65206f6e6c792c206e6f207960898201527f69656c642070726f6d697365642e222c22696d616765223a22646174613a696d60a9820152701859d94bdcdd99cade1b5b0edd5d198e0b607a1b60c982015261279560da820186612567565b6f222c2261747472696275746573223a5b60801b815290506127ba6010820185612567565b615d7d60f01b81526002019695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161280681601d850160208701612171565b91909101601d0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081527f7b226e616d65223a224167656e7420466f7267652052656c6963222c22646573601b8201527f6372697074696f6e223a22352c303030206f6e2d636861696e20706978656c20603b8201527f72656c69637320696e20666f757220656c656d656e747320666f72202e616920605b8201527f4167656e7420494420686f6c64657273206f6e20424e4220436861696e2e2042607b8201527f75726e203520696e2074686520466f72676520746f206d696e742061204d696e609b8201527f65722e20556e6f6666696369616c2c20636f6c6c65637469626c65206f6e6c7960bb8201527f2e222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b7560db820152631d198e0b60e21b60fb8201525f82516129618160ff850160208701612171565b820161297460ff820161227d60f01b9052565b610101019392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906129b190830184612193565b9695505050505050565b5f602082840312156129cb575f80fd5b81516118118161214156fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f7b2274726169745f74797065223a22537461747573222c2276616c7565223a225365616c6564227da264697066735822122048023ede6f67d3681b9045c99c65b5db0a558760d9abe82b0ee0e395dd37670764736f6c634300081a0033","sourceMap":"1328:9634:21:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1560:300:2;;;;;;;;;;-1:-1:-1;1560:300:2;;;;;:::i;:::-;;:::i;:::-;;;565:14:23;;558:22;540:41;;528:2;513:18;1560:300:2;;;;;;;;2364:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3496:154::-;;;;;;;;;;-1:-1:-1;3496:154:2;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1765:32:23;;;1747:51;;1735:2;1720:18;3496:154:2;1601:203:23;3322:113:2;;;;;;;;;;-1:-1:-1;3322:113:2;;;;;:::i;:::-;;:::i;:::-;;1649:43:21;;;;;;;;;;;;1690:2;1649:43;;;;;2438:25:23;;;2426:2;2411:18;1649:43:21;2292:177:23;5007:104:21;;;;;;;;;;;;;:::i;7547:475::-;;;;;;;;;;-1:-1:-1;7547:475:21;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2881:33::-;;;;;;;;;;;;;;;;2848:27;;;;;;;;;;;;;;;;6249:268;;;;;;;;;;-1:-1:-1;6249:268:21;;;;;:::i;:::-;;:::i;:::-;;;;3488:4:23;3476:17;;;3458:36;;3542:6;3530:19;;;3525:2;3510:18;;3503:47;3431:18;6249:268:21;3290:266:23;4142:578:2;;;;;;;;;;-1:-1:-1;4142:578:2;;;;;:::i;:::-;;:::i;6751:118:21:-;;;;;;;;;;-1:-1:-1;6751:118:21;;;;;:::i;:::-;;:::i;:::-;;;4112:4:23;4100:17;;;4082:36;;4070:2;4055:18;6751:118:21;3940:184:23;2796:20:21;;;;;;;;;;-1:-1:-1;2796:20:21;;;;;;;;6523:222;;;;;;;;;;-1:-1:-1;6523:222:21;;;;;:::i;:::-;;:::i;2706:20::-;;;;;;;;;;-1:-1:-1;2706:20:21;;;;-1:-1:-1;;;;;2706:20:21;;;1493:41;;;;;;;;;;;;1530:4;1493:41;;10757:203;;;;;;;;;;;;;:::i;2921:43::-;;;;;;;;;;-1:-1:-1;2921:43:21;;;;;:::i;:::-;;;;;;;;;;;;;;4786:132:2;;;;;;;;;;-1:-1:-1;4786:132:2;;;;;:::i;:::-;;:::i;1748:42:21:-;;;;;;;;;;;;1786:4;1748:42;;2822:20;;;;;;;;;;-1:-1:-1;2822:20:21;;;;;;;;;;;2184:118:2;;;;;;;;;;-1:-1:-1;2184:118:2;;;;;:::i;:::-;;:::i;2433:35:21:-;;;;;;;;;;;;;;;5987:87;;;;;;;;;;-1:-1:-1;6059:8:21;;;;;;;5987:87;;3078:48;;;;;;;;;;-1:-1:-1;3078:48:21;;;;;:::i;:::-;;;;;;;;;;;;;;1919:208:2;;;;;;;;;;-1:-1:-1;1919:208:2;;;;;:::i;:::-;;:::i;2293:101:0:-;;;;;;;;;;;;;:::i;1698:44:21:-;;;;;;;;;;;;1730:12;1698:44;;1638:85:0;;;;;;;;;;-1:-1:-1;1710:6:0;;-1:-1:-1;;;;;1710:6:0;1638:85;;4040:253:21;;;;;;;;;;-1:-1:-1;4040:253:21;;;;;:::i;:::-;;:::i;2517:93:2:-;;;;;;;;;;;;;:::i;2661:38:21:-;;;;;;;;;;;;;;;1540:47;;;;;;;;;;;;1583:4;1540:47;;4299:702;;;;;;:::i;:::-;;:::i;3717:144:2:-;;;;;;;;;;-1:-1:-1;3717:144:2;;;;;:::i;:::-;;:::i;2732:26:21:-;;;;;;;;;;;;;;;;5358:530;;;;;;;;;;;;;:::i;2527:41::-;;;;;;;;;;;;;;;4984:233:2;;;;;;;;;;-1:-1:-1;4984:233:2;;;;;:::i;:::-;;:::i;10223:98:21:-;;;;;;;;;;;;;:::i;8305:1106::-;;;;;;;;;;-1:-1:-1;8305:1106:21;;;;;:::i;:::-;;:::i;1600:43::-;;;;;;;;;;;;1642:1;1600:43;;1796:38;;;;;;;;;;;;1830:4;1796:38;;2764:26;;;;;;;;;;;;;;;;10441:171;;;;;;;;;;-1:-1:-1;10441:171:21;;;;;:::i;:::-;;:::i;9417:431::-;;;;;;;;;;;;;:::i;2067:88::-;;;;;;;;;;;;2112:42;2067:88;;3927:153:2;;;;;;;;;;-1:-1:-1;3927:153:2;;;;;:::i;:::-;;:::i;2543:215:0:-;;;;;;;;;;-1:-1:-1;2543:215:0;;;;;:::i;:::-;;:::i;2008:53:21:-;;;;;;;;;;;;2054:7;2008:53;;1560:300:2;1662:4;-1:-1:-1;;;;;;1697:40:2;;-1:-1:-1;;;1697:40:2;;:104;;-1:-1:-1;;;;;;;1753:48:2;;-1:-1:-1;;;1753:48:2;1697:104;:156;;;-1:-1:-1;;;;;;;;;;862:40:12;;;1817:36:2;1678:175;1560:300;-1:-1:-1;;1560:300:2:o;2364:89::-;2409:13;2441:5;2434:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2364:89;:::o;3496:154::-;3563:7;3582:22;3596:7;3582:13;:22::i;:::-;-1:-1:-1;6033:7:2;6059:24;;;:15;:24;;;;;;-1:-1:-1;;;;;6059:24:2;3622:21;5963:127;3322:113;3393:35;3402:2;3406:7;735:10:8;3393:8:2;:35::i;:::-;3322:113;;:::o;5007:104:21:-;5053:7;5093:11;;5079;;:25;;;;:::i;:::-;5072:32;;5007:104;:::o;7547:475::-;7623:24;;:::i;:::-;7663:10;-1:-1:-1;;;;;7685:5:21;7663:28;;7659:52;;7700:11;;-1:-1:-1;;;7700:11:21;;;;;;;;;;;7659:52;7726:8;;;;;;;7721:35;;7743:13;;-1:-1:-1;;;7743:13:21;;;;;;;;;;;7721:35;7771:9;7766:224;7786:1;7782;:5;7766:224;;;7832:4;-1:-1:-1;;;;;7812:24:21;:16;7821:3;7825:1;7821:6;;;;;;;:::i;:::-;;;;;5798:7:2;5824:16;;;:7;:16;;;;;;-1:-1:-1;;;;;5824:16:2;;5732:115;7812:16:21;-1:-1:-1;;;;;7812:24:21;;7808:52;;7845:15;;-1:-1:-1;;;7845:15:21;;;;;;;;;;;7808:52;7935:17;7945:3;7949:1;7945:6;;;;;;;:::i;:::-;;;;;7935:9;:17::i;:::-;7921:8;7930:1;7921:11;;;;;;;:::i;:::-;:31;;;;:11;;;;;;:31;7966:13;7972:3;7976:1;7972:6;;;;;;;:::i;:::-;;;;;7966:5;:13::i;:::-;7789:3;;7766:224;;;;8014:1;7999:11;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;7547:475:21;;;-1:-1:-1;;;7547:475:21:o;6249:268::-;6302:13;6317;1530:4;6350;:17;6342:34;;;;-1:-1:-1;;;6342:34:21;;;;;;8706:2:23;8688:21;;;8745:1;8725:18;;;8718:29;-1:-1:-1;;;8778:2:23;8763:18;;8756:34;8822:2;8807:18;;8504:327;6342:34:21;;;;;;;;;1786:4;6402:11;6408:4;6402:5;:11::i;:::-;:25;;;;:::i;:::-;6472;;;2196:39;6472:25;;;9267::23;9308:18;;;9301:34;;;6386:42:21;;-1:-1:-1;1830:4:21;;9240:18:23;;6472:25:21;;;;;;;;;;;;6462:36;;;;;;6454:45;;:55;;;;:::i;:::-;6438:72;;6249:268;;;:::o;4142:578:2:-;-1:-1:-1;;;;;4236:16:2;;4232:87;;4275:33;;-1:-1:-1;;;4275:33:2;;4305:1;4275:33;;;1747:51:23;1720:18;;4275:33:2;1601:203:23;4232:87:2;4537:21;4561:34;4569:2;4573:7;735:10:8;4561:7:2;:34::i;:::-;4537:58;;4626:4;-1:-1:-1;;;;;4609:21:2;:13;-1:-1:-1;;;;;4609:21:2;;4605:109;;4653:50;;-1:-1:-1;;;4653:50:2;;-1:-1:-1;;;;;9683:32:23;;;4653:50:2;;;9665:51:23;9732:18;;;9725:34;;;9795:32;;9775:18;;;9768:60;9638:18;;4653:50:2;9463:371:23;4605:109:2;4222:498;4142:578;;;:::o;6751:118:21:-;6803:13;6842:20;6851:10;6858:2;6851:6;:10::i;6842:20::-;-1:-1:-1;6828:34:21;6751:118;-1:-1:-1;;6751:118:21:o;6523:222::-;6596:8;;6572:7;;6596:8;;;;;6591:35;;6613:13;;-1:-1:-1;;;6613:13:21;;;;;;;;;;;6591:35;6640:7;;;:27;;;6656:11;;6651:2;:16;6640:27;6636:49;;;6676:9;;-1:-1:-1;;;6676:9:21;;;;;;;;;;;6636:49;6712:12;;1530:4;;6703:6;6708:1;6703:2;:6;:::i;:::-;:21;;;;:::i;:::-;6702:36;;;;:::i;10757:203::-;10855:29;;10810:21;;10796:11;;-1:-1:-1;;;;;10855:8:21;:13;;10810:21;;10796:11;10855:29;10796:11;10855:29;10810:21;10855:13;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10841:43;;;10902:2;10894:30;;;;-1:-1:-1;;;10894:30:21;;10251:2:23;10894:30:21;;;10233:21:23;10290:2;10270:18;;;10263:30;-1:-1:-1;;;10309:18:23;;;10302:45;10364:18;;10894:30:21;10049:339:23;10894:30:21;10939:14;;2438:25:23;;;10939:14:21;;2426:2:23;2411:18;10939:14:21;;;;;;;10786:174;;10757:203::o;4786:132:2:-;4872:39;4889:4;4895:2;4899:7;4872:39;;;;;;;;;;;;:16;:39::i;:::-;4786:132;;;:::o;2184:118::-;2247:7;2273:22;2287:7;2273:13;:22::i;1919:208::-;1982:7;-1:-1:-1;;;;;2005:19:2;;2001:87;;2047:30;;-1:-1:-1;;;2047:30:2;;2074:1;2047:30;;;1747:51:23;1720:18;;2047:30:2;1601:203:23;2001:87:2;-1:-1:-1;;;;;;2104:16:2;;;;;:9;:16;;;;;;;1919:208::o;2293:101:0:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;:::-;2293:101::o:0;4040:253:21:-;-1:-1:-1;;;;;4139:16:21;;4105:7;4139:16;;;:8;:16;;;;;;4105:7;1642:1;4180:23;;;:52;;4210:22;4228:4;1642:1;4210:22;:::i;:::-;4180:52;;;4206:1;4180:52;4165:67;;4255:4;4249:3;:10;:37;;4285:1;4249:37;;;1730:12;4263:10;4269:4;4263:3;:10;:::i;:::-;4262:20;;;;:::i;:::-;4242:44;4040:253;-1:-1:-1;;;;;4040:253:21:o;2517:93:2:-;2564:13;2596:7;2589:14;;;;;:::i;4299:702:21:-;4358:8;;;;4353:34;;4375:12;;-1:-1:-1;;;4375:12:21;;;;;;;;;;;4353:34;4401:30;;-1:-1:-1;;;4401:30:21;;4420:10;4401:30;;;1747:51:23;2112:42:21;;4401:18;;1720::23;;4401:30:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4435:1;4401:35;4397:58;;4445:10;;-1:-1:-1;;;4445:10:21;;;;;;;;;;;4397:58;4469:3;4476:1;4469:8;4465:30;;4486:9;;-1:-1:-1;;;4486:9:21;;;;;;;;;;;4465:30;4521:11;;1530:4;4546:11;4554:3;4521:11;4546;:::i;:::-;:24;4542:46;;;4579:9;;-1:-1:-1;;;4579:9:21;;;;;;;;;;;4542:46;4611:10;4602:20;;;;:8;:20;;;;;;1690:2;;4602:26;;4625:3;;4602:26;:::i;:::-;:43;4598:69;;;4654:13;;-1:-1:-1;;;4654:13:21;;;;;;;;;;;4598:69;4694:22;4700:10;4712:3;4694:5;:22::i;:::-;4681:9;:35;4677:62;;4725:14;;-1:-1:-1;;;4725:14:21;;;;;;;;;;;4677:62;4758:10;4749:20;;;;:8;:20;;;;;:27;;4773:3;;4749:20;:27;;4773:3;;4749:27;:::i;:::-;;;;-1:-1:-1;4800:11:21;;-1:-1:-1;4808:3:21;4800:5;:11;:::i;:::-;4786;:25;4825:18;;:23;:58;;;;-1:-1:-1;1583:4:21;4852:11;4860:3;4852:5;:11;:::i;:::-;:31;;4825:58;4821:100;;;4906:15;4885:18;:36;4821:100;4948:1;4931:63;4956:3;4951:1;:8;4931:63;;4966:28;4972:10;4984:9;4992:1;4984:5;:9;:::i;:::-;4966:5;:28::i;:::-;4961:3;;;:::i;:::-;;;4931:63;;3717:144:2;3802:52;735:10:8;3835:8:2;3845;3802:18;:52::i;5358:530:21:-;5399:8;;;;;;;5395:38;;;5416:17;;-1:-1:-1;;;5416:17:21;;;;;;;;;;;5395:38;1583:4;5447:11;;:30;5443:59;;;5486:16;;-1:-1:-1;;;5486:16:21;;;;;;;;;;;5443:59;1710:6:0;;-1:-1:-1;;;;;1710:6:0;5516:10:21;:21;;;;:49;;;1530:4;5541:11;;:24;5516:49;:123;;;;;2054:7;5599:18;;:40;;;;:::i;:::-;5581:15;:58;5516:123;5512:152;;;5648:16;;-1:-1:-1;;;5648:16:21;;;;;;;;;;;5512:152;1530:4;5718:16;5746;5761:1;5746:12;:16;:::i;:::-;5765:11;;5707:85;;;;;;11126:25:23;;;;5736:27:21;;11167:18:23;;;11160:34;;;;11210:18;;;11203:34;5786:4:21;11253:18:23;;;11246:60;11098:19;;5707:85:21;;;;;;;;;;;;5697:96;;;;;;5689:105;;:118;;;;:::i;:::-;5674:12;:133;;;5817:8;:15;;-1:-1:-1;;5817:15:21;;;;;5847:34;;;11491:25:23;;;5870:10:21;11547:2:23;11532:18;;11525:60;5847:34:21;;11464:18:23;5847:34:21;;;;;;;5358:530::o;4984:233:2:-;5097:31;5110:4;5116:2;5120:7;5097:12;:31::i;:::-;5138:72;735:10:8;5186:4:2;5192:2;5196:7;5205:4;5138:33;:72::i;10223:98:21:-;1531:13:0;:11;:13::i;:::-;10272:8:21::1;:15:::0;;-1:-1:-1;;10272:15:21::1;10283:4;10272:15;::::0;;10302:12:::1;::::0;::::1;::::0;10272:8:::1;::::0;10302:12:::1;10223:98::o:0;8305:1106::-;8365:13;8390:17;8404:2;8390:13;:17::i;:::-;;8417:18;8445:17;8472:19;8506:8;;;;;;;;;;;8501:438;;8569:13;:2;:11;:13::i;:::-;8537:46;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;8537:46:21;;;;;;;8603:3;;-1:-1:-1;;;8603:17:21;;;;;2438:25:23;;;8537:46:21;;-1:-1:-1;;;;;;8603:3:21;;:13;;2411:18:23;;8603:17:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8603:17:21;;;;;;;;;;;;:::i;:::-;8597:23;;8634:50;;;;;;;;;;;;;;;;;;;8501:438;;;8716:8;8726;8738:20;8747:10;8754:2;8747:6;:10::i;8738:20::-;8715:43;;;;8793:16;8806:2;8793:16;;:12;:16::i;:::-;8823:13;:2;:11;:13::i;:::-;8779:58;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;8779:58:21;;;;;;;8857:3;;-1:-1:-1;;;8857:23:21;;;;;13753:25:23;;;13826:4;13814:17;;13794:18;;;13787:45;13880:6;13868:19;;13848:18;;;13841:47;8779:58:21;;-1:-1:-1;;;;;;8857:3:21;;:12;;13726:18:23;;8857:23:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8857:23:21;;;;;;;;;;;;:::i;:::-;8902:3;;:26;;-1:-1:-1;;;8902:26:21;;3488:4:23;3476:17;;8902:26:21;;;3458:36:23;3542:6;3530:19;;3510:18;;;3503:47;8851:29:21;;-1:-1:-1;;;;;;8902:3:21;;:19;;3431:18:23;;8902:26:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8902:26:21;;;;;;;;;;;;:::i;:::-;8894:34;;8701:238;;8501:438;9027:367;9091:4;9342:3;9367:5;9047:345;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9027:13;:367::i;:::-;8955:449;;;;;;;;:::i;:::-;;;;;;;;;;;;;8948:456;;;;;8305:1106;;;:::o;10441:171::-;1531:13:0;:11;:13::i;:::-;10506:8:21::1;::::0;::::1;::::0;::::1;;;10502:37;;;10523:16;;-1:-1:-1::0;;;10523:16:21::1;;;;;;;;;;;10502:37;10549:3;:23:::0;;-1:-1:-1;;;;;;10549:23:21::1;-1:-1:-1::0;;;;;10549:23:21;::::1;::::0;;::::1;::::0;;;10587:18:::1;::::0;1747:51:23;;;10587:18:21::1;::::0;1735:2:23;1720:18;10587::21::1;;;;;;;10441:171:::0;:::o;9417:431::-;9809:3;;:16;;-1:-1:-1;;;9809:16:21;;:3;:16;;;2438:25:23;9463:13:21;;-1:-1:-1;;;;;9809:3:21;;:13;;2411:18:23;;9809:16:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9809:16:21;;;;;;;;;;;;:::i;:::-;9495:346;;;;;;;;:::i;:::-;;;;;;;;;;;;;9488:353;;9417:431;:::o;3927:153:2:-;-1:-1:-1;;;;;4038:25:2;;;4015:4;4038:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;3927:153::o;2543:215:0:-;1531:13;:11;:13::i;:::-;-1:-1:-1;;;;;2627:22:0;::::1;2623:91;;2672:31;::::0;-1:-1:-1;;;2672:31:0;;2700:1:::1;2672:31;::::0;::::1;1747:51:23::0;1720:18;;2672:31:0::1;1601:203:23::0;2623:91:0::1;2723:28;2742:8;2723:18;:28::i;:::-;2543:215:::0;:::o;16212:241:2:-;16275:7;5824:16;;;:7;:16;;;;;;-1:-1:-1;;;;;5824:16:2;;16337:88;;16383:31;;-1:-1:-1;;;16383:31:2;;;;;2438:25:23;;;2411:18;;16383:31:2;2292:177:23;14492:120:2;14572:33;14581:2;14585:7;14594:4;14600;14572:8;:33::i;11510:227::-;11561:21;11585:40;11601:1;11605:7;11622:1;11585:7;:40::i;:::-;11561:64;-1:-1:-1;;;;;;11639:27:2;;11635:96;;11689:31;;-1:-1:-1;;;11689:31:2;;;;;2438:25:23;;;2411:18;;11689:31:2;2292:177:23;6979:400:21;7028:7;7047:308;7081:1;7076:6;;;7112:3;7108:7;;7064:9;7129:161;7149:1;7145;:5;7129:161;;;7205:25;;;2196:39;7205:25;;;18174::23;18215:18;;;18208:34;;;18258:18;;;18251:34;;;7175:9:21;;18147:18:23;;7205:25:21;;;;;;-1:-1:-1;;7205:25:21;;;;;;7195:36;;7205:25;7195:36;;;;7266:1;;7235:3;7187:51;;;7269:5;;;;-1:-1:-1;7152:3:21;;7129:161;;;-1:-1:-1;7313:1:21;7308:6;;;;7307:12;;-1:-1:-1;1530:4:21;7338:15;;;7047:308;;-1:-1:-1;7371:1:21;6979:400::o;8028:220::-;8110:12;8141:27;8155:2;8159;8163:4;8141:13;:27::i;:::-;8134:34;-1:-1:-1;;;;;;8182:18:21;;;;;;:38;;-1:-1:-1;;;;;;8204:16:21;;;;8182:38;8178:63;;;8224:17;;;;:13;:17;;;;;8222:19;;8224:17;;;8222:19;;;:::i;:::-;;;;-1:-1:-1;8178:63:21;8028:220;;;;;:::o;1796:162:0:-;1710:6;;-1:-1:-1;;;;;1710:6:0;735:10:8;1855:23:0;1851:101;;1901:40;;-1:-1:-1;;;1901:40:0;;735:10:8;1901:40:0;;;1747:51:23;1720:18;;1901:40:0;1601:203:23;2912:187:0;3004:6;;;-1:-1:-1;;;;;3020:17:0;;;-1:-1:-1;;;;;;3020:17:0;;;;;;;3052:40;;3004:6;;;3020:17;3004:6;;3052:40;;2985:16;;3052:40;2975:124;2912:187;:::o;9978:327:2:-;-1:-1:-1;;;;;10045:16:2;;10041:87;;10084:33;;-1:-1:-1;;;10084:33:2;;10114:1;10084:33;;;1747:51:23;1720:18;;10084:33:2;1601:203:23;10041:87:2;10137:21;10161:32;10169:2;10173:7;10190:1;10161:7;:32::i;:::-;10137:56;-1:-1:-1;;;;;;10207:27:2;;;10203:96;;10257:31;;-1:-1:-1;;;10257:31:2;;10285:1;10257:31;;;1747:51:23;1720:18;;10257:31:2;1601:203:23;15665:312:2;-1:-1:-1;;;;;15772:22:2;;15768:91;;15817:31;;-1:-1:-1;;;15817:31:2;;-1:-1:-1;;;;;1765:32:23;;15817:31:2;;;1747:51:23;1720:18;;15817:31:2;1601:203:23;15768:91:2;-1:-1:-1;;;;;15868:25:2;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;15868:46:2;;;;;;;;;;15929:41;;540::23;;;15929::2;;513:18:23;15929:41:2;;;;;;;15665:312;;;:::o;985:924:6:-;-1:-1:-1;;;;;1165:14:6;;;:18;1161:742;;1203:67;;-1:-1:-1;;;1203:67:6;;-1:-1:-1;;;;;1203:36:6;;;;;:67;;1240:8;;1250:4;;1256:7;;1265:4;;1203:67;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1203:67:6;;;;;;;;-1:-1:-1;;1203:67:6;;;;;;;;;;;;:::i;:::-;;;1199:694;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1560:6;:13;1577:1;1560:18;1556:323;;1664:39;;-1:-1:-1;;;1664:39:6;;-1:-1:-1;;;;;1765:32:23;;1664:39:6;;;1747:51:23;1720:18;;1664:39:6;1601:203:23;1556:323:6;1831:6;1825:13;1816:6;1812:2;1808:15;1801:38;1199:694;-1:-1:-1;;;;;;1317:51:6;;-1:-1:-1;;;1317:51:6;1313:182;;1437:39;;-1:-1:-1;;;1437:39:6;;-1:-1:-1;;;;;1765:32:23;;1437:39:6;;;1747:51:23;1720:18;;1437:39:6;1601:203:23;1313:182:6;1271:238;1199:694;985:924;;;;;:::o;637:632:11:-;693:13;742:14;759:17;770:5;759:10;:17::i;:::-;779:1;759:21;742:38;;794:20;828:6;817:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:18:11;-1:-1:-1;794:41:11;-1:-1:-1;924:28:11;;;940:2;924:28;979:247;-1:-1:-1;;1010:5:11;-1:-1:-1;;;1109:2:11;1098:14;;1093:32;1010:5;1080:46;1170:2;1161:11;;;-1:-1:-1;1190:21:11;979:247;1190:21;-1:-1:-1;1246:6:11;637:632;-1:-1:-1;;;637:632:11:o;9854:213:21:-;9910:13;9939:1;9944;9939:6;9935:25;;-1:-1:-1;;9947:13:21;;;;;;;;;;;;-1:-1:-1;;;9947:13:21;;;;;9854:213::o;9935:25::-;9974:1;9979;9974:6;9970:26;;-1:-1:-1;;9982:14:21;;;;;;;;;;;;-1:-1:-1;;;9982:14:21;;;;;9854:213::o;9970:26::-;10010:1;10015;10010:6;10006:26;;-1:-1:-1;;10018:14:21;;;;;;;;;;;;-1:-1:-1;;;10018:14:21;;;;;9854:213::o;10006:26::-;-1:-1:-1;;10042:18:21;;;;;;;;;;;;-1:-1:-1;;;10042:18:21;;;;;9854:213::o;663:124:7:-;721:13;753:27;761:4;767:6;;;;;;;;;;;;;;;;;775:4;753:7;:27::i;14794:662:2:-;14954:9;:31;;;-1:-1:-1;;;;;;14967:18:2;;;;14954:31;14950:460;;;15001:13;15017:22;15031:7;15017:13;:22::i;:::-;15001:38;-1:-1:-1;;;;;;15167:18:2;;;;;;:35;;;15198:4;-1:-1:-1;;;;;15189:13:2;:5;-1:-1:-1;;;;;15189:13:2;;;15167:35;:69;;;;;15207:29;15224:5;15231:4;15207:16;:29::i;:::-;15206:30;15167:69;15163:142;;;15263:27;;-1:-1:-1;;;15263:27:2;;-1:-1:-1;;;;;1765:32:23;;15263:27:2;;;1747:51:23;1720:18;;15263:27:2;1601:203:23;15163:142:2;15323:9;15319:81;;;15377:7;15373:2;-1:-1:-1;;;;;15357:28:2;15366:5;-1:-1:-1;;;;;15357:28:2;;;;;;;;;;;15319:81;14987:423;14950:460;-1:-1:-1;;15420:24:2;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;15420:29:2;-1:-1:-1;;;;;15420:29:2;;;;;;;;;;14794:662::o;8861:795::-;8947:7;5824:16;;;:7;:16;;;;;;-1:-1:-1;;;;;5824:16:2;;;;9058:18;;;9054:86;;9092:37;9109:4;9115;9121:7;9092:16;:37::i;:::-;-1:-1:-1;;;;;9184:18:2;;;9180:256;;9300:48;9317:1;9321:7;9338:1;9342:5;9300:8;:48::i;:::-;-1:-1:-1;;;;;9391:15:2;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;9391:20:2;;;9180:256;-1:-1:-1;;;;;9450:16:2;;;9446:107;;-1:-1:-1;;;;;9510:13:2;;;;;;:9;:13;;;;;:18;;9527:1;9510:18;;;9446:107;9563:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9563:21:2;-1:-1:-1;;;;;9563:21:2;;;;;;;;;9600:27;;9563:16;;9600:27;;;;;;;9645:4;8861:795;-1:-1:-1;;;;8861:795:2:o;25316:916:14:-;25369:7;;-1:-1:-1;;;25444:17:14;;25440:103;;-1:-1:-1;;;25481:17:14;;;-1:-1:-1;25526:2:14;25516:12;25440:103;25569:8;25560:5;:17;25556:103;;25606:8;25597:17;;;-1:-1:-1;25642:2:14;25632:12;25556:103;25685:8;25676:5;:17;25672:103;;25722:8;25713:17;;;-1:-1:-1;25758:2:14;25748:12;25672:103;25801:7;25792:5;:16;25788:100;;25837:7;25828:16;;;-1:-1:-1;25872:1:14;25862:11;25788:100;25914:7;25905:5;:16;25901:100;;25950:7;25941:16;;;-1:-1:-1;25985:1:14;25975:11;25901:100;26027:7;26018:5;:16;26014:100;;26063:7;26054:16;;;-1:-1:-1;26098:1:14;26088:11;26014:100;26140:7;26131:5;:16;26127:66;;26177:1;26167:11;26219:6;25316:916;-1:-1:-1;;25316:916:14:o;1186:4022:7:-;1283:13;1515:4;:11;1530:1;1515:16;1511:31;;-1:-1:-1;1533:9:7;;;;;;;;;-1:-1:-1;1533:9:7;;;;1511:31;2480:20;2503:11;:69;;2571:1;2552:4;:11;2548:1;:15;;;;:::i;:::-;:19;;2566:1;2548:19;:::i;:::-;2547:25;;;;:::i;:::-;2503:69;;;2542:1;2523:4;:11;2537:1;2523:15;;;;:::i;:::-;2522:21;;;;:::i;:::-;2517:27;;:1;:27;:::i;:::-;2480:92;;2583:20;2617:12;2606:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2606:24:7;;2583:47;;2778:1;2771:5;2767:13;2879:4;2871:6;2867:17;2912:4;2959;2953:11;2947:4;2943:22;3207:4;3199:6;3195:17;3249:8;3243:15;3288:4;3278:8;3271:22;3360:1259;3393:6;3384:7;3381:19;3360:1259;;;3495:1;3486:7;3482:15;3471:26;;3533:7;3527:14;4120:4;4112:5;4108:2;4104:14;4100:25;4090:8;4086:40;4080:47;4069:9;4061:67;4173:1;4162:9;4158:17;4145:30;;4263:4;4255:5;4251:2;4247:14;4243:25;4233:8;4229:40;4223:47;4212:9;4204:67;4316:1;4305:9;4301:17;4288:30;;4405:4;4397:5;4394:1;4390:13;4386:24;4376:8;4372:39;4366:46;4355:9;4347:66;4458:1;4447:9;4443:17;4430:30;;4539:4;4532:5;4528:16;4518:8;4514:31;4508:38;4497:9;4489:58;;4592:1;4581:9;4577:17;4564:30;;3360:1259;;;4680:28;;-1:-1:-1;;4722:446:7;;;;4907:1;4900:4;4894:11;4890:19;4931:1;4926:132;;;;5080:1;5075:79;;;;4883:271;;4926:132;4982:4;4978:1;4967:9;4963:17;4955:32;5035:4;5031:1;5020:9;5016:17;5008:32;4926:132;;5075:79;5131:4;5127:1;5116:9;5112:17;5104:32;4883:271;;4722:446;-1:-1:-1;5195:6:7;;1186:4022;-1:-1:-1;;;;;;1186:4022:7:o;7105:368:2:-;7217:38;7231:5;7238:7;7247;7217:13;:38::i;:::-;7212:255;;-1:-1:-1;;;;;7275:19:2;;7271:186;;7321:31;;-1:-1:-1;;;7321:31:2;;;;;2438:25:23;;;2411:18;;7321:31:2;2292:177:23;7271:186:2;7398:44;;-1:-1:-1;;;7398:44:2;;-1:-1:-1;;;;;19243:32:23;;7398:44:2;;;19225:51:23;19292:18;;;19285:34;;;19198:18;;7398:44:2;19051:274:23;6401:272:2;6504:4;-1:-1:-1;;;;;6539:21:2;;;;;;:127;;;6586:7;-1:-1:-1;;;;;6577:16:2;:5;-1:-1:-1;;;;;6577:16:2;;:52;;;;6597:32;6614:5;6621:7;6597:16;:32::i;:::-;6577:88;;;-1:-1:-1;6033:7:2;6059:24;;;:15;:24;;;;;;-1:-1:-1;;;;;6633:32:2;;;6059:24;;6633:32;6577:88;6520:146;6401:272;-1:-1:-1;;;;6401:272:2:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:23:-;-1:-1:-1;;;;;;88:32:23;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:23;816:16;;809:27;592:250::o;847:282::-;900:3;938:5;932:12;965:6;960:3;953:19;981:76;1050:6;1043:4;1038:3;1034:14;1027:4;1020:5;1016:16;981:76;:::i;:::-;1111:2;1090:15;-1:-1:-1;;1086:29:23;1077:39;;;;1118:4;1073:50;;847:282;-1:-1:-1;;847:282:23:o;1134:231::-;1283:2;1272:9;1265:21;1246:4;1303:56;1355:2;1344:9;1340:18;1332:6;1303:56;:::i;1370:226::-;1429:6;1482:2;1470:9;1461:7;1457:23;1453:32;1450:52;;;1498:1;1495;1488:12;1450:52;-1:-1:-1;1543:23:23;;1370:226;-1:-1:-1;1370:226:23:o;1809:173::-;1877:20;;-1:-1:-1;;;;;1926:31:23;;1916:42;;1906:70;;1972:1;1969;1962:12;1906:70;1809:173;;;:::o;1987:300::-;2055:6;2063;2116:2;2104:9;2095:7;2091:23;2087:32;2084:52;;;2132:1;2129;2122:12;2084:52;2155:29;2174:9;2155:29;:::i;:::-;2145:39;2253:2;2238:18;;;;2225:32;;-1:-1:-1;;;1987:300:23:o;2474:327::-;2567:6;2575;2628:3;2616:9;2607:7;2603:23;2599:33;2596:53;;;2645:1;2642;2635:12;2596:53;2668:29;2687:9;2668:29;:::i;:::-;2658:39;;2733:7;2727:3;2716:9;2712:19;2709:32;2706:52;;;2754:1;2751;2744:12;2706:52;-1:-1:-1;2474:327:23;2792:2;2777:18;;;;;-1:-1:-1;2474:327:23:o;2806:479::-;2982:3;2967:19;;2971:9;3063:6;2940:4;3097:182;3111:4;3108:1;3105:11;3097:182;;;3174:13;;3189:4;3170:24;3158:37;;3224:4;3215:14;;;;3252:17;;;;3131:1;3124:9;3097:182;;;3101:3;;;2806:479;;;;:::o;3561:374::-;3638:6;3646;3654;3707:2;3695:9;3686:7;3682:23;3678:32;3675:52;;;3723:1;3720;3713:12;3675:52;3746:29;3765:9;3746:29;:::i;:::-;3736:39;;3794:38;3828:2;3817:9;3813:18;3794:38;:::i;:::-;3561:374;;3784:48;;-1:-1:-1;;;3901:2:23;3886:18;;;;3873:32;;3561:374::o;4355:186::-;4414:6;4467:2;4455:9;4446:7;4442:23;4438:32;4435:52;;;4483:1;4480;4473:12;4435:52;4506:29;4525:9;4506:29;:::i;4960:347::-;5025:6;5033;5086:2;5074:9;5065:7;5061:23;5057:32;5054:52;;;5102:1;5099;5092:12;5054:52;5125:29;5144:9;5125:29;:::i;:::-;5115:39;;5204:2;5193:9;5189:18;5176:32;5251:5;5244:13;5237:21;5230:5;5227:32;5217:60;;5273:1;5270;5263:12;5217:60;5296:5;5286:15;;;4960:347;;;;;:::o;5536:127::-;5597:10;5592:3;5588:20;5585:1;5578:31;5628:4;5625:1;5618:15;5652:4;5649:1;5642:15;5668:275;5739:2;5733:9;5804:2;5785:13;;-1:-1:-1;;5781:27:23;5769:40;;5839:18;5824:34;;5860:22;;;5821:62;5818:88;;;5886:18;;:::i;:::-;5922:2;5915:22;5668:275;;-1:-1:-1;5668:275:23:o;5948:186::-;5996:4;6029:18;6021:6;6018:30;6015:56;;;6051:18;;:::i;:::-;-1:-1:-1;6117:2:23;6096:15;-1:-1:-1;;6092:29:23;6123:4;6088:40;;5948:186::o;6139:958::-;6234:6;6242;6250;6258;6311:3;6299:9;6290:7;6286:23;6282:33;6279:53;;;6328:1;6325;6318:12;6279:53;6351:29;6370:9;6351:29;:::i;:::-;6341:39;;6399:38;6433:2;6422:9;6418:18;6399:38;:::i;:::-;6389:48;-1:-1:-1;6506:2:23;6491:18;;6478:32;;-1:-1:-1;6585:2:23;6570:18;;6557:32;6612:18;6601:30;;6598:50;;;6644:1;6641;6634:12;6598:50;6667:22;;6720:4;6712:13;;6708:27;-1:-1:-1;6698:55:23;;6749:1;6746;6739:12;6698:55;6789:2;6776:16;6814:52;6830:35;6858:6;6830:35;:::i;:::-;6814:52;:::i;:::-;6889:6;6882:5;6875:21;6937:7;6932:2;6923:6;6919:2;6915:15;6911:24;6908:37;6905:57;;;6958:1;6955;6948:12;6905:57;7013:6;7008:2;7004;7000:11;6995:2;6988:5;6984:14;6971:49;7065:1;7060:2;7051:6;7044:5;7040:18;7036:27;7029:38;7086:5;7076:15;;;;;6139:958;;;;;;;:::o;7327:260::-;7395:6;7403;7456:2;7444:9;7435:7;7431:23;7427:32;7424:52;;;7472:1;7469;7462:12;7424:52;7495:29;7514:9;7495:29;:::i;:::-;7485:39;;7543:38;7577:2;7566:9;7562:18;7543:38;:::i;:::-;7533:48;;7327:260;;;;;:::o;7592:380::-;7671:1;7667:12;;;;7714;;;7735:61;;7789:4;7781:6;7777:17;7767:27;;7735:61;7842:2;7834:6;7831:14;7811:18;7808:38;7805:161;;7888:10;7883:3;7879:20;7876:1;7869:31;7923:4;7920:1;7913:15;7951:4;7948:1;7941:15;7805:161;;7592:380;;;:::o;7977:127::-;8038:10;8033:3;8029:20;8026:1;8019:31;8069:4;8066:1;8059:15;8093:4;8090:1;8083:15;8109:128;8176:9;;;8197:11;;;8194:37;;;8211:18;;:::i;8242:127::-;8303:10;8298:3;8294:20;8291:1;8284:31;8334:4;8331:1;8324:15;8358:4;8355:1;8348:15;8374:125;8439:9;;;8460:10;;;8457:36;;;8473:18;;:::i;8836:127::-;8897:10;8892:3;8888:20;8885:1;8878:31;8928:4;8925:1;8918:15;8952:4;8949:1;8942:15;8968:120;9008:1;9034;9024:35;;9039:18;;:::i;:::-;-1:-1:-1;9073:9:23;;8968:120::o;9346:112::-;9378:1;9404;9394:35;;9409:18;;:::i;:::-;-1:-1:-1;9443:9:23;;9346:112::o;10393:168::-;10466:9;;;10497;;10514:15;;;10508:22;;10494:37;10484:71;;10535:18;;:::i;10566:184::-;10636:6;10689:2;10677:9;10668:7;10664:23;10660:32;10657:52;;;10705:1;10702;10695:12;10657:52;-1:-1:-1;10728:16:23;;10566:184;-1:-1:-1;10566:184:23:o;10755:135::-;10794:3;10815:17;;;10812:43;;10835:18;;:::i;:::-;-1:-1:-1;10882:1:23;10871:13;;10755:135::o;11596:198::-;11638:3;11676:5;11670:12;11691:65;11749:6;11744:3;11737:4;11730:5;11726:16;11691:65;:::i;:::-;11772:16;;;;;11596:198;-1:-1:-1;;11596:198:23:o;11799:436::-;-1:-1:-1;;;12046:3:23;12039:29;12021:3;12097:6;12091:13;12113:75;12181:6;12176:2;12171:3;12167:12;12160:4;12152:6;12148:17;12113:75;:::i;:::-;12208:16;;;;12226:2;12204:25;;11799:436;-1:-1:-1;;11799:436:23:o;12240:668::-;12320:6;12373:2;12361:9;12352:7;12348:23;12344:32;12341:52;;;12389:1;12386;12379:12;12341:52;12422:9;12416:16;12455:18;12447:6;12444:30;12441:50;;;12487:1;12484;12477:12;12441:50;12510:22;;12563:4;12555:13;;12551:27;-1:-1:-1;12541:55:23;;12592:1;12589;12582:12;12541:55;12625:2;12619:9;12650:52;12666:35;12694:6;12666:35;:::i;12650:52::-;12725:6;12718:5;12711:21;12773:7;12768:2;12759:6;12755:2;12751:15;12747:24;12744:37;12741:57;;;12794:1;12791;12784:12;12741:57;12807:71;12871:6;12866:2;12859:5;12855:14;12850:2;12846;12842:11;12807:71;:::i;12913:636::-;13182:3;13220:6;13214:13;13236:66;13295:6;13290:3;13283:4;13275:6;13271:17;13236:66;:::i;:::-;-1:-1:-1;;;13324:16:23;;;13349:25;;;13399:13;;13421:78;13399:13;13486:1;13475:13;;13468:4;13456:17;;13421:78;:::i;:::-;13519:20;13541:1;13515:28;;12913:636;-1:-1:-1;;;;12913:636:23:o;14368:1558::-;-1:-1:-1;;;14985:43:23;;15051:13;;14967:3;;15073:74;15051:13;15136:1;15127:11;;15120:4;15108:17;;15073:74;:::i;:::-;15210:66;15206:1;15166:16;;;15198:10;;;15191:86;15306:34;15301:2;15293:11;;15286:55;15370:34;15365:2;15357:11;;15350:55;15435:34;15429:3;15421:12;;15414:56;15500:34;15494:3;15486:12;;15479:56;15565:66;15559:3;15551:12;;15544:88;-1:-1:-1;;;15656:3:23;15648:12;;15641:41;15704:39;15738:3;15730:12;;15722:6;15704:39;:::i;:::-;-1:-1:-1;;;14226:57:23;;15691:52;-1:-1:-1;15805:41:23;15842:2;15835:5;15831:14;15823:6;15805:41;:::i;:::-;-1:-1:-1;;;14344:17:23;;15918:1;15907:13;;;-1:-1:-1;;;;;;14368:1558:23:o;15931:451::-;16183:31;16178:3;16171:44;16153:3;16244:6;16238:13;16260:75;16328:6;16323:2;16318:3;16314:12;16307:4;16299:6;16295:17;16260:75;:::i;:::-;16355:16;;;;16373:2;16351:25;;15931:451;-1:-1:-1;;15931:451:23:o;16661:1306::-;17104:29;17099:3;17092:42;17164:66;17159:2;17154:3;17150:12;17143:88;17261:66;17256:2;17251:3;17247:12;17240:88;17358:34;17353:2;17348:3;17344:12;17337:56;17424:34;17418:3;17413;17409:13;17402:57;17490:34;17484:3;17479;17475:13;17468:57;17556:34;17550:3;17545;17541:13;17534:57;17622:66;17616:3;17611;17607:13;17600:89;-1:-1:-1;;;17714:3:23;17709;17705:13;17698:29;17074:3;17756:6;17750:13;17772:74;17839:6;17833:3;17828;17824:13;17819:2;17811:6;17807:15;17772:74;:::i;:::-;17865:16;;17890:43;17928:3;17920:12;;-1:-1:-1;;;16627:27:23;;16577:79;17890:43;17957:3;17949:12;;16661:1306;-1:-1:-1;;;16661:1306:23:o;18296:496::-;-1:-1:-1;;;;;18527:32:23;;;18509:51;;18596:32;;18591:2;18576:18;;18569:60;18660:2;18645:18;;18638:34;;;18708:3;18703:2;18688:18;;18681:31;;;-1:-1:-1;;18729:57:23;;18766:19;;18758:6;18729:57;:::i;:::-;18721:65;18296:496;-1:-1:-1;;;;;;18296:496:23:o;18797:249::-;18866:6;18919:2;18907:9;18898:7;18894:23;18890:32;18887:52;;;18935:1;18932;18925:12;18887:52;18967:9;18961:16;18986:30;19010:5;18986:30;:::i","linkReferences":{},"immutableReferences":{"8956":[{"start":1460,"length":32}],"8959":[{"start":1902,"length":32},{"start":3407,"length":32}],"8963":[{"start":1739,"length":32},{"start":2573,"length":32}]}}}}}}},"signatures":{"function":[{"signature":"AGENT_ID()","signatureHash4":"0xe905182a","signatureHash32":"0xe905182a993255e78bd6a13d8f90af94e098654f889eb14905fb91c8d73237a3"},{"signature":"approve(address,uint256)","signatureHash4":"0x095ea7b3","signatureHash32":"0x095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba"},{"signature":"art()","signatureHash4":"0x301bd28e","signatureHash32":"0x301bd28e12b5f06520e0e7dd4ed993e6308b04c9c19b9dc1ae0812b69363276a"},{"signature":"balanceOf(address)","signatureHash4":"0x70a08231","signatureHash32":"0x70a08231b98ef4ca268c9cc3f6b4590e4bfec28280db06bb5d45e689f2a360be"},{"signature":"contractURI()","signatureHash4":"0xe8a3d485","signatureHash32":"0xe8a3d48517095c5a7fd44e6a6e1538451380e285023a89d5b1c3b9b38d440cf4"},{"signature":"DESIGNS()","signatureHash4":"0xd21ff494","signatureHash32":"0xd21ff49481a7255c8a32a27fc4cf17102939d055806d9d259a9993d508841f61"},{"signature":"elementOf(uint256)","signatureHash4":"0x23f18920","signatureHash32":"0x23f189204f548b35774f4bc83a841b159073e30665ccbdb8813475040b4a3b5d"},{"signature":"forgeBurn(address,uint256[5])","signatureHash4":"0x193ee7b5","signatureHash32":"0x193ee7b5d00e3bdcd5adf588da45d65ff25da65290862e81035916d6cd5d502b"},{"signature":"FREE_PER_WALLET()","signatureHash4":"0xcd90e5af","signatureHash32":"0xcd90e5af7c66183314b1f787317384e163b5fd5f3761c1a6fa675d75d5f9e35e"},{"signature":"getApproved(uint256)","signatureHash4":"0x081812fc","signatureHash32":"0x081812fc55e34fdc7cf5d8b5cf4e3621fa6423fde952ec6ab24afdc0d85c0b2e"},{"signature":"isApprovedForAll(address,address)","signatureHash4":"0xe985e9c5","signatureHash32":"0xe985e9c5c6636c6879256001057b28ccac7718ef0ac56553ff9b926452cab8a3"},{"signature":"MAX_PER_WALLET()","signatureHash4":"0x0f2cdd6c","signatureHash32":"0x0f2cdd6cd2d6b96a106f015e0c005331df6139f3a1c34460fde7b644b1ae8e68"},{"signature":"MAX_SUPPLY()","signatureHash4":"0x32cb6b0c","signatureHash32":"0x32cb6b0c9d125b1472513cbeeb7f75e981364c137d7d7140f52eb5e4e9cbb979"},{"signature":"metadataLocked()","signatureHash4":"0x69d2ceb1","signatureHash32":"0x69d2ceb16652d918630ff4ad74f83b6978cb6cd46f12e02380710fdb10b3aa3a"},{"signature":"MINER()","signatureHash4":"0x96d59717","signatureHash32":"0x96d5971781bc8c48e2bde5b8b4d76ab640a9dc2017369e31c8bb5b8fe48b9cfa"},{"signature":"mintedBy(address)","signatureHash4":"0x3cef28d2","signatureHash32":"0x3cef28d2a347eb7b15200f788ef3c7d0d847423cdf0ff5ffe4229b4ce296ca90"},{"signature":"mintOpen()","signatureHash4":"0x24bbd049","signatureHash32":"0x24bbd049b398cb3c8e328beccb6e7271655b0e9711e6216d7d3a382fa2eb29ff"},{"signature":"mint(uint256)","signatureHash4":"0xa0712d68","signatureHash32":"0xa0712d680358d64f694230b7cc0b277c73686bdf768385d55cd7c547d0ffd30e"},{"signature":"name()","signatureHash4":"0x06fdde03","signatureHash32":"0x06fdde0383f15d582d1a74511486c9ddf862a882fb7904b3d9fe9b8b8e58a796"},{"signature":"openMint()","signatureHash4":"0xbce6d672","signatureHash32":"0xbce6d6723127ec331d553d3a1f0c11898f5666850518e849ca6d7979e6376b14"},{"signature":"owner()","signatureHash4":"0x8da5cb5b","signatureHash32":"0x8da5cb5b36e7f68c1d2e56001220cdbdd3ba2616072f718acfda4a06441a807d"},{"signature":"ownerOf(uint256)","signatureHash4":"0x6352211e","signatureHash32":"0x6352211e6566aa027e75ac9dbf2423197fbd9b82b9d981a3ab367d355866aa1c"},{"signature":"PER_ELEMENT()","signatureHash4":"0x4ae23bd7","signatureHash32":"0x4ae23bd719988ebf5e3bcb2890bdbe74e4cfcd93c2ccb82cd2e1604a976a62cd"},{"signature":"PRICE()","signatureHash4":"0x8d859f3e","signatureHash32":"0x8d859f3ea28e013bc9a0daf96db5a16c9149b32c0d3b00329fc65af1e1843d7c"},{"signature":"PROCEEDS()","signatureHash4":"0xa624c3db","signatureHash32":"0xa624c3db6fd2daaf130c5b821519d2c63aed0da1dc8c91603f3587bdfe3d67d7"},{"signature":"PROVENANCE()","signatureHash4":"0x6373a6b1","signatureHash32":"0x6373a6b1791ec189811bebd8cca65f9ff7330c19913a6708626c673402bb9b5f"},{"signature":"PUBLIC_REVEAL_DELAY()","signatureHash4":"0xfc659491","signatureHash32":"0xfc659491fdcf4cfd7f9c69e443947f5aa104274acab8755c21cc2ca6e0a7b607"},{"signature":"quote(address,uint256)","signatureHash4":"0x8f79306e","signatureHash32":"0x8f79306e7dbee0a4dbf3bdc8d8107cf7e7a1ed4e2b28094d37fac66d86ae910f"},{"signature":"renounceOwnership()","signatureHash4":"0x715018a6","signatureHash32":"0x715018a616b5f2044428f6fadb7deef4ce9ca76ef60ea57978964ad137bbe7ae"},{"signature":"reveal()","signatureHash4":"0xa475b5dd","signatureHash32":"0xa475b5ddc5982d8a0dd2bcd076b6878df7ff2d187a08b33c3002853b99b2a06c"},{"signature":"revealed()","signatureHash4":"0x51830227","signatureHash32":"0x518302273935a42acefc1fe0dfbed71e8f7d2368c9ac5b72540a12d777655a6b"},{"signature":"revealOffset()","signatureHash4":"0x2097ac3b","signatureHash32":"0x2097ac3bc89d360055802687d0aa994feceff62d6a42ce1f5a4b1fd57330e48c"},{"signature":"REVEAL_THRESHOLD()","signatureHash4":"0x9ba06ab8","signatureHash32":"0x9ba06ab880789d289667236dc60c5e15943fa7376a554bf9fb0780fe828fae62"},{"signature":"safeTransferFrom(address,address,uint256)","signatureHash4":"0x42842e0e","signatureHash32":"0x42842e0eb38857a7775b4e7364b2775df7325074d088e7fb39590cd6281184ed"},{"signature":"safeTransferFrom(address,address,uint256,bytes)","signatureHash4":"0xb88d4fde","signatureHash32":"0xb88d4fde60196325a28bb7f99a2582e0b46de55b18761e960c14ad7a32099465"},{"signature":"setApprovalForAll(address,bool)","signatureHash4":"0xa22cb465","signatureHash32":"0xa22cb4651ab9570f89bb516380c40ce76762284fb1f21337ceaf6adab99e7d4a"},{"signature":"setArt(address)","signatureHash4":"0xe6b1a3ae","signatureHash32":"0xe6b1a3aeb49044f74a34c4f26988871e552c0040a3d08ed2158c8fc9272b1990"},{"signature":"slotData(uint256)","signatureHash4":"0x22acaf04","signatureHash32":"0x22acaf04c1206953c07882b18850a2c89628067d7af1b703675e4f0f8d5235d7"},{"signature":"slotOf(uint256)","signatureHash4":"0x263f3e7e","signatureHash32":"0x263f3e7ec72c669110c586f79da4ef5a3b6de78e4c56a4be72d9288ecf7fa5a0"},{"signature":"supportsInterface(bytes4)","signatureHash4":"0x01ffc9a7","signatureHash32":"0x01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e2"},{"signature":"symbol()","signatureHash4":"0x95d89b41","signatureHash32":"0x95d89b41e2f5f391a79ec54e9d87c79d6e777c63e32c28da95b4e9e4a79250ec"},{"signature":"thresholdReachedAt()","signatureHash4":"0x204aecb1","signatureHash32":"0x204aecb17300b919168457d59f0c0e5e479b26701ab9dfa5ddbfb5c694fb674d"},{"signature":"tokenURI(uint256)","signatureHash4":"0xc87b56dd","signatureHash32":"0xc87b56dda752230262935940d907f047a9f86bb5ee6aa33511fc86db33fea6cc"},{"signature":"totalBurned()","signatureHash4":"0xd89135cd","signatureHash32":"0xd89135cddb3b6c41c0720c8d7275cdd8b5478920e58bcf7bd96e92e3c514ddb2"},{"signature":"totalMinted()","signatureHash4":"0xa2309ff8","signatureHash32":"0xa2309ff8a1f86a4fb15fe22cc66ca2240889c22973a8705ca226daf66b420ca7"},{"signature":"totalSupply()","signatureHash4":"0x18160ddd","signatureHash32":"0x18160ddd7f15c72528c2f94fd8dfe3c8d5aa26e2c50c7d81f4bc7bee8d4b7932"},{"signature":"transferFrom(address,address,uint256)","signatureHash4":"0x23b872dd","signatureHash32":"0x23b872dd7302113369cda2901243429419bec145408fa8b352b3dd92b66c680b"},{"signature":"transferNonce(uint256)","signatureHash4":"0x6e303cad","signatureHash32":"0x6e303cadf569a997306e383d5a9c8f1b59cf69835eb1de4925b5b322d832eaa6"},{"signature":"transferOwnership(address)","signatureHash4":"0xf2fde38b","signatureHash32":"0xf2fde38b092330466c661fc723d5289b90272a3e580e3187d1d7ef788506c557"},{"signature":"withdraw()","signatureHash4":"0x3ccfd60b","signatureHash32":"0x3ccfd60b2e3ddce51ab210bfb9db13577f03a21684fa35e4bcd739dd5a30bda2"}],"event":[{"signature":"Approval(address,address,uint256)","signatureHash4":"0x8c5be1e5","signatureHash32":"0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925"},{"signature":"ApprovalForAll(address,address,bool)","signatureHash4":"0x17307eab","signatureHash32":"0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31"},{"signature":"ArtUpdated(address)","signatureHash4":"0x89382d75","signatureHash32":"0x89382d75256b43b6826ad8d6cbd8e517eaf5e10f1ef4c8f123c9a25ac4529b55"},{"signature":"MintOpened()","signatureHash4":"0x4301b55b","signatureHash32":"0x4301b55b3d4fd9018308a6bd66bf37880623a9548566d1b12867ab619a993ca1"},{"signature":"OwnershipTransferred(address,address)","signatureHash4":"0x8be0079c","signatureHash32":"0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0"},{"signature":"Revealed(uint256,address)","signatureHash4":"0x6e9dac3f","signatureHash32":"0x6e9dac3f3f833c1d527aa989d3a673884ddc11e31fdccc11ccd8aebf1ae069ac"},{"signature":"Transfer(address,address,uint256)","signatureHash4":"0xddf252ad","signatureHash32":"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"},{"signature":"Withdrawn(uint256)","signatureHash4":"0x430648de","signatureHash32":"0x430648de173157e069201c943adb2d4e340e7cf5b27b1b09c9cb852f03d63b56"}],"error":[{"signature":"AlreadyRevealed()","signatureHash4":"0xa89ac151","signatureHash32":"0xa89ac151620d5331775119c5df29262a0755c14eb44ace70a903df983497be6e"},{"signature":"ERC721IncorrectOwner(address,uint256,address)","signatureHash4":"0x64283d7b","signatureHash32":"0x64283d7b313c8117c125f736876fa2b4e90ea3831a4716dfdb87d2f540e26289"},{"signature":"ERC721InsufficientApproval(address,uint256)","signatureHash4":"0x177e802f","signatureHash32":"0x177e802f6f313bc89797ecace66d6d29ab4719cbaaacbb87367264048b1eb861"},{"signature":"ERC721InvalidApprover(address)","signatureHash4":"0xa9fbf51f","signatureHash32":"0xa9fbf51f86b8e03595d59dc726bb10c329bb24f62589be276d8dd193ca0b69ea"},{"signature":"ERC721InvalidOperator(address)","signatureHash4":"0x5b08ba18","signatureHash32":"0x5b08ba185e8f577075361f3a3555a6580a227ce22734dcc979c1aeadf894658b"},{"signature":"ERC721InvalidOwner(address)","signatureHash4":"0x89c62b64","signatureHash32":"0x89c62b6479af2e623826dcc39c5133061d35b66d72de92833401dd2fd6567480"},{"signature":"ERC721InvalidReceiver(address)","signatureHash4":"0x64a0ae92","signatureHash32":"0x64a0ae9278f805eaf991dcd18ca78756d280b7508b764ef1b255c55845c11df9"},{"signature":"ERC721InvalidSender(address)","signatureHash4":"0x73c6ac6e","signatureHash32":"0x73c6ac6e10798e95d99e1f130d923eb40193ecb8d094ec3dce93292564eb3b17"},{"signature":"ERC721NonexistentToken(uint256)","signatureHash4":"0x7e273289","signatureHash32":"0x7e273289a3a9ef6670f06df7dca227856fc925e956db96980692764a8bc734d7"},{"signature":"MetadataLocked()","signatureHash4":"0x27de4862","signatureHash32":"0x27de4862bfc92b76e402ed305829f40e9e5fcd597ab2206b4e6294cd24ed45c4"},{"signature":"MintClosed()","signatureHash4":"0x589ed34b","signatureHash32":"0x589ed34b6de61e6df418b1c0e5caa881461804657f37544ca23bf0b86d09f1e3"},{"signature":"NotAgent()","signatureHash4":"0x0d9ab13f","signatureHash32":"0x0d9ab13f71c732b832396d0ca53dffd12ef5d4a69c70e70af21f320397c8ae27"},{"signature":"NoToken()","signatureHash4":"0x79d93f49","signatureHash32":"0x79d93f49033adc027d39a5e2568aaddada22a50aa1c3e1a14818c1c4a79435f0"},{"signature":"NotRevealed()","signatureHash4":"0xb2c9bc88","signatureHash32":"0xb2c9bc88c92af6486d50da545a7932451137b560eebafbccc58fe475c2a2a4d5"},{"signature":"NotTokenOwner()","signatureHash4":"0x59dc379f","signatureHash32":"0x59dc379f975c9bbe79ae731e9a8dfaf96a6531de5c4fc5cde2b2e6f4772c2a7e"},{"signature":"OnlyMiner()","signatureHash4":"0xf3883b75","signatureHash32":"0xf3883b7563cbd8394cebc270eb85ac9154d108bc7fa3e086842ce2606985f268"},{"signature":"OwnableInvalidOwner(address)","signatureHash4":"0x1e4fbdf7","signatureHash32":"0x1e4fbdf7f3ef8bcaa855599e3abf48b232380f183f08f6f813d9ffa5bd585188"},{"signature":"OwnableUnauthorizedAccount(address)","signatureHash4":"0x118cdaa7","signatureHash32":"0x118cdaa7a341953d1887a2245fd6665d741c67c8c50581daa59e1d03373fa188"},{"signature":"RevealTooEarly()","signatureHash4":"0xc349402d","signatureHash32":"0xc349402d0e3634417c9b35d3939236d780d1ff295a0dc2fb763747d5795cb96c"},{"signature":"SoldOut()","signatureHash4":"0x52df9fe5","signatureHash32":"0x52df9fe5b9c9a7b0b4fdc2c9f89387959e35e4209c2a8d133a2b8165edad2a04"},{"signature":"WalletLimit()","signatureHash4":"0x5426a580","signatureHash32":"0x5426a580948f75ad41cddf41fcfa2870cd4fc1bb5d205dd189fcb28202c842a6"},{"signature":"WrongPayment()","signatureHash4":"0x788a686f","signatureHash32":"0x788a686fba1305d4a6b4ea40442947af1f8ab9c56da8d20a6fd1c28996cf497f"},{"signature":"ZeroQty()","signatureHash4":"0x5caa42ff","signatureHash32":"0x5caa42ff1475fe730e56bc79159b55e7b228792be35e2717d040f39b418a8cec"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"exact_match","chainId":"56","address":"0xc2b5FC45BCfE6F916dc5AFD136eE3d200d5CE2cD"}