[ { "inputs": [ { "internalType": "contract IVault", "name": "vault", "type": "address" }, { "internalType": "string", "name": "name", "type": "string" }, { "internalType": "string", "name": "symbol", "type": "string" }, { "internalType": "contract IERC20[]", "name": "tokens", "type": "address[]" }, { "internalType": "uint256[]", "name": "normalizedWeights", "type": "uint256[]" }, { "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256" }, { "internalType": "uint256", "name": "pauseWindowDuration", "type": "uint256" }, { "internalType": "uint256", "name": "bufferPeriodDuration", "type": "uint256" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "bool", "name": "swapEnabledOnStart", "type": "bool" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "startTime", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "endTime", "type": "uint256" }, { "indexed": false, "internalType": "uint256[]", "name": "startWeights", "type": "uint256[]" }, { "indexed": false, "internalType": "uint256[]", "name": "endWeights", "type": "uint256[]" } ], "name": "GradualWeightUpdateScheduled", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bool", "name": "paused", "type": "bool" } ], "name": "PausedStateChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bool", "name": "swapEnabled", "type": "bool" } ], "name": "SwapEnabledSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256" } ], "name": "SwapFeePercentageChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "decreaseAllowance", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "selector", "type": "bytes4" } ], "name": "getActionId", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getAuthorizer", "outputs": [ { "internalType": "contract IAuthorizer", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getGradualWeightUpdateParams", "outputs": [ { "internalType": "uint256", "name": "startTime", "type": "uint256" }, { "internalType": "uint256", "name": "endTime", "type": "uint256" }, { "internalType": "uint256[]", "name": "endWeights", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getInvariant", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getLastInvariant", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getNormalizedWeights", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getOwner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getPausedState", "outputs": [ { "internalType": "bool", "name": "paused", "type": "bool" }, { "internalType": "uint256", "name": "pauseWindowEndTime", "type": "uint256" }, { "internalType": "uint256", "name": "bufferPeriodEndTime", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getPoolId", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getRate", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getScalingFactors", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getSwapEnabled", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getSwapFeePercentage", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getVault", "outputs": [ { "internalType": "contract IVault", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "addedValue", "type": "uint256" } ], "name": "increaseAllowance", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "nonces", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "bytes", "name": "userData", "type": "bytes" } ], "name": "onExitPool", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "bytes", "name": "userData", "type": "bytes" } ], "name": "onJoinPool", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "enum IVault.SwapKind", "name": "kind", "type": "uint8" }, { "internalType": "contract IERC20", "name": "tokenIn", "type": "address" }, { "internalType": "contract IERC20", "name": "tokenOut", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "bytes", "name": "userData", "type": "bytes" } ], "internalType": "struct IPoolSwapStructs.SwapRequest", "name": "request", "type": "tuple" }, { "internalType": "uint256", "name": "balanceTokenIn", "type": "uint256" }, { "internalType": "uint256", "name": "balanceTokenOut", "type": "uint256" } ], "name": "onSwap", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, { "internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256" }, { "internalType": "bytes", "name": "userData", "type": "bytes" } ], "name": "queryExit", "outputs": [ { "internalType": "uint256", "name": "bptIn", "type": "uint256" }, { "internalType": "uint256[]", "name": "amountsOut", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }, { "internalType": "uint256", "name": "lastChangeBlock", "type": "uint256" }, { "internalType": "uint256", "name": "protocolSwapFeePercentage", "type": "uint256" }, { "internalType": "bytes", "name": "userData", "type": "bytes" } ], "name": "queryJoin", "outputs": [ { "internalType": "uint256", "name": "bptOut", "type": "uint256" }, { "internalType": "uint256[]", "name": "amountsIn", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "token", "type": "address" }, { "internalType": "bytes", "name": "poolConfig", "type": "bytes" } ], "name": "setAssetManagerPoolConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "paused", "type": "bool" } ], "name": "setPaused", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "swapEnabled", "type": "bool" } ], "name": "setSwapEnabled", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "swapFeePercentage", "type": "uint256" } ], "name": "setSwapFeePercentage", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "startTime", "type": "uint256" }, { "internalType": "uint256", "name": "endTime", "type": "uint256" }, { "internalType": "uint256[]", "name": "endWeights", "type": "uint256[]" } ], "name": "updateWeightsGradually", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
6102e06040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610120523480156200003757600080fd5b5060405162006086380380620060868339810160408190526200005a9162000d5c565b89898989898989898989898989898a516001600160401b03811180156200008057600080fd5b50604051908082528060200260200182016040528015620000ab578160200160208202803683370190505b5089898989888651600214620000c3576001620000c6565b60025b8989898989898989828289898180604051806040016040528060018152602001603160f81b815250848489336001600160a01b031660001b806080818152505050806001600160a01b031660a0816001600160a01b031660601b815250505081600390805190602001906200013d92919062000b14565b5080516200015390600490602084019062000b14565b50506005805460ff1916601217905550815160209283012060c052805191012060e05250507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6101005250620001b26276a70083111561019462000525565b620001c662278d0082111561019562000525565b4290910161014081905201610160528551620001e8906002111560c862000525565b62000202620001f66200053a565b8751111560c962000525565b62000218866200053f60201b62000e971760201c565b62000223846200054b565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000254908d9060040162000f71565b602060405180830381600087803b1580156200026f57600080fd5b505af115801562000284573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002aa919062000d43565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002df9084908b908b9060040162000ed5565b600060405180830381600087803b158015620002fa57600080fd5b505af11580156200030f573d6000803e3d6000fd5b505050508a6001600160a01b0316610180816001600160a01b031660601b81525050806101a0818152505050505050505050505050505050505050505050506001600a8190555060008751905062000374818851620005d760201b62000ea11760201c565b6101c0819052875188906000906200038857fe5b60200260200101516001600160a01b03166101e0816001600160a01b031660601b8152505087600181518110620003bb57fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505060028111620003f157600062000408565b87600281518110620003ff57fe5b60200260200101515b60601b6001600160601b03191661022052600381116200042a57600062000441565b876003815181106200043857fe5b60200260200101515b6001600160a01b0316610240816001600160a01b031660601b8152505062000484886000815181106200047057fe5b6020026020010151620005e660201b60201c565b6102605287516200049d90899060019081106200047057fe5b6102805260028111620004b2576000620004c4565b620004c4886002815181106200047057fe5b6102a05260038111620004d9576000620004eb565b620004eb886003815181106200047057fe5b6102c05242620004fe81808a8062000692565b620005098362000820565b5050505050505050505050505050505050505050505062001038565b816200053657620005368162000874565b5050565b600490565b806200053681620008c7565b6200056064e8d4a5100082101560cb62000525565b6200057867016345785d8a000082111560ca62000525565b620005978160c06008546200095460201b62000eae179092919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90620005cc90839062000f86565b60405180910390a150565b62000536828214606762000525565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200062357600080fd5b505afa15801562000638573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200065e919062000e6b565b60ff16905060006200067d6012836200096960201b62000ec41760201c565b600a0a670de0b6b3a764000002949350505050565b600b546000805b835181101562000783576000848281518110620006b257fe5b60200260200101519050620006da662386f26fc1000082101561012e6200052560201b60201c565b6200075b620006f4826200098660201b62000eda1760201c565b8360100260800162000746620007298a87815181106200071057fe5b6020026020010151620009c760201b62000efa1760201c565b86601f0260040189620009f460201b62000f16179092919060201c565b62000a0660201b62000f28179092919060201c565b935062000777818462000a1660201b62000f381790919060201c565b92505060010162000699565b506200079c670de0b6b3a7640000821461013462000525565b620007d58560e0620007c08960c08762000a3160201b62000f4a179092919060201c565b62000a3160201b62000f4a179092919060201c565b600b556040517f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be0906200081090889088908890889062000f8f565b60405180910390a1505050505050565b6200083f816000600b5462000a4360201b62000f5c179092919060201c565b600b556040517f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f90620005cc90839062000eca565b62461bcd60e51b6000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600281511015620008d85762000951565b600081600081518110620008e857fe5b602002602001015190506000600190505b82518110156200094e5760008382815181106200091257fe5b6020026020010151905062000943816001600160a01b0316846001600160a01b03161060656200052560201b60201c565b9150600101620008f9565b50505b50565b6001600160401b03811b1992909216911b1790565b60006200097b83831115600162000525565b508082035b92915050565b600062000980670de0b6b3a7640000620009b361ffff80168562000a6c60201b62000f831790919060201c565b62000ac160201b62000fef1790919060201c565b600062000980670de0b6b3a7640000620009b3637fffffff8562000a6c60201b62000f831790919060201c565b637fffffff811b1992909216911b1790565b61ffff811b1992909216911b1790565b600082820162000a2a848210158362000525565b9392505050565b63ffffffff811b1992909216911b1790565b60006001821b198416828462000a5b57600062000a5e565b60015b60ff16901b17949350505050565b600082820262000a9484158062000a8c57508385838162000a8957fe5b04145b600362000525565b8062000aa557600091505062000980565b670de0b6b3a764000060001982015b0460010191505062000980565b600062000ad2821515600462000525565b8262000ae15750600062000980565b670de0b6b3a76400008381029062000b079085838162000afd57fe5b0414600562000525565b82600182038162000ab457fe5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000b5757805160ff191683800117855562000b87565b8280016001018555821562000b87579182015b8281111562000b8757825182559160200191906001019062000b6a565b5062000b9592915062000b99565b5090565b5b8082111562000b95576000815560010162000b9a565b8051620009808162001022565b600082601f83011262000bce578081fd5b815162000be562000bdf8262000ff6565b62000fcf565b81815291506020808301908481018184028601820187101562000c0757600080fd5b60005b8481101562000c3357815162000c208162001022565b8452928201929082019060010162000c0a565b505050505092915050565b600082601f83011262000c4f578081fd5b815162000c6062000bdf8262000ff6565b81815291506020808301908481018184028601820187101562000c8257600080fd5b60005b8481101562000c335781518452928201929082019060010162000c85565b805180151581146200098057600080fd5b600082601f83011262000cc5578081fd5b81516001600160401b0381111562000cdb578182fd5b602062000cf1601f8301601f1916820162000fcf565b9250818352848183860101111562000d0857600080fd5b60005b8281101562000d2857848101820151848201830152810162000d0b565b8281111562000d3a5760008284860101525b50505092915050565b60006020828403121562000d55578081fd5b5051919050565b6000806000806000806000806000806101408b8d03121562000d7c578586fd5b62000d888c8c62000bb0565b60208c0151909a506001600160401b038082111562000da5578788fd5b62000db38e838f0162000cb4565b9a5060408d015191508082111562000dc9578788fd5b62000dd78e838f0162000cb4565b995060608d015191508082111562000ded578788fd5b62000dfb8e838f0162000bbd565b985060808d015191508082111562000e11578788fd5b5062000e208d828e0162000c3e565b96505060a08b0151945060c08b0151935060e08b0151925062000e488c6101008d0162000bb0565b915062000e5a8c6101208d0162000ca3565b90509295989b9194979a5092959850565b60006020828403121562000e7d578081fd5b815160ff8116811462000a2a578182fd5b6000815180845260208085019450808401835b8381101562000ebf5781518752958201959082019060010162000ea1565b509495945050505050565b901515815260200190565b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562000f215762000f0e855162001016565b8352938301939183019160010162000ef9565b505084810360408601528551808252908201925081860190845b8181101562000f635762000f50835162001016565b8552938301939183019160010162000f3b565b509298975050505050505050565b602081016003831062000f8057fe5b91905290565b90815260200190565b60008582528460208301526080604083015262000fb0608083018562000e8e565b828103606084015262000fc4818562000e8e565b979650505050505050565b6040518181016001600160401b038111828210171562000fee57600080fd5b604052919050565b60006001600160401b038211156200100c578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146200095157600080fd5b60805160a05160601c60c05160e051610100516101205161014051610160516101805160601c6101a0516101c0516101e05160601c6102005160601c6102205160601c6102405160601c61026051610280516102a0516102c051614f486200113e6000398061131c5280611f1e5250806112d95280611ebd5250806112965280611e5c5250806112455280611dfb525080611ee35280612e89525080611e825280612e47525080611e215280612e05525080611dc05280612dc3525080611580525080610716525080610a355250806111c75250806111a3525080610d1252508061144c52508061148e52508061146d525080610a1152508061099b5250614f486000f3fe608060405234801561001057600080fd5b50600436106102925760003560e01c806374f3b009116101605780639d2c110c116100d8578063d505accf1161008c578063dd62ed3e11610071578063dd62ed3e14610508578063e01af92c1461051b578063f89f27ed1461052e57610292565b8063d505accf146104e2578063d5c096c4146104f557610292565b8063a9059cbb116100bd578063a9059cbb146104bf578063aaabadc5146104d2578063c0ff1a15146104da57610292565b80639d2c110c14610499578063a457c2d7146104ac57610292565b806387ec68171161012f5780638d928af8116101145780638d928af81461048157806395d89b41146104895780639b02cdde1461049157610292565b806387ec681714610459578063893d20e81461046c57610292565b806374f3b009146103fb5780637beed2201461041c5780637ecebe0014610433578063851c1bb31461044657610292565b806338e9922e1161020e57806350dd6ed9116101c25780636028bfd4116101a75780636028bfd4146103bf578063679aefce146103e057806370a08231146103e857610292565b806350dd6ed9146103a457806355c67628146103b757610292565b806339509351116101f357806339509351146103765780633e5692051461038957806347bc4d921461039c57610292565b806338e9922e1461035b57806338fff2d01461036e57610292565b80631c0de0511161026557806323b872dd1161024a57806323b872dd1461032b578063313ce5671461033e5780633644e5151461035357610292565b80631c0de051146102ff5780631dd746ea1461031657610292565b806306fdde0314610297578063095ea7b3146102b557806316c38b3c146102d557806318160ddd146102ea575b600080fd5b61029f610536565b6040516102ac9190614e11565b60405180910390f35b6102c86102c33660046146a8565b6105eb565b6040516102ac9190614d18565b6102e86102e336600461479f565b610602565b005b6102f2610616565b6040516102ac9190614d3b565b61030761061c565b6040516102ac93929190614d23565b61031e610645565b6040516102ac9190614ce0565b6102c86103393660046145f3565b610654565b6103466106e8565b6040516102ac9190614e8d565b6102f26106f1565b6102e8610369366004614b2b565b6106fb565b6102f2610714565b6102c86103843660046146a8565b610738565b6102e8610397366004614b43565b610773565b6102c86107da565b6102e86103b23660046148d6565b6107ea565b6102f2610808565b6103d26103cd3660046147d7565b610819565b6040516102ac929190614e24565b6102f2610850565b6102f26103f636600461459f565b61087b565b61040e6104093660046147d7565b61089a565b6040516102ac929190614cf3565b6104246108bd565b6040516102ac93929190614e3d565b6102f261044136600461459f565b61097c565b6102f261045436600461487a565b610997565b6103d26104673660046147d7565b6109e9565b610474610a0f565b6040516102ac9190614ccc565b610474610a33565b61029f610a57565b6102f2610ad6565b6102f26104a7366004614a2f565b610adc565b6102c86104ba3660046146a8565b610bc3565b6102c86104cd3660046146a8565b610c01565b610474610c0e565b6102f2610c18565b6102e86104f0366004614633565b610cdd565b61040e6105033660046147d7565b610e26565b6102f26105163660046145bb565b610e39565b6102e861052936600461479f565b610e64565b61031e610e8d565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105e05780601f106105b5576101008083540402835291602001916105e0565b820191906000526020600020905b8154815290600101906020018083116105c357829003601f168201915b505050505090505b90565b60006105f833848461103a565b5060015b92915050565b61060a6110a2565b610613816110e8565b50565b60025490565b6000806000610629611184565b1592506106346111a1565b915061063e6111c5565b9050909192565b606061064f6111e9565b905090565b6000806106618533610e39565b9050610685336001600160a01b038716148061067d5750838210155b61019e61135a565b610690858585611368565b336001600160a01b038616148015906106c957507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114155b156106db576106db853385840361103a565b60019150505b9392505050565b60055460ff1690565b600061064f611448565b6107036110a2565b61070b6114e5565b610613816114fa565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105f891859061076e9086610f38565b61103a565b61077b6110a2565b6107836114e5565b61078b611565565b61079d61079661157e565b8251610ea1565b426107a881856115a2565b93506107b98385111561014661135a565b6107cc84846107c66115b9565b856116cd565b506107d56117e2565b505050565b600b5460009061064f90826117e9565b6107f26110a2565b6107fa6114e5565b61080482826117f3565b5050565b60085460009061064f9060c061190b565b6000606061082f865161082a61157e565b610ea1565b610844898989898989896119196119e9611a4a565b97509795505050505050565b600061064f61085d610616565b610875610868610c18565b61087061157e565b611bda565b90611bf4565b6001600160a01b0381166000908152602081905260409020545b919050565b6060806108ad8989898989600089611c3c565b9150915097509795505050505050565b600b5460009081906060906108d38160c0611cdf565b93506108e08160e0611cdf565b925060006108ec61157e565b90508067ffffffffffffffff8111801561090557600080fd5b5060405190808252806020026020018201604052801561092f578160200160208202803683370190505b50925060005b81811015610974576109556109508460806010850201611ce9565b611cf1565b84828151811061096157fe5b6020908102919091010152600101610935565b505050909192565b6001600160a01b031660009081526006602052604090205490565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016109cc929190614c56565b604051602081830303815290604052805190602001209050919050565b600060606109fa865161082a61157e565b61084489898989898989611d0b611d5b611a4a565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105e05780601f106105b5576101008083540402835291602001916105e0565b60095490565b600080610aec8560200151611dbc565b90506000610afd8660400151611dbc565b9050600086516001811115610b0e57fe5b1415610b7457610b218660600151611f4d565b6060870152610b308583611f6e565b9450610b3c8482611f6e565b9350610b4c866060015183611f6e565b60608701526000610b5e878787611f7a565b9050610b6a8183611fa2565b93505050506106e1565b610b7e8583611f6e565b9450610b8a8482611f6e565b9350610b9a866060015182611f6e565b60608701526000610bac878787611fae565b9050610bb88184611fc6565b9050610b6a81611fd2565b600080610bd03385610e39565b9050808310610bea57610be53385600061103a565b610bf7565b610bf7338585840361103a565b5060019392505050565b60006105f8338484611368565b600061064f611ff8565b60006060610c24610a33565b6001600160a01b031663f94d4668610c3a610714565b6040518263ffffffff1660e01b8152600401610c569190614d3b565b60006040518083038186803b158015610c6e57600080fd5b505afa158015610c82573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610caa91908101906146d3565b50915050610cbf81610cba6111e9565b612072565b6060610cc96120d3565b509050610cd68183612151565b9250505090565b610ceb8442111560d161135a565b6001600160a01b0387166000908152600660209081526040808320549051909291610d42917f0000000000000000000000000000000000000000000000000000000000000000918c918c918c9188918d9101614d63565b6040516020818303038152906040528051906020012090506000610d65826121c3565b9050600060018288888860405160008152602001604052604051610d8c9493929190614df3565b6020604051602081039080840390855afa158015610dae573d6000803e3d6000fd5b5050604051601f1901519150610df090506001600160a01b03821615801590610de857508b6001600160a01b0316826001600160a01b0316145b6101f861135a565b6001600160a01b038b166000908152600660205260409020600185019055610e198b8b8b61103a565b5050505050505050505050565b6060806108ad89898989896000896121df565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610e6c6110a2565b610e746114e5565b610e7c611565565b610e8581612304565b6106136117e2565b606061064f6115b9565b8061080481612346565b610804818314606761135a565b67ffffffffffffffff811b1992909216911b1790565b6000610ed483831115600161135a565b50900390565b60006105fc670de0b6b3a7640000610ef48461ffff610f83565b90610fef565b60006105fc670de0b6b3a7640000610ef484637fffffff610f83565b637fffffff811b1992909216911b1790565b61ffff811b1992909216911b1790565b60008282016106e1848210158361135a565b63ffffffff811b1992909216911b1790565b60006001821b1984168284610f72576000610f75565b60015b60ff16901b17949350505050565b6000828202610fa7841580610fa0575083858381610f9d57fe5b04145b600361135a565b80610fb65760009150506105fc565b670de0b6b3a76400007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82015b046001019150506105fc565b6000610ffe821515600461135a565b8261100b575060006105fc565b670de0b6b3a76400008381029061102e9085838161102557fe5b0414600561135a565b826001820381610fe357fe5b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611095908590614d3b565b60405180910390a3505050565b60006110d16000357fffffffff0000000000000000000000000000000000000000000000000000000016610997565b90506106136110e082336123bf565b61019161135a565b8015611108576111036110f96111a1565b421061019361135a565b61111d565b61111d6111136111c5565b42106101a961135a565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490611179908390614d18565b60405180910390a150565b600061118e6111c5565b42118061064f57505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b606060006111f561157e565b905060608167ffffffffffffffff8111801561121057600080fd5b5060405190808252806020026020018201604052801561123a578160200160208202803683370190505b5090508115611282577f00000000000000000000000000000000000000000000000000000000000000008160008151811061127157fe5b60200260200101818152505061128b565b91506105e89050565b6001821115611282577f0000000000000000000000000000000000000000000000000000000000000000816001815181106112c257fe5b6020026020010181815250506002821115611282577f00000000000000000000000000000000000000000000000000000000000000008160028151811061130557fe5b6020026020010181815250506003821115611282577f00000000000000000000000000000000000000000000000000000000000000008160038151811061134857fe5b60200260200101818152505091505090565b8161080457610804816124af565b61137f6001600160a01b038416151561019861135a565b6113966001600160a01b038316151561019961135a565b6113a18383836107d5565b6001600160a01b0383166000908152602081905260409020546113c790826101a061251c565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546113f69082610f38565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611095908590614d3b565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006114b5612532565b306040516020016114ca959493929190614d97565b60405160208183030381529060405280519060200120905090565b6114f86114f0611184565b61019261135a565b565b61150d64e8d4a5100082101560cb61135a565b61152367016345785d8a000082111560ca61135a565b600854611532908260c0610eae565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90611179908390614d3b565b6115776002600a54141561019061135a565b6002600a55565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000818310156115b257816106e1565b5090919050565b606060006115c561157e565b905060608167ffffffffffffffff811180156115e057600080fd5b5060405190808252806020026020018201604052801561160a578160200160208202803683370190505b50600b5490915061161c600082612536565b8260008151811061162957fe5b602002602001018181525050611640600182612536565b8260018151811061164d57fe5b602002602001018181525050826002141561166c575091506105e89050565b611677600282612536565b8260028151811061168457fe5b60200260200101818152505082600314156116a3575091506105e89050565b6116ae600382612536565b826003815181106116bb57fe5b60209081029190910101525091505090565b600b546000805b83518110156117695760008482815181106116eb57fe5b6020026020010151905061170b662386f26fc1000082101561012e61135a565b61175261171782610eda565b8360100260800161174b61173d8a878151811061173057fe5b6020026020010151610efa565b88906004601f890201610f16565b9190610f28565b935061175e8382610f38565b9250506001016116d4565b50611780670de0b6b3a7640000821461013461135a565b6117998560e0611792858a60c0610f4a565b9190610f4a565b600b556040517f0f3631f9dab08169d1db21c6dc5f32536fb2b0a6b9bb5330d71c52132f968be0906117d2908890889088908890614e5c565b60405180910390a1505050505050565b6001600a55565b1c60019081161490565b60006117fd610714565b90506000611809610a33565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b8152600401611836929190614ddc565b60806040518083038186803b15801561184e57600080fd5b505afa158015611862573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118869190614b91565b6040517f18e736d40000000000000000000000000000000000000000000000000000000081529094506001600160a01b03851693506318e736d492506118d3915085908790600401614dc3565b600060405180830381600087803b1580156118ed57600080fd5b505af1158015611901573d6000803e3d6000fd5b5050505050505050565b1c67ffffffffffffffff1690565b60006060806060600061192a6120d3565b91509150611936611184565b1561196e576000611947838c612151565b90506119598b8484600954858e61258c565b93506119688b85610ec461263b565b506119ba565b61197661157e565b67ffffffffffffffff8111801561198c57600080fd5b506040519080825280602002602001820160405280156119b6578160200160208202803683370190505b5092505b6119c68a8389896126a6565b90955093506119d68a8584612715565b6009555050985098509895505050505050565b60005b6119f461157e565b8110156107d557611a2b838281518110611a0a57fe5b6020026020010151838381518110611a1e57fe5b6020026020010151611bf4565b838281518110611a3757fe5b60209081029190910101526001016119ec565b333014611b39576000306001600160a01b0316600036604051611a6e929190614c86565b6000604051808303816000865af19150503d8060008114611aab576040519150601f19603f3d011682016040523d82523d6000602084013e611ab0565b606091505b505090508060008114611abf57fe5b60046000803e6000517fffffffff00000000000000000000000000000000000000000000000000000000167f43adbafb000000000000000000000000000000000000000000000000000000008114611b1b573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6060611b436111e9565b9050611b4f8782612072565b60006060611b678c8c8c8c8c8c898d8d63ffffffff16565b5091509150611b7a81848663ffffffff16565b8051601f1982018390526343adbafb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08301526020027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82016044820181fd5b60008282026106e1841580610fa0575083858381610f9d57fe5b6000611c03821515600461135a565b82611c10575060006105fc565b670de0b6b3a764000083810290611c2a9085838161102557fe5b828181611c3357fe5b049150506105fc565b60608088611c66611c4b610a33565b6001600160a01b0316336001600160a01b03161460cd61135a565b611c7b611c71610714565b82146101f461135a565b6060611c856111e9565b9050611c918882612072565b6000606080611ca68e8e8e8e8e8e8a8f611919565b925092509250611cb68d8461272e565b611cc082856119e9565b611cca81856119e9565b909550935050505b5097509795505050505050565b1c63ffffffff1690565b1c61ffff1690565b60006105fc61ffff610ef484670de0b6b3a7640000610f83565b6000606080611d37611d1b610a0f565b6001600160a01b03168b6001600160a01b03161461014861135a565b611d478b8b8b8b8b8b8b8b612738565b925092509250985098509895505050505050565b60005b611d6661157e565b8110156107d557611d9d838281518110611d7c57fe5b6020026020010151838381518110611d9057fe5b6020026020010151610fef565b838281518110611da957fe5b6020908102919091010152600101611d5e565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e1f57507f0000000000000000000000000000000000000000000000000000000000000000610895565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e8057507f0000000000000000000000000000000000000000000000000000000000000000610895565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611ee157507f0000000000000000000000000000000000000000000000000000000000000000610895565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f4257507f0000000000000000000000000000000000000000000000000000000000000000610895565b6108956101356124af565b600080611f62611f5b610808565b8490610f83565b90506106e18382610ec4565b60006106e183836127be565b6000611f8f611f876107da565b61014761135a565b611f9a8484846127ea565b949350505050565b60006106e18383611bf4565b6000611fbb611f876107da565b611f9a84848461281d565b60006106e18383610fef565b60006105fc611ff1611fe2610808565b670de0b6b3a764000090610ec4565b8390610fef565b6000612002610a33565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b15801561203a57600080fd5b505afa15801561204e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064f91906148ba565b60005b61207d61157e565b8110156107d5576120b483828151811061209357fe5b60200260200101518383815181106120a757fe5b60200260200101516127be565b8382815181106120c057fe5b6020908102919091010152600101612075565b606060006120df6115b9565b9150600090506000826000815181106120f457fe5b602002602001015190506000600190505b835181101561214b578184828151811061211b57fe5b602002602001015111156121435780925083818151811061213857fe5b602002602001015191505b600101612105565b50509091565b670de0b6b3a764000060005b83518110156121b3576121a96121a285838151811061217857fe5b602002602001015185848151811061218c57fe5b602002602001015161285090919063ffffffff16565b83906127be565b915060010161215d565b506105fc6000821161013761135a565b60006121cd611448565b826040516020016109cc929190614c96565b606080886121ee611c4b610a33565b6121f9611c71610714565b60606122036111e9565b905061220d610616565b6122b457600060606122228d8d8d868b61289f565b91509150612237620f424083101560cc61135a565b6122456000620f42406128e5565b6122548b620f424084036128e5565b61225e8184611d5b565b8061226761157e565b67ffffffffffffffff8111801561227d57600080fd5b506040519080825280602002602001820160405280156122a7578160200160208202803683370190505b5095509550505050611cd2565b6122be8882612072565b60006060806122d38e8e8e8e8e8e8a8f611d0b565b9250925092506122e38c846128e5565b6122ed8285611d5b565b6122f781856119e9565b9095509350611cd2915050565b600b5461231390826000610f5c565b600b556040517f5a9e84f78f7957cb4ed7478eb0fcad35ee4ecbe2e0f298420b28a3955392573f90611179908390614d18565b60028151101561235557610613565b60008160008151811061236457fe5b602002602001015190506000600190505b82518110156107d557600083828151811061238c57fe5b602002602001015190506123b5816001600160a01b0316846001600160a01b031610606561135a565b9150600101612375565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b6123de610a0f565b6001600160a01b0316141580156123f957506123f9836128ef565b1561242157612406610a0f565b6001600160a01b0316336001600160a01b03161490506105fc565b612429611ff8565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b815260040161245893929190614d44565b60206040518083038186803b15801561247057600080fd5b505afa158015612484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a891906147bb565b90506105fc565b7f08c379a0000000000000000000000000000000000000000000000000000000006000908152602060045260076024526642414c23000030600a808404818106603090810160081b95839006959095019082900491820690940160101b939093010160c81b604452606490fd5b600061252b848411158361135a565b5050900390565b4690565b60008061255161254c846004601f88020161295d565b612967565b905060006125686109508560806010890201611ce9565b9050600061257585612983565b9050612582838383612a02565b9695505050505050565b60608061259761157e565b67ffffffffffffffff811180156125ad57600080fd5b506040519080825280602002602001820160405280156125d7578160200160208202803683370190505b509050826125e6579050612582565b6126198887815181106125f557fe5b602002602001015188888151811061260957fe5b6020026020010151878787612a76565b81878151811061262557fe5b6020908102919091010152979650505050505050565b60005b61264661157e565b8110156126a05761268184828151811061265c57fe5b602002602001015184838151811061267057fe5b60200260200101518463ffffffff16565b84828151811061268d57fe5b602090810291909101015260010161263e565b50505050565b6000606060006126b584612afe565b905060008160028111156126c557fe5b14156126e0576126d6878786612b14565b925092505061270c565b60018160028111156126ee57fe5b14156126fe576126d68785612bf7565b6126d687878787612c29565b505b94509492505050565b60006127248484610ec461263b565b611f9a8285612151565b6108048282612c98565b60006060806127456114e5565b606060006127516120d3565b915091506000612761838c612151565b905060606127758c8585600954868f61258c565b90506127848c82610ec461263b565b600060606127948e878d8d612d54565b915091506127a38e8288612daf565b60095590975095509350505050985098509895505050505050565b60008282026127d8841580610fa0575083858381610f9d57fe5b670de0b6b3a764000090049392505050565b60006127f46114e5565b611f9a836128058660200151612dbe565b846128138860400151612dbe565b8860600151612ee0565b60006128276114e5565b611f9a836128388660200151612dbe565b846128468860400151612dbe565b8860600151612f4d565b60008061285d8484612fc3565b9050600061287761287083612710610f83565b6001610f38565b90508082101561288c576000925050506105fc565b6128968282610ec4565b925050506105fc565b600060606128ca6128ae610a0f565b6001600160a01b0316876001600160a01b03161461014861135a565b6128d787878787876130f6565b915091509550959350505050565b610804828261318a565b600061291a7fe01af92c00000000000000000000000000000000000000000000000000000000610997565b82148061294e575061294b7f3e56920500000000000000000000000000000000000000000000000000000000610997565b82145b806105fc57506105fc82613218565b1c637fffffff1690565b60006105fc637fffffff610ef484670de0b6b3a7640000610f83565b600042816129928460c0611cdf565b905060006129a18560e0611cdf565b9050808311156129be57670de0b6b3a76400009350505050610895565b818310156129d25760009350505050610895565b81810382840381156129ed576129e88183611bf4565b6129f7565b670de0b6b3a76400005b979650505050505050565b6000811580612a1057508284145b15612a1c5750826106e1565b670de0b6b3a76400008210612a325750816106e1565b82841115612a5c576000612a48838587036127be565b9050612a548582610ec4565b9150506106e1565b6000612a6a838686036127be565b9050612a548582610f38565b6000838311612a8757506000612af5565b6000612a938585610fef565b90506000612aa9670de0b6b3a764000088611bf4565b9050612abd826709b6e64a8ec600006115a2565b91506000612acb838361327c565b90506000612ae2612adb836132a8565b8b906127be565b9050612aee81876127be565b9450505050505b95945050505050565b6000818060200190518101906105fc9190614924565b60006060612b206114e5565b600080612b2c856132ce565b91509150612b44612b3b61157e565b8210606461135a565b6060612b4e61157e565b67ffffffffffffffff81118015612b6457600080fd5b50604051908082528060200260200182016040528015612b8e578160200160208202803683370190505b509050612bd2888381518110612ba057fe5b6020026020010151888481518110612bb457fe5b602002602001015185612bc5610616565b612bcd610808565b6132f0565b818381518110612bde57fe5b6020908102919091010152919791965090945050505050565b600060606000612c06846133b0565b90506060612c1c8683612c17610616565b6133c6565b9196919550909350505050565b60006060612c356114e5565b60606000612c4285613478565b91509150612c53825161082a61157e565b612c5d8287612072565b6000612c7a898985612c6d610616565b612c75610808565b613490565b9050612c8a8282111560cf61135a565b989197509095505050505050565b612caf6001600160a01b038316151561019b61135a565b612cbb826000836107d5565b6001600160a01b038216600090815260208190526040902054612ce190826101a161251c565b6001600160a01b038316600090815260208190526040902055600254612d0790826136be565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d48908590614d3b565b60405180910390a35050565b600060606000612d6384612afe565b90506001816002811115612d7357fe5b1415612d85576126d6878787876136cc565b6002816002811115612d9357fe5b1415612da4576126d6878786613729565b61270a6101366124af565b60006127248484610f3861263b565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415612e0357506000612ed4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415612e4557506001612ed4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415612e8757506002612ed4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415612ec957506003612ed4565b612ed46101356124af565b6106e181600b54612536565b6000612f02612ef787670429d069189e00006127be565b83111561013061135a565b6000612f0e8784610f38565b90506000612f1c8883610fef565b90506000612f2a8887611bf4565b90506000612f38838361327c565b9050612aee612f46826132a8565b89906127be565b6000612f6f612f6485670429d069189e00006127be565b83111561013161135a565b6000612f85612f7e8685610ec4565b8690610fef565b90506000612f938588610fef565b90506000612fa1838361327c565b90506000612fb782670de0b6b3a7640000610ec4565b9050612aee8a82610f83565b600081612fd95750670de0b6b3a76400006105fc565b82612fe6575060006105fc565b6130137f80000000000000000000000000000000000000000000000000000000000000008410600661135a565b82613039770bce5086492111aea88f4bb1ca6bcf584181ea8059f765328410600761135a565b826000670c7d713b49da00008313801561305a5750670f43fc2c04ee000083125b1561309157600061306a846137d6565b9050670de0b6b3a764000080820784020583670de0b6b3a76400008305020191505061309f565b8161309b8461390d565b0290505b670de0b6b3a764000090056130ed7ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc000082128015906130e6575068070c1cc73b00c800008213155b600861135a565b61258281613cad565b600060606131026114e5565b600061310d84612afe565b9050613128600082600281111561312057fe5b1460ce61135a565b60606131338561417d565b905061314061079661157e565b61314a8187612072565b60606131546120d3565b50905060006131638284612151565b905060006131738261087061157e565b600992909255509a91995090975050505050505050565b613196600083836107d5565b6002546131a39082610f38565b6002556001600160a01b0382166000908152602081905260409020546131c99082610f38565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d48908590614d3b565b60006132437f38e9922e00000000000000000000000000000000000000000000000000000000610997565b8214806105fc57506132747f50dd6ed900000000000000000000000000000000000000000000000000000000610997565b909114919050565b6000806132898484612fc3565b9050600061329c61287083612710610f83565b9050612af58282610f38565b6000670de0b6b3a764000082106132c05760006105fc565b50670de0b6b3a76400000390565b600080828060200190518101906132e591906149b4565b909590945092505050565b60008061330184610ef48188610ec4565b905061331a6709b6e64a8ec6000082101561013261135a565b6000613338613331670de0b6b3a764000089611bf4565b839061327c565b9050600061334f613348836132a8565b8a906127be565b9050600061335c896132a8565b9050600061336a8383610f83565b905060006133788483610ec4565b90506133a0613399613392670de0b6b3a76400008b610ec4565b84906127be565b8290610f38565b9c9b505050505050505050505050565b6000818060200190518101906106e19190614987565b606060006133d48484611bf4565b90506060855167ffffffffffffffff811180156133f057600080fd5b5060405190808252806020026020018201604052801561341a578160200160208202803683370190505b50905060005b865181101561346e5761344f8388838151811061343957fe5b60200260200101516127be90919063ffffffff16565b82828151811061345b57fe5b6020908102919091010152600101613420565b5095945050505050565b60606000828060200190518101906132e59190614940565b60006060845167ffffffffffffffff811180156134ac57600080fd5b506040519080825280602002602001820160405280156134d6578160200160208202803683370190505b5090506000805b885181101561359b576135368982815181106134f557fe5b6020026020010151610ef489848151811061350c57fe5b60200260200101518c858151811061352057fe5b6020026020010151610ec490919063ffffffff16565b83828151811061354257fe5b60200260200101818152505061359161358a89838151811061356057fe5b602002602001015185848151811061357457fe5b6020026020010151610f8390919063ffffffff16565b8390610f38565b91506001016134dd565b50670de0b6b3a764000060005b895181101561369d5760008482815181106135bf57fe5b602002602001015184111561361f5760006135e86135dc866132a8565b8d858151811061343957fe5b905060006135fc828c868151811061352057fe5b905061361661358a611ff1670de0b6b3a76400008c610ec4565b92505050613636565b88828151811061362b57fe5b602002602001015190505b600061365f8c848151811061364757fe5b6020026020010151610875848f878151811061352057fe5b905061369161368a8c858151811061367357fe5b60200260200101518361285090919063ffffffff16565b85906127be565b935050506001016135a8565b506136b16136aa826132a8565b8790610f83565b9998505050505050505050565b60006106e18383600161251c565b600060608060006136dc85613478565b915091506136f26136eb61157e565b8351610ea1565b6136fc8287612072565b600061371989898561370c610616565b613714610808565b614193565b9050612c8a8282101560d061135a565b60006060600080613739856132ce565b91509150613748612b3b61157e565b606061375261157e565b67ffffffffffffffff8111801561376857600080fd5b50604051908082528060200260200182016040528015613792578160200160208202803683370190505b509050612bd28883815181106137a457fe5b60200260200101518884815181106137b857fe5b6020026020010151856137c9610616565b6137d1610808565b6143a5565b670de0b6b3a7640000026000806ec097ce7bc90715b34b9f1000000000808401907fffffffffffffffffffffffffffffffffff3f68318436f8ea4cb460f0000000008501028161382257fe5b05905060006ec097ce7bc90715b34b9f100000000082800205905081806ec097ce7bc90715b34b9f100000000081840205915060038205016ec097ce7bc90715b34b9f100000000082840205915060058205016ec097ce7bc90715b34b9f100000000082840205915060078205016ec097ce7bc90715b34b9f100000000082840205915060098205016ec097ce7bc90715b34b9f1000000000828402059150600b8205016ec097ce7bc90715b34b9f1000000000828402059150600d8205016ec097ce7bc90715b34b9f1000000000828402059150600f826002919005919091010295945050505050565b6000670de0b6b3a764000082121561394a57613940826ec097ce7bc90715b34b9f10000000008161393a57fe5b0561390d565b6000039050610895565b60007e1600ef3172e58d2e933ec884fde10064c63b5372d805e203c0000000000000831261399b57770195e54c5dd42177f53a27172fa9ec630262827000000000830592506806f05b59d3b2000000015b73011798004d755d3c8bc8e03204cf44619e00000083126139d3576b1425982cf597cd205cef7380830592506803782dace9d9000000015b606492830292026e01855144814a7ff805980ff00840008312613a1b576e01855144814a7ff805980ff008400068056bc75e2d63100000840205925068ad78ebc5ac62000000015b6b02df0ab5a80a22c61ab5a7008312613a56576b02df0ab5a80a22c61ab5a70068056bc75e2d6310000084020592506856bc75e2d631000000015b693f1fce3da636ea5cf8508312613a8d57693f1fce3da636ea5cf85068056bc75e2d631000008402059250682b5e3af16b18800000015b690127fa27722cc06cc5e28312613ac457690127fa27722cc06cc5e268056bc75e2d6310000084020592506815af1d78b58c400000015b68280e60114edb805d038312613af95768280e60114edb805d0368056bc75e2d631000008402059250680ad78ebc5ac6200000015b680ebc5fb417461211108312613b2457680ebc5fb4174612111068056bc75e2d631000009384020592015b6808f00f760a4b2db55d8312613b59576808f00f760a4b2db55d68056bc75e2d6310000084020592506802b5e3af16b1880000015b6806f5f17757889379378312613b8e576806f5f177578893793768056bc75e2d63100000840205925068015af1d78b58c40000015b6806248f33704b2866038312613bc2576806248f33704b28660368056bc75e2d63100000840205925067ad78ebc5ac620000015b6805c548670b9510e7ac8312613bf6576805c548670b9510e7ac68056bc75e2d6310000084020592506756bc75e2d6310000015b600068056bc75e2d63100000840168056bc75e2d631000008086030281613c1957fe5b059050600068056bc75e2d63100000828002059050818068056bc75e2d63100000818402059150600382050168056bc75e2d63100000828402059150600582050168056bc75e2d63100000828402059150600782050168056bc75e2d63100000828402059150600982050168056bc75e2d63100000828402059150600b820501600202606485820105979650505050505050565b6000613cf27ffffffffffffffffffffffffffffffffffffffffffffffffdc702bd3a30fc00008312158015613ceb575068070c1cc73b00c800008313155b600961135a565b6000821215613d2657613d0782600003613cad565b6ec097ce7bc90715b34b9f100000000081613d1e57fe5b059050610895565b60006806f05b59d3b20000008312613d7c57507ffffffffffffffffffffffffffffffffffffffffffffffff90fa4a62c4e00000090910190770195e54c5dd42177f53a27172fa9ec630262827000000000613dc8565b6803782dace9d90000008312613dc457507ffffffffffffffffffffffffffffffffffffffffffffffffc87d2531627000000909101906b1425982cf597cd205cef7380613dc8565b5060015b6064929092029168056bc75e2d6310000068ad78ebc5ac620000008412613e2e577fffffffffffffffffffffffffffffffffffffffffffffff5287143a539e0000009093019268056bc75e2d631000006e01855144814a7ff805980ff008400082020590505b6856bc75e2d6310000008412613e80577fffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf0000009093019268056bc75e2d631000006b02df0ab5a80a22c61ab5a70082020590505b682b5e3af16b188000008412613ed0577fffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e78000009093019268056bc75e2d63100000693f1fce3da636ea5cf85082020590505b6815af1d78b58c4000008412613f20577fffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c000009093019268056bc75e2d63100000690127fa27722cc06cc5e282020590505b680ad78ebc5ac62000008412613f6f577ffffffffffffffffffffffffffffffffffffffffffffffff5287143a539e000009093019268056bc75e2d6310000068280e60114edb805d0382020590505b68056bc75e2d631000008412613fbe577ffffffffffffffffffffffffffffffffffffffffffffffffa9438a1d29cf000009093019268056bc75e2d63100000680ebc5fb4174612111082020590505b6802b5e3af16b1880000841261400d577ffffffffffffffffffffffffffffffffffffffffffffffffd4a1c50e94e7800009093019268056bc75e2d631000006808f00f760a4b2db55d82020590505b68015af1d78b58c40000841261405c577ffffffffffffffffffffffffffffffffffffffffffffffffea50e2874a73c00009093019268056bc75e2d631000006806f5f177578893793782020590505b68056bc75e2d631000008481019085906002908280020505918201919050600368056bc75e2d631000008783020505918201919050600468056bc75e2d631000008783020505918201919050600568056bc75e2d631000008783020505918201919050600668056bc75e2d631000008783020505918201919050600768056bc75e2d631000008783020505918201919050600868056bc75e2d631000008783020505918201919050600968056bc75e2d631000008783020505918201919050600a68056bc75e2d631000008783020505918201919050600b68056bc75e2d631000008783020505918201919050600c68056bc75e2d631000008783020505918201919050606468056bc75e2d63100000848402058502059695505050505050565b6060818060200190518101906106e191906149ea565b60006060845167ffffffffffffffff811180156141af57600080fd5b506040519080825280602002602001820160405280156141d9578160200160208202803683370190505b5090506000805b8851811015614281576142398982815181106141f857fe5b602002602001015161087589848151811061420f57fe5b60200260200101518c858151811061422357fe5b6020026020010151610f3890919063ffffffff16565b83828151811061424557fe5b60200260200101818152505061427761358a89838151811061426357fe5b602002602001015185848151811061343957fe5b91506001016141e0565b50670de0b6b3a764000060005b8951811015614362576000838583815181106142a657fe5b602002602001015111156143025760006142cb6135dc86670de0b6b3a7640000610ec4565b905060006142df828c868151811061352057fe5b90506142f961358a6121a2670de0b6b3a76400008c610ec4565b92505050614319565b88828151811061430e57fe5b602002602001015190505b60006143428c848151811061432a57fe5b6020026020010151610875848f878151811061422357fe5b905061435661368a8c858151811061367357fe5b9350505060010161428e565b50670de0b6b3a76400008111156143995761438f61438882670de0b6b3a7640000610ec4565b87906127be565b9350505050612af5565b60009350505050612af5565b6000806143b684610ef48188610f38565b90506143cf6729a2241af62c000082111561013361135a565b60006143e6613331670de0b6b3a764000089610fef565b905060006144066143ff83670de0b6b3a7640000610ec4565b8a90610f83565b90506000614413896132a8565b905060006144218383610f83565b9050600061442f8483610ec4565b90506133a0613399614449670de0b6b3a76400008b610ec4565b8490610fef565b80356105fc81614ee2565b600082601f83011261446b578081fd5b813561447e61447982614ec2565b614e9b565b81815291506020808301908481018184028601820187101561449f57600080fd5b60005b848110156144be578135845292820192908201906001016144a2565b505050505092915050565b600082601f8301126144d9578081fd5b81516144e761447982614ec2565b81815291506020808301908481018184028601820187101561450857600080fd5b60005b848110156144be5781518452928201929082019060010161450b565b600082601f830112614537578081fd5b813567ffffffffffffffff81111561454d578182fd5b6145606020601f19601f84011601614e9b565b915080825283602082850101111561457757600080fd5b8060208401602084013760009082016020015292915050565b8035600281106105fc57600080fd5b6000602082840312156145b0578081fd5b81356106e181614ee2565b600080604083850312156145cd578081fd5b82356145d881614ee2565b915060208301356145e881614ee2565b809150509250929050565b600080600060608486031215614607578081fd5b833561461281614ee2565b9250602084013561462281614ee2565b929592945050506040919091013590565b600080600080600080600060e0888a03121561464d578283fd5b873561465881614ee2565b9650602088013561466881614ee2565b95506040880135945060608801359350608088013560ff8116811461468b578384fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156146ba578182fd5b82356146c581614ee2565b946020939093013593505050565b6000806000606084860312156146e7578081fd5b835167ffffffffffffffff808211156146fe578283fd5b818601915086601f830112614711578283fd5b815161471f61447982614ec2565b80828252602080830192508086018b82838702890101111561473f578788fd5b8796505b8487101561476a57805161475681614ee2565b845260019690960195928101928101614743565b508901519097509350505080821115614781578283fd5b5061478e868287016144c9565b925050604084015190509250925092565b6000602082840312156147b0578081fd5b81356106e181614ef7565b6000602082840312156147cc578081fd5b81516106e181614ef7565b600080600080600080600060e0888a0312156147f1578081fd5b87359650602088013561480381614ee2565b9550604088013561481381614ee2565b9450606088013567ffffffffffffffff8082111561482f578283fd5b61483b8b838c0161445b565b955060808a0135945060a08a0135935060c08a013591508082111561485e578283fd5b5061486b8a828b01614527565b91505092959891949750929550565b60006020828403121561488b578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146106e1578182fd5b6000602082840312156148cb578081fd5b81516106e181614ee2565b600080604083850312156148e8578182fd5b82356148f381614ee2565b9150602083013567ffffffffffffffff81111561490e578182fd5b61491a85828601614527565b9150509250929050565b600060208284031215614935578081fd5b81516106e181614f05565b600080600060608486031215614954578081fd5b835161495f81614f05565b602085015190935067ffffffffffffffff81111561497b578182fd5b61478e868287016144c9565b60008060408385031215614999578182fd5b82516149a481614f05565b6020939093015192949293505050565b6000806000606084860312156149c8578081fd5b83516149d381614f05565b602085015160409095015190969495509392505050565b600080604083850312156149fc578182fd5b8251614a0781614f05565b602084015190925067ffffffffffffffff811115614a23578182fd5b61491a858286016144c9565b600080600060608486031215614a43578081fd5b833567ffffffffffffffff80821115614a5a578283fd5b8186019150610120808389031215614a70578384fd5b614a7981614e9b565b9050614a858884614590565b8152614a948860208501614450565b6020820152614aa68860408501614450565b6040820152606083013560608201526080830135608082015260a083013560a0820152614ad68860c08501614450565b60c0820152614ae88860e08501614450565b60e08201526101008084013583811115614b00578586fd5b614b0c8a828701614527565b9183019190915250976020870135975060409096013595945050505050565b600060208284031215614b3c578081fd5b5035919050565b600080600060608486031215614b57578081fd5b8335925060208401359150604084013567ffffffffffffffff811115614b7b578182fd5b614b878682870161445b565b9150509250925092565b60008060008060808587031215614ba6578182fd5b8451935060208501519250604085015191506060850151614bc681614ee2565b939692955090935050565b6000815180845260208085019450808401835b83811015614c0057815187529582019590820190600101614be4565b509495945050505050565b60008151808452815b81811015614c3057602081850181015186830182015201614c14565b81811115614c415782602083870101525b50601f01601f19169290920160200192915050565b9182527fffffffff0000000000000000000000000000000000000000000000000000000016602082015260240190565b6000828483379101908152919050565b7f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6000602082526106e16020830184614bd1565b600060408252614d066040830185614bd1565b8281036020840152612af58185614bd1565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b600083825260406020830152611f9a6040830184614c0b565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526106e16020830184614c0b565b600083825260406020830152611f9a6040830184614bd1565b600084825283602083015260606040830152612af56060830184614bd1565b600085825284602083015260806040830152614e7b6080830185614bd1565b82810360608401526129f78185614bd1565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715614eba57600080fd5b604052919050565b600067ffffffffffffffff821115614ed8578081fd5b5060209081020190565b6001600160a01b038116811461061357600080fd5b801515811461061357600080fd5b6003811061061357600080fdfea2646970667358221220a5897244a1f4e9204983271ed4a7d57c09d1ef76e8b605f0151680b0f7bfeaef64736f6c63430007010033000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c80000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000470de4df820000000000000000000000000000000000000000000000000000000000000047eaa90000000000000000000000000000000000000000000000000000000000278d00000000000000000000000000116f4d31e8dbfe9eb8c8656bc65dff1198cde30e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000125341574120436f70706572204c61756e636800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008534157415f544c410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000a60d4a5c42cd6d4cc7987cb154e874d84096cb4a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000dbd2fc137a30000