60806040526001600c5534801561001557600080fd5b50604080518082018252601081526f486f6e6579706f742046696e616e636560801b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f4a87d900a0b8465c1c7cbc30eb9db95a7eb8a634c905d8a4b9737dcde438b837818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c09091019092528151910120600355600580546001600160a01b0319163317905561221a8061010e6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80636a627842116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a71461040c578063d505accf1461041f578063dd62ed3e14610432578063fff6cae91461045d57600080fd5b8063ba9a7a56146103dd578063bc25cf77146103e6578063c45a0155146103f957600080fd5b80637ecebe00116100d35780637ecebe001461035f57806389afcb441461037f57806395d89b41146103a7578063a9059cbb146103ca57600080fd5b80636a6278421461032357806370a08231146103365780637464fc3d1461035657600080fd5b806323b872dd116101665780633644e515116101405780633644e515146102f5578063485cc955146102fe5780635909c0d5146103115780635a3d54931461031a57600080fd5b806323b872dd146102a157806330adf81f146102b4578063313ce567146102db57600080fd5b8063022c0d9f146101ae57806306fdde03146101c35780630902f1ac14610208578063095ea7b31461023c5780630dfe16811461025f57806318160ddd1461028a575b600080fd5b6101c16101bc366004611da8565b610465565b005b6101f26040518060400160405280601081526020016f486f6e6579706f742046696e616e636560801b81525081565b6040516101ff9190611e62565b60405180910390f35b61021061095d565b604080516001600160701b03948516815293909216602084015263ffffffff16908201526060016101ff565b61024f61024a366004611e95565b610987565b60405190151581526020016101ff565b600654610272906001600160a01b031681565b6040516001600160a01b0390911681526020016101ff565b61029360005481565b6040519081526020016101ff565b61024f6102af366004611ec1565b61099e565b6102937f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6102e3601281565b60405160ff90911681526020016101ff565b61029360035481565b6101c161030c366004611f02565b610a32565b61029360095481565b610293600a5481565b610293610331366004611f3b565b610ab0565b610293610344366004611f3b565b60016020526000908152604090205481565b610293600b5481565b61029361036d366004611f3b565b60046020526000908152604090205481565b61039261038d366004611f3b565b610d77565b604080519283526020830191909152016101ff565b6101f260405180604001604052806004815260200163121413d560e21b81525081565b61024f6103d8366004611e95565b6110dc565b6102936103e881565b6101c16103f4366004611f3b565b6110e9565b600554610272906001600160a01b031681565b600754610272906001600160a01b031681565b6101c161042d366004611f58565b6111fd565b610293610440366004611f02565b600260209081526000928352604080842090915290825290205481565b6101c1611410565b600c546001146104905760405162461bcd60e51b815260040161048790611fcf565b60405180910390fd5b6000600c55841515806104a35750600084115b6104fb5760405162461bcd60e51b8152602060048201526024808201527f48656e6c6f4465783a20494e53554646494349454e545f4f55545055545f414d60448201526313d5539560e21b6064820152608401610487565b60008061050661095d565b5091509150816001600160701b03168710801561052b5750806001600160701b031686105b6105775760405162461bcd60e51b815260206004820181905260248201527f48656e6c6f4465783a20494e53554646494349454e545f4c49515549444954596044820152606401610487565b60065460075460009182916001600160a01b039182169190811690891682148015906105b55750806001600160a01b0316896001600160a01b031614155b6105f85760405162461bcd60e51b815260206004820152601460248201527348656e6c6f4465783a20494e56414c49445f544f60601b6044820152606401610487565b8a1561060957610609828a8d611534565b891561061a5761061a818a8c611534565b8615610687576040516304347a1760e21b81526001600160a01b038a16906310d1e85c906106549033908f908f908e908e90600401611ff9565b600060405180830381600087803b15801561066e57600080fd5b505af1158015610682573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156106cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ef9190612045565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075a9190612045565b92505050600089856001600160701b03166107759190612074565b831161078257600061079f565b6107958a6001600160701b038716612074565b61079f9084612074565b905060006107b68a6001600160701b038716612074565b83116107c35760006107e0565b6107d68a6001600160701b038716612074565b6107e09084612074565b905060008211806107f15750600081115b6108495760405162461bcd60e51b815260206004820152602360248201527f48656e6c6f4465783a20494e53554646494349454e545f494e5055545f414d4f60448201526215539560ea1b6064820152608401610487565b600061086b61085984600361167f565b610865876103e861167f565b906116e6565b9050600061087d61085984600361167f565b90506108a2620f424061089c6001600160701b038b8116908b1661167f565b9061167f565b6108ac838361167f565b10156108e85760405162461bcd60e51b815260206004820152600b60248201526a48656e6c6f4465783a204b60a81b6044820152606401610487565b50506108f68484888861173c565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001600c55505050505050505050565b6008546001600160701b0380821692600160701b830490911691600160e01b900463ffffffff1690565b6000610994338484611927565b5060015b92915050565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610a1d576001600160a01b03841660009081526002602090815260408083203384529091529020546109f890836116e6565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b610a28848484611989565b5060019392505050565b6005546001600160a01b03163314610a825760405162461bcd60e51b81526020600482015260136024820152722432b73637a232bc1d102327a92124a22222a760691b6044820152606401610487565b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b6000600c54600114610ad45760405162461bcd60e51b815260040161048790611fcf565b6000600c81905580610ae461095d565b506006546040516370a0823160e01b81523060048201529294509092506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610b36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5a9190612045565b6007546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610ba8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcc9190612045565b90506000610be3836001600160701b0387166116e6565b90506000610bfa836001600160701b0387166116e6565b90506000610c088787611a2f565b60008054919250819003610c4257610c2e6103e8610865610c29878761167f565b611b6c565b9850610c3d60006103e8611bdc565b610c89565b610c866001600160701b038916610c59868461167f565b610c63919061209d565b6001600160701b038916610c77868561167f565b610c81919061209d565b611c6b565b98505b60008911610ce95760405162461bcd60e51b815260206004820152602760248201527f48656e6c6f4465783a20494e53554646494349454e545f4c495155494449545960448201526617d3525395115160ca1b6064820152608401610487565b610cf38a8a611bdc565b610cff86868a8a61173c565b8115610d2957600854610d25906001600160701b0380821691600160701b90041661167f565b600b555b604080518581526020810185905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001600c5550949695505050505050565b600080600c54600114610d9c5760405162461bcd60e51b815260040161048790611fcf565b6000600c81905580610dac61095d565b506006546007546040516370a0823160e01b81523060048201529395509193506001600160a01b039081169291169060009083906370a0823190602401602060405180830381865afa158015610e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2a9190612045565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e989190612045565b30600090815260016020526040812054919250610eb58888611a2f565b60005490915080610ec6848761167f565b610ed0919061209d565b9a5080610edd848661167f565b610ee7919061209d565b995060008b118015610ef9575060008a115b610f555760405162461bcd60e51b815260206004820152602760248201527f48656e6c6f4465783a20494e53554646494349454e545f4c495155494449545960448201526617d0955493915160ca1b6064820152608401610487565b610f5f3084611c83565b610f6a878d8d611534565b610f75868d8c611534565b6040516370a0823160e01b81523060048201526001600160a01b038816906370a0823190602401602060405180830381865afa158015610fb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdd9190612045565b6040516370a0823160e01b81523060048201529095506001600160a01b038716906370a0823190602401602060405180830381865afa158015611024573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110489190612045565b935061105685858b8b61173c565b81156110805760085461107c906001600160701b0380821691600160701b90041661167f565b600b555b604080518c8152602081018c90526001600160a01b038e169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505050505050506001600c81905550915091565b6000610994338484611989565b600c5460011461110b5760405162461bcd60e51b815260040161048790611fcf565b6000600c556006546007546008546040516370a0823160e01b81523060048201526001600160a01b0393841693909216916111a691849186916111a1916001600160701b039091169084906370a08231906024015b602060405180830381865afa15801561117d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108659190612045565b611534565b6008546040516370a0823160e01b81523060048201526111f391839186916111a191600160701b9091046001600160701b0316906001600160a01b038516906370a0823190602401611160565b50506001600c5550565b428410156112415760405162461bcd60e51b815260206004820152601160248201527012195b9b1bd1195e0e8811561412549151607a1b6044820152606401610487565b6003546001600160a01b038816600090815260046020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611294836120b1565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161130d92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611378573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906113ae5750886001600160a01b0316816001600160a01b0316145b6113fa5760405162461bcd60e51b815260206004820152601b60248201527f48656e6c6f4465783a20494e56414c49445f5349474e415455524500000000006044820152606401610487565b611405898989611927565b505050505050505050565b600c546001146114325760405162461bcd60e51b815260040161048790611fcf565b6000600c556006546040516370a0823160e01b815230600482015261152d916001600160a01b0316906370a0823190602401602060405180830381865afa158015611481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a59190612045565b6007546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115119190612045565b6008546001600160701b0380821691600160701b90041661173c565b6001600c55565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180516001600160e01b031663a9059cbb60e01b179052915160009283928716916115c091906120ca565b6000604051808303816000865af19150503d80600081146115fd576040519150601f19603f3d011682016040523d82523d6000602084013e611602565b606091505b509150915081801561162c57508051158061162c57508080602001905181019061162c91906120e6565b6116785760405162461bcd60e51b815260206004820152601960248201527f48656e6c6f4465783a205452414e534645525f4641494c4544000000000000006044820152606401610487565b5050505050565b60008115806116a3575082826116958183612108565b92506116a1908361209d565b145b6109985760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b6044820152606401610487565b6000826116f38382612074565b91508111156109985760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b6044820152606401610487565b6001600160701b03841180159061175a57506001600160701b038311155b61179b5760405162461bcd60e51b815260206004820152601260248201527148656e6c6f4465783a204f564552464c4f5760701b6044820152606401610487565b60006117ac64010000000042612127565b6008549091506000906117cc90600160e01b900463ffffffff168361213b565b905060008163ffffffff161180156117ec57506001600160701b03841615155b801561180057506001600160701b03831615155b1561188f578063ffffffff166118288561181986611d0d565b6001600160e01b031690611d26565b6001600160e01b031661183b9190612108565b6009600082825461184c919061215f565b909155505063ffffffff81166118658461181987611d0d565b6001600160e01b03166118789190612108565b600a6000828254611889919061215f565b90915550505b6008805463ffffffff8416600160e01b026001600160e01b036001600160701b03898116600160701b9081026001600160e01b03199095168c83161794909417918216831794859055604080519382169282169290921783529290930490911660208201527f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1910160405180910390a1505050505050565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166000908152600160205260409020546119ac90826116e6565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546119db9082611d3b565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061197c9085815260200190565b600080600560009054906101000a90046001600160a01b03166001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa99190612172565b600b546001600160a01b038216158015945091925090611b58578015611b53576000611ae4610c296001600160701b0388811690881661167f565b90506000611af183611b6c565b905080821115611b50576000611b13611b0a84846116e6565b6000549061167f565b90506000611b2c83611b2686600561167f565b90611d3b565b90506000611b3a828461209d565b90508015611b4c57611b4c8782611bdc565b5050505b50505b611b64565b8015611b64576000600b555b505092915050565b60006003821115611bcd5750806000611b8660028361209d565b611b9190600161215f565b90505b81811015611bc757905080600281611bac818661209d565b611bb6919061215f565b611bc0919061209d565b9050611b94565b50919050565b8115611bd7575060015b919050565b600054611be99082611d3b565b60009081556001600160a01b038316815260016020526040902054611c0e9082611d3b565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c5f9085815260200190565b60405180910390a35050565b6000818310611c7a5781611c7c565b825b9392505050565b6001600160a01b038216600090815260016020526040902054611ca690826116e6565b6001600160a01b03831660009081526001602052604081209190915554611ccd90826116e6565b60009081556040518281526001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611c5f565b6000610998600160701b6001600160701b03841661218f565b6000611c7c6001600160701b038316846121be565b600082611d48838261215f565b91508110156109985760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b6044820152606401610487565b6001600160a01b0381168114611da557600080fd5b50565b600080600080600060808688031215611dc057600080fd5b85359450602086013593506040860135611dd981611d90565b9250606086013567ffffffffffffffff80821115611df657600080fd5b818801915088601f830112611e0a57600080fd5b813581811115611e1957600080fd5b896020828501011115611e2b57600080fd5b9699959850939650602001949392505050565b60005b83811015611e59578181015183820152602001611e41565b50506000910152565b6020815260008251806020840152611e81816040850160208701611e3e565b601f01601f19169190910160400192915050565b60008060408385031215611ea857600080fd5b8235611eb381611d90565b946020939093013593505050565b600080600060608486031215611ed657600080fd5b8335611ee181611d90565b92506020840135611ef181611d90565b929592945050506040919091013590565b60008060408385031215611f1557600080fd5b8235611f2081611d90565b91506020830135611f3081611d90565b809150509250929050565b600060208284031215611f4d57600080fd5b8135611c7c81611d90565b600080600080600080600060e0888a031215611f7357600080fd5b8735611f7e81611d90565b96506020880135611f8e81611d90565b95506040880135945060608801359350608088013560ff81168114611fb257600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60208082526010908201526f12195b9b1bd1195e0e881313d0d2d15160821b604082015260600190565b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b60006020828403121561205757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156109985761099861205e565b634e487b7160e01b600052601260045260246000fd5b6000826120ac576120ac612087565b500490565b6000600182016120c3576120c361205e565b5060010190565b600082516120dc818460208701611e3e565b9190910192915050565b6000602082840312156120f857600080fd5b81518015158114611c7c57600080fd5b60008160001904831182151516156121225761212261205e565b500290565b60008261213657612136612087565b500690565b63ffffffff8281168282160390808211156121585761215861205e565b5092915050565b808201808211156109985761099861205e565b60006020828403121561218457600080fd5b8151611c7c81611d90565b60006001600160e01b03828116848216811515828404821116156121b5576121b561205e565b02949350505050565b60006001600160e01b03838116806121d8576121d8612087565b9216919091049291505056fea2646970667358221220d961c59da4683e4e056bcbab32cd5ef78414bc2da399f7d3fd31ed536758233c64736f6c63430008100033