Contract Address Details

0xE29672f34e92b56C9169f9D485fFc8b9A136BCE4

Contract Name
EthereumDIDRegistry
Creator
0x8d6c8c–53d3e1 at 0x777147–a591ac
Balance
0 EWT ( )
Tokens
Fetching tokens...
Transactions
134 Transactions
Transfers
0 Transfers
Gas Used
6,409,525
Last Balance Update
33408441
Contract name:
EthereumDIDRegistry




Optimization enabled
false
Compiler version
v0.8.7+commit.e28d00a7




EVM Version
default




Verified at
2021-12-15T16:26:38.334055Z

Contract source code

pragma solidity ^0.8.6;

contract EthereumDIDRegistry {

  mapping(address => address) public owners;
  mapping(address => mapping(bytes32 => mapping(address => uint))) public delegates;
  mapping(address => uint) public changed;
  mapping(address => uint) public nonce;

  modifier onlyOwner(address identity, address actor) {
    require (actor == identityOwner(identity));
    _;
  }

  event DIDOwnerChanged(
    address indexed identity,
    address owner,
    uint previousChange
  );

  event DIDDelegateChanged(
    address indexed identity,
    bytes32 delegateType,
    address delegate,
    uint validTo,
    uint previousChange
  );

  event DIDAttributeChanged(
    address indexed identity,
    bytes32 name,
    bytes value,
    uint validTo,
    uint previousChange
  );

  function identityOwner(address identity) public view returns(address) {
     address owner = owners[identity];
     if (owner != 0x0000000000000000000000000000000000000000) {
       return owner;
     }
     return identity;
  }

  function checkSignature(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes32 hash) internal returns(address) {
    address signer = ecrecover(hash, sigV, sigR, sigS);
    require(signer == identityOwner(identity));
    nonce[signer]++;
    return signer;
  }

  function validDelegate(address identity, bytes32 delegateType, address delegate) public view returns(bool) {
    uint validity = delegates[identity][keccak256(abi.encode(delegateType))][delegate];
    return (validity > block.timestamp);
  }

  function changeOwner(address identity, address actor, address newOwner) internal onlyOwner(identity, actor) {
    owners[identity] = newOwner;
    emit DIDOwnerChanged(identity, newOwner, changed[identity]);
    changed[identity] = block.number;
  }

  function changeOwner(address identity, address newOwner) public {
    changeOwner(identity, msg.sender, newOwner);
  }

  function changeOwnerSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, address newOwner) public {
    bytes32 hash = keccak256(abi.encodePacked(bytes1(0x19), bytes1(0), this, nonce[identityOwner(identity)], identity, "changeOwner", newOwner));
    changeOwner(identity, checkSignature(identity, sigV, sigR, sigS, hash), newOwner);
  }

  function addDelegate(address identity, address actor, bytes32 delegateType, address delegate, uint validity) internal onlyOwner(identity, actor) {
    delegates[identity][keccak256(abi.encode(delegateType))][delegate] = block.timestamp + validity;
    emit DIDDelegateChanged(identity, delegateType, delegate, block.timestamp + validity, changed[identity]);
    changed[identity] = block.number;
  }

  function addDelegate(address identity, bytes32 delegateType, address delegate, uint validity) public {
    addDelegate(identity, msg.sender, delegateType, delegate, validity);
  }

  function addDelegateSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes32 delegateType, address delegate, uint validity) public {
    bytes32 hash = keccak256(abi.encodePacked(bytes1(0x19), bytes1(0), this, nonce[identityOwner(identity)], identity, "addDelegate", delegateType, delegate, validity));
    addDelegate(identity, checkSignature(identity, sigV, sigR, sigS, hash), delegateType, delegate, validity);
  }

  function revokeDelegate(address identity, address actor, bytes32 delegateType, address delegate) internal onlyOwner(identity, actor) {
    delegates[identity][keccak256(abi.encode(delegateType))][delegate] = block.timestamp;
    emit DIDDelegateChanged(identity, delegateType, delegate, block.timestamp, changed[identity]);
    changed[identity] = block.number;
  }

  function revokeDelegate(address identity, bytes32 delegateType, address delegate) public {
    revokeDelegate(identity, msg.sender, delegateType, delegate);
  }

  function revokeDelegateSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes32 delegateType, address delegate) public {
    bytes32 hash = keccak256(abi.encodePacked(bytes1(0x19), bytes1(0), this, nonce[identityOwner(identity)], identity, "revokeDelegate", delegateType, delegate));
    revokeDelegate(identity, checkSignature(identity, sigV, sigR, sigS, hash), delegateType, delegate);
  }

  function setAttribute(address identity, address actor, bytes32 name, bytes memory value, uint validity ) internal onlyOwner(identity, actor) {
    emit DIDAttributeChanged(identity, name, value, block.timestamp + validity, changed[identity]);
    changed[identity] = block.number;
  }

  function setAttribute(address identity, bytes32 name, bytes memory value, uint validity) public {
    setAttribute(identity, msg.sender, name, value, validity);
  }

  function setAttributeSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes32 name, bytes memory value, uint validity) public {
    bytes32 hash = keccak256(abi.encodePacked(bytes1(0x19), bytes1(0), this, nonce[identityOwner(identity)], identity, "setAttribute", name, value, validity));
    setAttribute(identity, checkSignature(identity, sigV, sigR, sigS, hash), name, value, validity);
  }

  function revokeAttribute(address identity, address actor, bytes32 name, bytes memory value ) internal onlyOwner(identity, actor) {
    emit DIDAttributeChanged(identity, name, value, 0, changed[identity]);
    changed[identity] = block.number;
  }

  function revokeAttribute(address identity, bytes32 name, bytes memory value) public {
    revokeAttribute(identity, msg.sender, name, value);
  }

 function revokeAttributeSigned(address identity, uint8 sigV, bytes32 sigR, bytes32 sigS, bytes32 name, bytes memory value) public {
    bytes32 hash = keccak256(abi.encodePacked(bytes1(0x19), bytes1(0), this, nonce[identityOwner(identity)], identity, "revokeAttribute", name, value)); 
    revokeAttribute(identity, checkSignature(identity, sigV, sigR, sigS, hash), name, value);
  }

}
        

