60806040526040516154e93803806154e983398181016040528101906100259190610544565b84338585815f90816100379190610800565b5080600190816100479190610800565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100ba575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100b191906108de565b60405180910390fd5b6100c98161029f60201b60201c565b5033600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036101b0576040517fc98a640700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610255576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050506108f7565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61039c82610373565b9050919050565b6103ac81610392565b81146103b6575f80fd5b50565b5f815190506103c7816103a3565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61041b826103d5565b810181811067ffffffffffffffff8211171561043a576104396103e5565b5b80604052505050565b5f61044c610362565b90506104588282610412565b919050565b5f67ffffffffffffffff821115610477576104766103e5565b5b610480826103d5565b9050602081019050919050565b8281835e5f83830152505050565b5f6104ad6104a88461045d565b610443565b9050828152602081018484840111156104c9576104c86103d1565b5b6104d484828561048d565b509392505050565b5f82601f8301126104f0576104ef6103cd565b5b815161050084826020860161049b565b91505092915050565b5f61051382610373565b9050919050565b61052381610509565b811461052d575f80fd5b50565b5f8151905061053e8161051a565b92915050565b5f805f805f60a0868803121561055d5761055c61036b565b5b5f61056a888289016103b9565b955050602086015167ffffffffffffffff81111561058b5761058a61036f565b5b610597888289016104dc565b945050604086015167ffffffffffffffff8111156105b8576105b761036f565b5b6105c4888289016104dc565b93505060606105d5888289016103b9565b92505060806105e688828901610530565b9150509295509295909350565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061064157607f821691505b602082108103610654576106536105fd565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026106b67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261067b565b6106c0868361067b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6107046106ff6106fa846106d8565b6106e1565b6106d8565b9050919050565b5f819050919050565b61071d836106ea565b6107316107298261070b565b848454610687565b825550505050565b5f90565b610745610739565b610750818484610714565b505050565b5b81811015610773576107685f8261073d565b600181019050610756565b5050565b601f8211156107b8576107898161065a565b6107928461066c565b810160208510156107a1578190505b6107b56107ad8561066c565b830182610755565b50505b505050565b5f82821c905092915050565b5f6107d85f19846008026107bd565b1980831691505092915050565b5f6107f083836107c9565b9150826002028217905092915050565b610809826105f3565b67ffffffffffffffff811115610822576108216103e5565b5b61082c825461062a565b610837828285610777565b5f60209050601f831160018114610868575f8415610856578287015190505b61086085826107e5565b8655506108c7565b601f1984166108768661065a565b5f5b8281101561089d57848901518255600182019150602085019450602081019050610878565b868310156108ba57848901516108b6601f8916826107c9565b8355505b6001600288020188555050505b505050505050565b6108d881610392565b82525050565b5f6020820190506108f15f8301846108cf565b92915050565b614be5806109045f395ff3fe608060405260043610610233575f3560e01c8063715018a61161012d578063a22cb465116100aa578063cc2531931161006e578063cc25319314610846578063e985e9c51461086e578063efef39a1146108aa578063f2fde38b146108c6578063fb72261e146108ee5761023a565b8063a22cb4651461076a578063ad3a358c14610792578063b88d4fde146107ba578063c290d691146107e2578063c87b56dd1461080a5761023a565b8063803b3e67116100f1578063803b3e67146106735780638da5cb5b146106b057806395d89b41146106da5780639b83cddc14610704578063a11b0712146107405761023a565b8063715018a6146105cb57806375c1631d146105e15780637a90b990146106095780637c79f6bc1461061f5780637df8599f146106495761023a565b80632f745c59116101bb57806342a338e61161017f57806342a338e6146104c55780634f6ccce7146104ef57806355f804b31461052b5780636352211e1461055357806370a082311461058f5761023a565b80632f745c59146103fb5780633ccfd60b1461043757806340c10f191461044d57806342842e0e1461047557806342966c681461049d5761023a565b8063098434c611610202578063098434c61461030857806309aff3891461034457806318160ddd1461036c57806323b872dd146103965780632a55205a146103be5761023a565b806301ffc9a71461023e57806306fdde031461027a578063081812fc146102a4578063095ea7b3146102e05761023a565b3661023a57005b5f80fd5b348015610249575f80fd5b50610264600480360381019061025f91906139a5565b61090a565b60405161027191906139ea565b60405180910390f35b348015610285575f80fd5b5061028e610983565b60405161029b9190613a73565b60405180910390f35b3480156102af575f80fd5b506102ca60048036038101906102c59190613ac6565b610a12565b6040516102d79190613b30565b60405180910390f35b3480156102eb575f80fd5b5061030660048036038101906103019190613b73565b610a2d565b005b348015610313575f80fd5b5061032e60048036038101906103299190613ac6565b610a43565b60405161033b9190613bc0565b60405180910390f35b34801561034f575f80fd5b5061036a60048036038101906103659190613c14565b610a58565b005b348015610377575f80fd5b50610380610b4b565b60405161038d9190613bc0565b60405180910390f35b3480156103a1575f80fd5b506103bc60048036038101906103b79190613c3f565b610b57565b005b3480156103c9575f80fd5b506103e460048036038101906103df9190613c8f565b610c56565b6040516103f2929190613ccd565b60405180910390f35b348015610406575f80fd5b50610421600480360381019061041c9190613b73565b610e4f565b60405161042e9190613bc0565b60405180910390f35b348015610442575f80fd5b5061044b610ef3565b005b348015610458575f80fd5b50610473600480360381019061046e9190613b73565b610f4d565b005b348015610480575f80fd5b5061049b60048036038101906104969190613c3f565b610f9f565b005b3480156104a8575f80fd5b506104c360048036038101906104be9190613ac6565b610fbe565b005b3480156104d0575f80fd5b506104d96110c3565b6040516104e69190613b30565b60405180910390f35b3480156104fa575f80fd5b5061051560048036038101906105109190613ac6565b6110e8565b6040516105229190613bc0565b60405180910390f35b348015610536575f80fd5b50610551600480360381019061054c9190613e20565b61115a565b005b34801561055e575f80fd5b5061057960048036038101906105749190613ac6565b611175565b6040516105869190613b30565b60405180910390f35b34801561059a575f80fd5b506105b560048036038101906105b09190613e67565b611186565b6040516105c29190613bc0565b60405180910390f35b3480156105d6575f80fd5b506105df61123c565b005b3480156105ec575f80fd5b5061060760048036038101906106029190613c8f565b61124f565b005b348015610614575f80fd5b5061061d611525565b005b34801561062a575f80fd5b506106336115ef565b6040516106409190613bc0565b60405180910390f35b348015610654575f80fd5b5061065d6115fa565b60405161066a9190613eed565b60405180910390f35b34801561067e575f80fd5b5061069960048036038101906106949190613f06565b61161f565b6040516106a7929190613ccd565b60405180910390f35b3480156106bb575f80fd5b506106c4611828565b6040516106d19190613b30565b60405180910390f35b3480156106e5575f80fd5b506106ee611850565b6040516106fb9190613a73565b60405180910390f35b34801561070f575f80fd5b5061072a60048036038101906107259190613ac6565b6118e0565b60405161073791906139ea565b60405180910390f35b34801561074b575f80fd5b506107546118fd565b6040516107619190613f87565b60405180910390f35b348015610775575f80fd5b50610790600480360381019061078b9190613fca565b611922565b005b34801561079d575f80fd5b506107b860048036038101906107b39190613ac6565b611938565b005b3480156107c5575f80fd5b506107e060048036038101906107db91906140a6565b611a71565b005b3480156107ed575f80fd5b5061080860048036038101906108039190613ac6565b611a8e565b005b348015610815575f80fd5b50610830600480360381019061082b9190613ac6565b611b81565b60405161083d9190613a73565b60405180910390f35b348015610851575f80fd5b5061086c60048036038101906108679190613e67565b611be7565b005b348015610879575f80fd5b50610894600480360381019061088f9190614126565b611cda565b6040516108a191906139ea565b60405180910390f35b6108c460048036038101906108bf9190613ac6565b611d68565b005b3480156108d1575f80fd5b506108ec60048036038101906108e79190613e67565b611ee9565b005b61090860048036038101906109039190613f06565b611f6d565b005b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097c575061097b826120dc565b5b9050919050565b60605f805461099190614191565b80601f01602080910402602001604051908101604052809291908181526020018280546109bd90614191565b8015610a085780601f106109df57610100808354040283529160200191610a08565b820191905f5260205f20905b8154815290600101906020018083116109eb57829003601f168201915b5050505050905090565b5f610a1c82612155565b50610a26826121db565b9050919050565b610a3f8282610a3a612214565b61221b565b5050565b6012602052805f5260405f205f915090505481565b610a6061222d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ac5576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f738a25469c34bac8d59917c1a370cf53892c5a4e2a29317354f461184f04911960405160405180910390a250565b5f600880549050905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bc7575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610bbe9190613b30565b60405180910390fd5b5f610bda8383610bd5612214565b6122b4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c50578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401610c47939291906141c1565b60405180910390fd5b50505050565b5f803073ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610c919190613bc0565b602060405180830381865afa925050508015610ccb57506040513d601f19601f82011682018060405250810190610cc8919061420a565b60015b610d01576040517f3f6cc76800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663773fe98630886040518363ffffffff1660e01b8152600401610d5e929190613ccd565b61010060405180830381865afa158015610d7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d9e9190614328565b9050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a68928e23088886040518463ffffffff1660e01b8152600401610dfe93929190614354565b602060405180830381865afa158015610e19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3d9190614389565b92508060a00151935050509250929050565b5f610e5983611186565b8210610e9e5782826040517fa57d13dc000000000000000000000000000000000000000000000000000000008152600401610e95929190613ccd565b60405180910390fd5b60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f2054905092915050565b610efb61222d565b5f610f04611828565b90508073ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015610f49573d5f803e3d5ffd5b5050565b610f5782826122c9565b808273ffffffffffffffffffffffffffffffffffffffff167fb9144c96c86541f6fa89c9f2f02495cccf4b08cd6643e26d34ee00aa586558a860405160405180910390a35050565b610fb983838360405180602001604052805f815250611a71565b505050565b5f610fc882611175565b90505f610fd483610a12565b90508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561103e57508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b8015611051575061104f8233611cda565b155b15611088576040517f955c501b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611091836122e6565b827f0c526103b8f47af5516191d0c89a598755bd00faa211a3cb52e4c2cc782f7fe260405160405180910390a2505050565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6110f1610b4b565b8210611136575f826040517fa57d13dc00000000000000000000000000000000000000000000000000000000815260040161112d929190613ccd565b60405180910390fd5b6008828154811061114a576111496143b4565b5b905f5260205f2001549050919050565b61116261222d565b80600f90816111719190614575565b5050565b5f61117f82612155565b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111f7575f6040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016111ee9190613b30565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61124461222d565b61124d5f612368565b565b5f3373ffffffffffffffffffffffffffffffffffffffff1661127084611175565b73ffffffffffffffffffffffffffffffffffffffff16146112bd576040517f59dc379f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82036112f6576040517ffc15c67900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115f8481526020019081526020015f205f9054906101000a900460ff161561134b576040517fdeaabdc200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016113849190613bc0565b602060405180830381865afa9250505080156113be57506040513d601f19601f820116820180604052508101906113bb919061420a565b60015b6113f4576040517f3f6cc76800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cdadb55e30866040518363ffffffff1660e01b8152600401611450929190613ccd565b61012060405180830381865afa15801561146c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114909190614721565b6060015191505f82036114a857662386f26fc1000091505b50600160115f8581526020019081526020015f205f6101000a81548160ff0219169083151502179055508060125f8581526020019081526020015f20819055506114f23084610a2d565b81837f1ea85aaf6731daa0c29195039c2a36576fb04e2cd16335504fab8967dfb03f1560405160405180910390a3505050565b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b6c56ec306040518263ffffffff1660e01b81526004016115809190613b30565b602060405180830381865afa15801561159b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115bf9190614389565b90506115ec600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261242b565b50565b662386f26fc1000081565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f803073ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b815260040161165a9190613bc0565b602060405180830381865afa92505050801561169457506040513d601f19601f82011682018060405250810190611691919061420a565b60015b6116ca576040517f3f6cc76800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663773fe98630886040518363ffffffff1660e01b8152600401611727929190613ccd565b61010060405180830381865afa158015611743573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117679190614328565b9050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a68928e23088886040518463ffffffff1660e01b81526004016117c793929190614354565b602060405180830381865afa1580156117e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118069190614389565b92506118178160a001518487612572565b8060a0015193505050935093915050565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461185f90614191565b80601f016020809104026020016040519081016040528092919081815260200182805461188b90614191565b80156118d65780601f106118ad576101008083540402835291602001916118d6565b820191905f5260205f20905b8154815290600101906020018083116118b957829003601f168201915b5050505050905090565b6011602052805f5260405f205f915054906101000a900460ff1681565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61193461192d612214565b8383612822565b5050565b3373ffffffffffffffffffffffffffffffffffffffff1661195882611175565b73ffffffffffffffffffffffffffffffffffffffff16146119a5576040517f59dc379f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115f8281526020019081526020015f205f9054906101000a900460ff166119f9576040517fc5f0a1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60115f8381526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60125f8381526020019081526020015f2081905550611a415f82610a2d565b807fe0bba5d0bdeddbcc4ef688b9d8170c81883fb4c4a7065d8970c58b47996dd2d760405160405180910390a250565b611a7c848484610b57565b611a888484848461298b565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff16600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611b355750600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6b90614797565b60405180910390fd5b611b7e338261242b565b50565b6060611b8c82612155565b505f611b96612b3d565b90505f815111611bb45760405180602001604052805f815250611bdf565b80611bbe84612bcd565b604051602001611bcf9291906147ef565b6040516020818303038152906040525b915050919050565b611bef61222d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c54576040517fc98a640700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f39753a6336ef533f6e1785dcab15abdacaf0467b09c6127c32053ad75bcefc6760405160405180910390a250565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b60115f8281526020019081526020015f205f9054906101000a900460ff16611dbc576040517fc5f0a1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611dc682611175565b90505f60125f8481526020019081526020015f20549050803414611e16576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60115f8581526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60125f8581526020019081526020015f2081905550611e9f823385610b57565b34833073ffffffffffffffffffffffffffffffffffffffff167ffd2fdad9544930ef86eaab1cb0a9a131218468940f06c00aeba1844e33e08fa260405160405180910390a4505050565b611ef161222d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f61575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611f589190613b30565b60405180910390fd5b611f6a81612368565b50565b611f7561222d565b5f606483611f83919061486c565b905060115f8381526020019081526020015f205f9054906101000a900460ff16611fd9576040517fc5f0a1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611fe383611175565b90508147101561201f576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663803b3e675f85856040518463ffffffff1660e01b815260040161205c93929190614354565b60408051808303815f875af1158015612077573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061209b919061489c565b50506120a8813085610b57565b827f2b7170d02ad1822b7c2251889c5c9a2f8be79968856eba4c1d5097f62873961160405160405180910390a25050505050565b5f7f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061214e575061214d82612c97565b5b9050919050565b5f8061216083612d78565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036121d257826040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016121c99190613bc0565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b6122288383836001612db1565b505050565b612235612214565b73ffffffffffffffffffffffffffffffffffffffff16612253611828565b73ffffffffffffffffffffffffffffffffffffffff16146122b257612276612214565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016122a99190613b30565b60405180910390fd5b565b5f6122c0848484612f70565b90509392505050565b6122e2828260405180602001604052805f81525061308a565b5050565b5f6122f25f835f6122b4565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361236457816040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161235b9190613bc0565b60405180910390fd5b5050565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8047101561246e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246590614924565b60405180910390fd5b5f81111561256e575f8273ffffffffffffffffffffffffffffffffffffffff16825f67ffffffffffffffff8111156124a9576124a8613cfc565b5b6040519080825280601f01601f1916602001820160405280156124db5781602001600182028036833780820191505090505b506040516124e99190614986565b5f6040518083038185875af1925050503d805f8114612523576040519150601f19603f3d011682016040523d82523d5f602084013e612528565b606091505b505090508061256c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612563906149e6565b60405180910390fd5b505b5050565b804710156125ac576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82826125b99190614a04565b90505f8473ffffffffffffffffffffffffffffffffffffffff16846040516125e090614a5a565b5f6040518083038185875af1925050503d805f811461261a576040519150601f19603f3d011682016040523d82523d5f602084013e61261f565b606091505b505090508061265a576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156126b657505f82115b1561277d575f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161270190614a5a565b5f6040518083038185875af1925050503d805f811461273b576040519150601f19603f3d011682016040523d82523d5f602084013e612740565b606091505b505090508061277b576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5f60105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f03eaff06e69e92c6b9ada936b631fc33ec4108efa838fc77d75eba9d613e6539858560105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040516128139493929190614a6e565b60405180910390a15050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361289257816040517f5b08ba180000000000000000000000000000000000000000000000000000000081526004016128899190613b30565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161297e91906139ea565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115612b37578273ffffffffffffffffffffffffffffffffffffffff1663150b7a026129ce612214565b8685856040518563ffffffff1660e01b81526004016129f09493929190614af9565b6020604051808303815f875af1925050508015612a2b57506040513d601f19601f82011682018060405250810190612a289190614b57565b60015b612aac573d805f8114612a59576040519150601f19603f3d011682016040523d82523d5f602084013e612a5e565b606091505b505f815103612aa457836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612a9b9190613b30565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612b3557836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612b2c9190613b30565b60405180910390fd5b505b50505050565b6060600f8054612b4c90614191565b80601f0160208091040260200160405190810160405280929190818152602001828054612b7890614191565b8015612bc35780601f10612b9a57610100808354040283529160200191612bc3565b820191905f5260205f20905b815481529060010190602001808311612ba657829003601f168201915b5050505050905090565b60605f6001612bdb846130a5565b0190505f8167ffffffffffffffff811115612bf957612bf8613cfc565b5b6040519080825280601f01601f191660200182016040528015612c2b5781602001600182028036833780820191505090505b5090505f82602001820190505b600115612c8c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612c8157612c80614812565b5b0494505f8503612c38575b819350505050919050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d6157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d715750612d70826131f6565b5b9050919050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8080612de957505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612f1b575f612df884612155565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612e6257508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015612e755750612e738184611cda565b155b15612eb757826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401612eae9190613b30565b60405180910390fd5b8115612f1957838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b5f80612f7d85858561325f565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612fc057612fbb8461346a565b612fff565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612ffe57612ffd81856134ae565b5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036130405761303b84613585565b61307f565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461307e5761307d8585613645565b5b5b809150509392505050565b61309483836136c9565b6130a05f84848461298b565b505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613101577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816130f7576130f6614812565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061313e576d04ee2d6d415b85acef8100000000838161313457613133614812565b5b0492506020810190505b662386f26fc10000831061316d57662386f26fc10000838161316357613162614812565b5b0492506010810190505b6305f5e1008310613196576305f5e100838161318c5761318b614812565b5b0492506008810190505b61271083106131bb5761271083816131b1576131b0614812565b5b0492506004810190505b606483106131de57606483816131d4576131d3614812565b5b0492506002810190505b600a83106131ed576001810190505b80915050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8061326a84612d78565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146132ab576132aa8184866137bc565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613336576132ea5f855f80612db1565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146133b557600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b60088054905060095f8381526020019081526020015f2081905550600881908060018154018082558091505060019003905f5260205f20015f909190919091505550565b5f6134b883611186565b90505f60075f8481526020019081526020015f205490505f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f209050828214613557575f815f8581526020019081526020015f2054905080825f8581526020019081526020015f20819055508260075f8381526020019081526020015f2081905550505b60075f8581526020019081526020015f205f9055805f8481526020019081526020015f205f90555050505050565b5f60016008805490506135989190614a04565b90505f60095f8481526020019081526020015f205490505f600883815481106135c4576135c36143b4565b5b905f5260205f200154905080600883815481106135e4576135e36143b4565b5b905f5260205f2001819055508160095f8381526020019081526020015f208190555060095f8581526020019081526020015f205f9055600880548061362c5761362b614b82565b5b600190038181905f5260205f20015f9055905550505050565b5f600161365184611186565b61365b9190614a04565b90508160065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20819055508060075f8481526020019081526020015f2081905550505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613739575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016137309190613b30565b60405180910390fd5b5f61374583835f6122b4565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146137b7575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016137ae9190613b30565b60405180910390fd5b505050565b6137c783838361387f565b61387a575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361383b57806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016138329190613bc0565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401613871929190613ccd565b60405180910390fd5b505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561393657508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806138f757506138f68484611cda565b5b8061393557508273ffffffffffffffffffffffffffffffffffffffff1661391d836121db565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61398481613950565b811461398e575f80fd5b50565b5f8135905061399f8161397b565b92915050565b5f602082840312156139ba576139b9613948565b5b5f6139c784828501613991565b91505092915050565b5f8115159050919050565b6139e4816139d0565b82525050565b5f6020820190506139fd5f8301846139db565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f613a4582613a03565b613a4f8185613a0d565b9350613a5f818560208601613a1d565b613a6881613a2b565b840191505092915050565b5f6020820190508181035f830152613a8b8184613a3b565b905092915050565b5f819050919050565b613aa581613a93565b8114613aaf575f80fd5b50565b5f81359050613ac081613a9c565b92915050565b5f60208284031215613adb57613ada613948565b5b5f613ae884828501613ab2565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613b1a82613af1565b9050919050565b613b2a81613b10565b82525050565b5f602082019050613b435f830184613b21565b92915050565b613b5281613b10565b8114613b5c575f80fd5b50565b5f81359050613b6d81613b49565b92915050565b5f8060408385031215613b8957613b88613948565b5b5f613b9685828601613b5f565b9250506020613ba785828601613ab2565b9150509250929050565b613bba81613a93565b82525050565b5f602082019050613bd35f830184613bb1565b92915050565b5f613be382613af1565b9050919050565b613bf381613bd9565b8114613bfd575f80fd5b50565b5f81359050613c0e81613bea565b92915050565b5f60208284031215613c2957613c28613948565b5b5f613c3684828501613c00565b91505092915050565b5f805f60608486031215613c5657613c55613948565b5b5f613c6386828701613b5f565b9350506020613c7486828701613b5f565b9250506040613c8586828701613ab2565b9150509250925092565b5f8060408385031215613ca557613ca4613948565b5b5f613cb285828601613ab2565b9250506020613cc385828601613ab2565b9150509250929050565b5f604082019050613ce05f830185613b21565b613ced6020830184613bb1565b9392505050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613d3282613a2b565b810181811067ffffffffffffffff82111715613d5157613d50613cfc565b5b80604052505050565b5f613d6361393f565b9050613d6f8282613d29565b919050565b5f67ffffffffffffffff821115613d8e57613d8d613cfc565b5b613d9782613a2b565b9050602081019050919050565b828183375f83830152505050565b5f613dc4613dbf84613d74565b613d5a565b905082815260208101848484011115613de057613ddf613cf8565b5b613deb848285613da4565b509392505050565b5f82601f830112613e0757613e06613cf4565b5b8135613e17848260208601613db2565b91505092915050565b5f60208284031215613e3557613e34613948565b5b5f82013567ffffffffffffffff811115613e5257613e5161394c565b5b613e5e84828501613df3565b91505092915050565b5f60208284031215613e7c57613e7b613948565b5b5f613e8984828501613b5f565b91505092915050565b5f819050919050565b5f613eb5613eb0613eab84613af1565b613e92565b613af1565b9050919050565b5f613ec682613e9b565b9050919050565b5f613ed782613ebc565b9050919050565b613ee781613ecd565b82525050565b5f602082019050613f005f830184613ede565b92915050565b5f805f60608486031215613f1d57613f1c613948565b5b5f613f2a86828701613b5f565b9350506020613f3b86828701613ab2565b9250506040613f4c86828701613ab2565b9150509250925092565b5f613f6082613e9b565b9050919050565b5f613f7182613f56565b9050919050565b613f8181613f67565b82525050565b5f602082019050613f9a5f830184613f78565b92915050565b613fa9816139d0565b8114613fb3575f80fd5b50565b5f81359050613fc481613fa0565b92915050565b5f8060408385031215613fe057613fdf613948565b5b5f613fed85828601613b5f565b9250506020613ffe85828601613fb6565b9150509250929050565b5f67ffffffffffffffff82111561402257614021613cfc565b5b61402b82613a2b565b9050602081019050919050565b5f61404a61404584614008565b613d5a565b90508281526020810184848401111561406657614065613cf8565b5b614071848285613da4565b509392505050565b5f82601f83011261408d5761408c613cf4565b5b813561409d848260208601614038565b91505092915050565b5f805f80608085870312156140be576140bd613948565b5b5f6140cb87828801613b5f565b94505060206140dc87828801613b5f565b93505060406140ed87828801613ab2565b925050606085013567ffffffffffffffff81111561410e5761410d61394c565b5b61411a87828801614079565b91505092959194509250565b5f806040838503121561413c5761413b613948565b5b5f61414985828601613b5f565b925050602061415a85828601613b5f565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806141a857607f821691505b6020821081036141bb576141ba614164565b5b50919050565b5f6060820190506141d45f830186613b21565b6141e16020830185613bb1565b6141ee6040830184613b21565b949350505050565b5f8151905061420481613b49565b92915050565b5f6020828403121561421f5761421e613948565b5b5f61422c848285016141f6565b91505092915050565b5f80fd5b5f8151905061424781613a9c565b92915050565b5f8151905061425b81613fa0565b92915050565b5f610100828403121561427757614276614235565b5b614282610100613d5a565b90505f61429184828501614239565b5f8301525060206142a484828501614239565b60208301525060406142b884828501614239565b60408301525060606142cc84828501614239565b60608301525060806142e084828501614239565b60808301525060a06142f4848285016141f6565b60a08301525060c061430884828501614239565b60c08301525060e061431c8482850161424d565b60e08301525092915050565b5f610100828403121561433e5761433d613948565b5b5f61434b84828501614261565b91505092915050565b5f6060820190506143675f830186613b21565b6143746020830185613bb1565b6143816040830184613bb1565b949350505050565b5f6020828403121561439e5761439d613948565b5b5f6143ab84828501614239565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261443d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614402565b6144478683614402565b95508019841693508086168417925050509392505050565b5f61447961447461446f84613a93565b613e92565b613a93565b9050919050565b5f819050919050565b6144928361445f565b6144a661449e82614480565b84845461440e565b825550505050565b5f90565b6144ba6144ae565b6144c5818484614489565b505050565b5b818110156144e8576144dd5f826144b2565b6001810190506144cb565b5050565b601f82111561452d576144fe816143e1565b614507846143f3565b81016020851015614516578190505b61452a614522856143f3565b8301826144ca565b50505b505050565b5f82821c905092915050565b5f61454d5f1984600802614532565b1980831691505092915050565b5f614565838361453e565b9150826002028217905092915050565b61457e82613a03565b67ffffffffffffffff81111561459757614596613cfc565b5b6145a18254614191565b6145ac8282856144ec565b5f60209050601f8311600181146145dd575f84156145cb578287015190505b6145d5858261455a565b86555061463c565b601f1984166145eb866143e1565b5f5b82811015614612578489015182556001820191506020850194506020810190506145ed565b8683101561462f578489015161462b601f89168261453e565b8355505b6001600288020188555050505b505050505050565b5f610120828403121561465a57614659614235565b5b614665610120613d5a565b90505f61467484828501614239565b5f83015250602061468784828501614239565b602083015250604061469b84828501614239565b60408301525060606146af84828501614239565b60608301525060806146c384828501614239565b60808301525060a06146d784828501614239565b60a08301525060c06146eb84828501614239565b60c08301525060e06146ff84828501614239565b60e08301525061010061471484828501614239565b6101008301525092915050565b5f610120828403121561473757614736613948565b5b5f61474484828501614644565b91505092915050565b7f417574686f72697a65642073656e646572206f6e6c79000000000000000000005f82015250565b5f614781601683613a0d565b915061478c8261474d565b602082019050919050565b5f6020820190508181035f8301526147ae81614775565b9050919050565b5f81905092915050565b5f6147c982613a03565b6147d381856147b5565b93506147e3818560208601613a1d565b80840191505092915050565b5f6147fa82856147bf565b915061480682846147bf565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61487682613a93565b915061488183613a93565b92508261489157614890614812565b5b828204905092915050565b5f80604083850312156148b2576148b1613948565b5b5f6148bf858286016141f6565b92505060206148d085828601614239565b9150509250929050565b7f496e73756666696369656e742066756e647300000000000000000000000000005f82015250565b5f61490e601283613a0d565b9150614919826148da565b602082019050919050565b5f6020820190508181035f83015261493b81614902565b9050919050565b5f81519050919050565b5f81905092915050565b5f61496082614942565b61496a818561494c565b935061497a818560208601613a1d565b80840191505092915050565b5f6149918284614956565b915081905092915050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f6149d0600f83613a0d565b91506149db8261499c565b602082019050919050565b5f6020820190508181035f8301526149fd816149c4565b9050919050565b5f614a0e82613a93565b9150614a1983613a93565b9250828203905081811115614a3157614a3061483f565b5b92915050565b50565b5f614a455f8361494c565b9150614a5082614a37565b5f82019050919050565b5f614a6482614a3a565b9150819050919050565b5f608082019050614a815f830187613b21565b614a8e6020830186613bb1565b614a9b6040830185613b21565b614aa86060830184613bb1565b95945050505050565b5f82825260208201905092915050565b5f614acb82614942565b614ad58185614ab1565b9350614ae5818560208601613a1d565b614aee81613a2b565b840191505092915050565b5f608082019050614b0c5f830187613b21565b614b196020830186613b21565b614b266040830185613bb1565b8181036060830152614b388184614ac1565b905095945050505050565b5f81519050614b518161397b565b92915050565b5f60208284031215614b6c57614b6b613948565b5b5f614b7984828501614b43565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220c275efb22c8c393b732195a520f58fbef3ba6e64130562d44bc108c5f539b41364736f6c634300081a0033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000001fce42bde6453bd4fd7d7069459530a0aba397a00000000000000000000000003673760073ef6f8b1145a60dcdfe04fc23f42057000000000000000000000000000000000000000000000000000000000000001344594e414d494320524f59414c5459204e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000344524e0000000000000000000000000000000000000000000000000000000000