Contract ABI

[{"type":"event","name":"DIDAttributeChanged","inputs":[{"type":"address","name":"identity","internalType":"address","indexed":true},{"type":"bytes32","name":"name","internalType":"bytes32","indexed":false},{"type":"bytes","name":"value","internalType":"bytes","indexed":false},{"type":"uint256","name":"validTo","internalType":"uint256","indexed":false},{"type":"uint256","name":"previousChange","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"DIDDelegateChanged","inputs":[{"type":"address","name":"identity","internalType":"address","indexed":true},{"type":"bytes32","name":"delegateType","internalType":"bytes32","indexed":false},{"type":"address","name":"delegate","internalType":"address","indexed":false},{"type":"uint256","name":"validTo","internalType":"uint256","indexed":false},{"type":"uint256","name":"previousChange","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"DIDOwnerChanged","inputs":[{"type":"address","name":"identity","internalType":"address","indexed":true},{"type":"address","name":"owner","internalType":"address","indexed":false},{"type":"uint256","name":"previousChange","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addDelegate","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"bytes32","name":"delegateType","internalType":"bytes32"},{"type":"address","name":"delegate","internalType":"address"},{"type":"uint256","name":"validity","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addDelegateSigned","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"uint8","name":"sigV","internalType":"uint8"},{"type":"bytes32","name":"sigR","internalType":"bytes32"},{"type":"bytes32","name":"sigS","internalType":"bytes32"},{"type":"bytes32","name":"delegateType","internalType":"bytes32"},{"type":"address","name":"delegate","internalType":"address"},{"type":"uint256","name":"validity","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeOwner","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeOwnerSigned","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"uint8","name":"sigV","internalType":"uint8"},{"type":"bytes32","name":"sigR","internalType":"bytes32"},{"type":"bytes32","name":"sigS","internalType":"bytes32"},{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"changed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"delegates","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"bytes32","name":"","internalType":"bytes32"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"identityOwner","inputs":[{"type":"address","name":"identity","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonce","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owners","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeAttribute","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"bytes32","name":"name","internalType":"bytes32"},{"type":"bytes","name":"value","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeAttributeSigned","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"uint8","name":"sigV","internalType":"uint8"},{"type":"bytes32","name":"sigR","internalType":"bytes32"},{"type":"bytes32","name":"sigS","internalType":"bytes32"},{"type":"bytes32","name":"name","internalType":"bytes32"},{"type":"bytes","name":"value","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeDelegate","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"bytes32","name":"delegateType","internalType":"bytes32"},{"type":"address","name":"delegate","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"revokeDelegateSigned","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"uint8","name":"sigV","internalType":"uint8"},{"type":"bytes32","name":"sigR","internalType":"bytes32"},{"type":"bytes32","name":"sigS","internalType":"bytes32"},{"type":"bytes32","name":"delegateType","internalType":"bytes32"},{"type":"address","name":"delegate","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAttribute","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"bytes32","name":"name","internalType":"bytes32"},{"type":"bytes","name":"value","internalType":"bytes"},{"type":"uint256","name":"validity","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAttributeSigned","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"uint8","name":"sigV","internalType":"uint8"},{"type":"bytes32","name":"sigR","internalType":"bytes32"},{"type":"bytes32","name":"sigS","internalType":"bytes32"},{"type":"bytes32","name":"name","internalType":"bytes32"},{"type":"bytes","name":"value","internalType":"bytes"},{"type":"uint256","name":"validity","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"validDelegate","inputs":[{"type":"address","name":"identity","internalType":"address"},{"type":"bytes32","name":"delegateType","internalType":"bytes32"},{"type":"address","name":"delegate","internalType":"address"}]}]
            

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100ff5760003560e01c806380b29f7c11610097578063a7068d6611610066578063a7068d66146102b8578063e476af5c146102d4578063f00d4b5d146102f0578063f96d0f9f1461030c576100ff565b806380b29f7c146102345780638733d4e81461025057806393072684146102805780639c2c1b2b1461029c576100ff565b8063240cf1fa116100d3578063240cf1fa1461019c578063622b2a3c146101b857806370ae92d2146101e85780637ad4b0a414610218576100ff565b8062c023da14610104578063022914a7146101205780630d44625b14610150578063123b5e9814610180575b600080fd5b61011e60048036038101906101199190611372565b61033c565b005b61013a6004803603810190610135919061124b565b61034d565b6040516101479190611c20565b60405180910390f35b61016a600480360381019061016591906112b8565b610380565b6040516101779190611dbc565b60405180910390f35b61019a600480360381019061019591906116b7565b6103b2565b005b6101b660048036038101906101b19190611464565b61045d565b005b6101d260048036038101906101cd91906112b8565b610500565b6040516101df9190611c64565b60405180910390f35b61020260048036038101906101fd919061124b565b6105c6565b60405161020f9190611dbc565b60405180910390f35b610232600480360381019061022d91906113e1565b6105de565b005b61024e600480360381019061024991906112b8565b6105f1565b005b61026a6004803603810190610265919061124b565b610602565b6040516102779190611c20565b60405180910390f35b61029a600480360381019061029591906114df565b6106ad565b005b6102b660048036038101906102b1919061156c565b610754565b005b6102d260048036038101906102cd919061130b565b6107ff565b005b6102ee60048036038101906102e9919061160e565b610812565b005b61030a60048036038101906103059190611278565b6108b9565b005b6103266004803603810190610321919061124b565b6108c8565b6040516103339190611dbc565b60405180910390f35b610348833384846108e0565b505050565b60006020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160205282600052604060002060205281600052604060002060205280600052604060002060009250925050505481565b6000601960f81b600060f81b30600360006103cc8d610602565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548b888888604051602001610422989796959493929190611afb565b6040516020818303038152906040528051906020012090506104538861044b8a8a8a8a87610a02565b868686610af8565b5050505050505050565b6000601960f81b600060f81b30600360006104778b610602565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205489866040516020016104c9969594939291906119e3565b6040516020818303038152906040528051906020012090506104f8866104f28888888887610a02565b84610c25565b505050505050565b600080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000856040516020016105559190611c7f565b60405160208183030381529060405280519060200120815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490504281119150509392505050565b60036020528060005260406000206000915090505481565b6105eb8433858585610af8565b50505050565b6105fd83338484610dbe565b505050565b6000806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106a357809150506106a8565b829150505b919050565b6000601960f81b600060f81b30600360006106c78c610602565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548a878760405160200161071b9796959493929190611b94565b60405160208183030381529060405280519060200120905061074b876107448989898987610a02565b8585610dbe565b50505050505050565b6000601960f81b600060f81b306003600061076e8d610602565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548b8888886040516020016107c4989796959493929190611a5e565b6040516020818303038152906040528051906020012090506107f5886107ed8a8a8a8a87610a02565b868686610f97565b5050505050505050565b61080c8433858585610f97565b50505050565b6000601960f81b600060f81b306003600061082c8c610602565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548a8787604051602001610880979695949392919061195b565b6040516020818303038152906040528051906020012090506108b0876108a98989898987610a02565b85856108e0565b50505050505050565b6108c4823383610c25565b5050565b60026020528060005260406000206000915090505481565b83836108eb82610602565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461092257600080fd5b8573ffffffffffffffffffffffffffffffffffffffff167f18ab6b2ae3d64306c00ce663125f2bd680e441a098de1635bd7ad8b0d44965e485856000600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516109ae9493929190611cdf565b60405180910390a243600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050505050565b60008060018387878760405160008152602001604052604051610a289493929190611d77565b6020604051602081039080840390855afa158015610a4a573d6000803e3d6000fd5b505050602060405103519050610a5f87610602565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a9657600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610ae690611ffb565b91905055508091505095945050505050565b8484610b0382610602565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b3a57600080fd5b8673ffffffffffffffffffffffffffffffffffffffff167f18ab6b2ae3d64306c00ce663125f2bd680e441a098de1635bd7ad8b0d44965e486868642610b809190611e5f565b600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051610bd09493929190611d2b565b60405180910390a243600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050505050565b8282610c3082610602565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c6757600080fd5b826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff167f38a5a6e68f30ed1ab45860a4afb34bcb2fc00f22ca462d249b8a8d40cda6f7a384600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051610d6b929190611c3b565b60405180910390a243600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050565b8383610dc982610602565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e0057600080fd5b42600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086604051602001610e539190611c7f565b60405160208183030381529060405280519060200120815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff167f5a5084339536bcab65f20799fcc58724588145ca054bd2be626174b27ba156f7858542600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051610f439493929190611c9a565b60405180910390a243600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050505050565b8484610fa282610602565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fd957600080fd5b8242610fe59190611e5f565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000876040516020016110379190611c7f565b60405160208183030381529060405280519060200120815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508673ffffffffffffffffffffffffffffffffffffffff167f5a5084339536bcab65f20799fcc58724588145ca054bd2be626174b27ba156f7868686426110e29190611e5f565b600260008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516111329493929190611c9a565b60405180910390a243600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050505050565b600061119a61119584611dfc565b611dd7565b9050828152602081018484840111156111b6576111b56120e9565b5b6111c1848285611f88565b509392505050565b6000813590506111d8816121e3565b92915050565b6000813590506111ed816121fa565b92915050565b600082601f830112611208576112076120e4565b5b8135611218848260208601611187565b91505092915050565b60008135905061123081612211565b92915050565b60008135905061124581612228565b92915050565b600060208284031215611261576112606120f3565b5b600061126f848285016111c9565b91505092915050565b6000806040838503121561128f5761128e6120f3565b5b600061129d858286016111c9565b92505060206112ae858286016111c9565b9150509250929050565b6000806000606084860312156112d1576112d06120f3565b5b60006112df868287016111c9565b93505060206112f0868287016111de565b9250506040611301868287016111c9565b9150509250925092565b60008060008060808587031215611325576113246120f3565b5b6000611333878288016111c9565b9450506020611344878288016111de565b9350506040611355878288016111c9565b925050606061136687828801611221565b91505092959194509250565b60008060006060848603121561138b5761138a6120f3565b5b6000611399868287016111c9565b93505060206113aa868287016111de565b925050604084013567ffffffffffffffff8111156113cb576113ca6120ee565b5b6113d7868287016111f3565b9150509250925092565b600080600080608085870312156113fb576113fa6120f3565b5b6000611409878288016111c9565b945050602061141a878288016111de565b935050604085013567ffffffffffffffff81111561143b5761143a6120ee565b5b611447878288016111f3565b925050606061145887828801611221565b91505092959194509250565b600080600080600060a086880312156114805761147f6120f3565b5b600061148e888289016111c9565b955050602061149f88828901611236565b94505060406114b0888289016111de565b93505060606114c1888289016111de565b92505060806114d2888289016111c9565b9150509295509295909350565b60008060008060008060c087890312156114fc576114fb6120f3565b5b600061150a89828a016111c9565b965050602061151b89828a01611236565b955050604061152c89828a016111de565b945050606061153d89828a016111de565b935050608061154e89828a016111de565b92505060a061155f89828a016111c9565b9150509295509295509295565b600080600080600080600060e0888a03121561158b5761158a6120f3565b5b60006115998a828b016111c9565b97505060206115aa8a828b01611236565b96505060406115bb8a828b016111de565b95505060606115cc8a828b016111de565b94505060806115dd8a828b016111de565b93505060a06115ee8a828b016111c9565b92505060c06115ff8a828b01611221565b91505092959891949750929550565b60008060008060008060c0878903121561162b5761162a6120f3565b5b600061163989828a016111c9565b965050602061164a89828a01611236565b955050604061165b89828a016111de565b945050606061166c89828a016111de565b935050608061167d89828a016111de565b92505060a087013567ffffffffffffffff81111561169e5761169d6120ee565b5b6116aa89828a016111f3565b9150509295509295509295565b600080600080600080600060e0888a0312156116d6576116d56120f3565b5b60006116e48a828b016111c9565b97505060206116f58a828b01611236565b96505060406117068a828b016111de565b95505060606117178a828b016111de565b94505060806117288a828b016111de565b93505060a088013567ffffffffffffffff811115611749576117486120ee565b5b6117558a828b016111f3565b92505060c06117668a828b01611221565b91505092959891949750929550565b61177e81611eb5565b82525050565b61179561179082611eb5565b612044565b82525050565b6117a481611ec7565b82525050565b6117bb6117b682611ed3565b612056565b82525050565b6117ca81611eff565b82525050565b6117e16117dc82611eff565b612060565b82525050565b60006117f282611e2d565b6117fc8185611e38565b935061180c818560208601611f97565b611815816120f8565b840191505092915050565b600061182b82611e2d565b6118358185611e49565b9350611845818560208601611f97565b80840191505092915050565b61186261185d82611f40565b612044565b82525050565b61187181611f52565b82525050565b6000611884600f83611e54565b915061188f82612116565b600f82019050919050565b60006118a7600b83611e54565b91506118b28261213f565b600b82019050919050565b60006118ca600b83611e54565b91506118d582612168565b600b82019050919050565b60006118ed600c83611e54565b91506118f882612191565b600c82019050919050565b6000611910600e83611e54565b915061191b826121ba565b600e82019050919050565b61192f81611f29565b82525050565b61194661194182611f29565b61207c565b82525050565b61195581611f33565b82525050565b6000611967828a6117aa565b60018201915061197782896117aa565b6001820191506119878288611851565b6014820191506119978287611935565b6020820191506119a78286611784565b6014820191506119b682611877565b91506119c282856117d0565b6020820191506119d28284611820565b915081905098975050505050505050565b60006119ef82896117aa565b6001820191506119ff82886117aa565b600182019150611a0f8287611851565b601482019150611a1f8286611935565b602082019150611a2f8285611784565b601482019150611a3e8261189a565b9150611a4a8284611784565b601482019150819050979650505050505050565b6000611a6a828b6117aa565b600182019150611a7a828a6117aa565b600182019150611a8a8289611851565b601482019150611a9a8288611935565b602082019150611aaa8287611784565b601482019150611ab9826118bd565b9150611ac582866117d0565b602082019150611ad58285611784565b601482019150611ae58284611935565b6020820191508190509998505050505050505050565b6000611b07828b6117aa565b600182019150611b17828a6117aa565b600182019150611b278289611851565b601482019150611b378288611935565b602082019150611b478287611784565b601482019150611b56826118e0565b9150611b6282866117d0565b602082019150611b728285611820565b9150611b7e8284611935565b6020820191508190509998505050505050505050565b6000611ba0828a6117aa565b600182019150611bb082896117aa565b600182019150611bc08288611851565b601482019150611bd08287611935565b602082019150611be08286611784565b601482019150611bef82611903565b9150611bfb82856117d0565b602082019150611c0b8284611784565b60148201915081905098975050505050505050565b6000602082019050611c356000830184611775565b92915050565b6000604082019050611c506000830185611775565b611c5d6020830184611926565b9392505050565b6000602082019050611c79600083018461179b565b92915050565b6000602082019050611c9460008301846117c1565b92915050565b6000608082019050611caf60008301876117c1565b611cbc6020830186611775565b611cc96040830185611926565b611cd66060830184611926565b95945050505050565b6000608082019050611cf460008301876117c1565b8181036020830152611d0681866117e7565b9050611d156040830185611868565b611d226060830184611926565b95945050505050565b6000608082019050611d4060008301876117c1565b8181036020830152611d5281866117e7565b9050611d616040830185611926565b611d6e6060830184611926565b95945050505050565b6000608082019050611d8c60008301876117c1565b611d99602083018661194c565b611da660408301856117c1565b611db360608301846117c1565b95945050505050565b6000602082019050611dd16000830184611926565b92915050565b6000611de1611df2565b9050611ded8282611fca565b919050565b6000604051905090565b600067ffffffffffffffff821115611e1757611e166120b5565b5b611e20826120f8565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600081905092915050565b6000611e6a82611f29565b9150611e7583611f29565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611eaa57611ea9612086565b5b828201905092915050565b6000611ec082611f09565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000611f4b82611f64565b9050919050565b6000611f5d82611f29565b9050919050565b6000611f6f82611f76565b9050919050565b6000611f8182611f09565b9050919050565b82818337600083830152505050565b60005b83811015611fb5578082015181840152602081019050611f9a565b83811115611fc4576000848401525b50505050565b611fd3826120f8565b810181811067ffffffffffffffff82111715611ff257611ff16120b5565b5b80604052505050565b600061200682611f29565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561203957612038612086565b5b600182019050919050565b600061204f8261206a565b9050919050565b6000819050919050565b6000819050919050565b600061207582612109565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f7265766f6b654174747269627574650000000000000000000000000000000000600082015250565b7f6368616e67654f776e6572000000000000000000000000000000000000000000600082015250565b7f61646444656c6567617465000000000000000000000000000000000000000000600082015250565b7f7365744174747269627574650000000000000000000000000000000000000000600082015250565b7f7265766f6b6544656c6567617465000000000000000000000000000000000000600082015250565b6121ec81611eb5565b81146121f757600080fd5b50565b61220381611eff565b811461220e57600080fd5b50565b61221a81611f29565b811461222557600080fd5b50565b61223181611f33565b811461223c57600080fd5b5056fea264697066735822122005fb903746ee3f24a971c75bc129afe378e3517b38395de4f104446c9332ac8564736f6c63430008070033