{
  "address": "0x58774Bb8acD458A640aF0B88238369A167546ef2",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract DNSSEC",
          "name": "_dnssec",
          "type": "address"
        },
        {
          "internalType": "contract PublicSuffixList",
          "name": "_suffixes",
          "type": "address"
        },
        {
          "internalType": "contract ENS",
          "name": "_ens",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "node",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "dnsname",
          "type": "bytes"
        }
      ],
      "name": "Claim",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "oracle",
          "type": "address"
        }
      ],
      "name": "NewOracle",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "suffixes",
          "type": "address"
        }
      ],
      "name": "NewPublicSuffixList",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "name",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "proof",
          "type": "bytes"
        }
      ],
      "name": "claim",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ens",
      "outputs": [
        {
          "internalType": "contract ENS",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oracle",
      "outputs": [
        {
          "internalType": "contract DNSSEC",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "name",
          "type": "bytes"
        },
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "rrset",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "sig",
              "type": "bytes"
            }
          ],
          "internalType": "struct DNSSEC.RRSetWithSignature[]",
          "name": "input",
          "type": "tuple[]"
        },
        {
          "internalType": "bytes",
          "name": "proof",
          "type": "bytes"
        }
      ],
      "name": "proveAndClaim",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "name",
          "type": "bytes"
        },
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "rrset",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "sig",
              "type": "bytes"
            }
          ],
          "internalType": "struct DNSSEC.RRSetWithSignature[]",
          "name": "input",
          "type": "tuple[]"
        },
        {
          "internalType": "bytes",
          "name": "proof",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "resolver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "addr",
          "type": "address"
        }
      ],
      "name": "proveAndClaimWithResolver",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract DNSSEC",
          "name": "_dnssec",
          "type": "address"
        }
      ],
      "name": "setOracle",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract PublicSuffixList",
          "name": "_suffixes",
          "type": "address"
        }
      ],
      "name": "setPublicSuffixList",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "suffixes",
      "outputs": [
        {
          "internalType": "contract PublicSuffixList",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceID",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    }
  ],
  "transactionHash": "0xa71bd5fc91e21e335fa5ec7bb0087ca90b0c138888c194bf24740cbba4f87389",
  "receipt": {
    "to": null,
    "from": "0x0904Dac3347eA47d208F3Fd67402D039a3b99859",
    "contractAddress": "0x58774Bb8acD458A640aF0B88238369A167546ef2",
    "transactionIndex": 62,
    "gasUsed": "2850448",
    "logsBloom": "0x00000000000000100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000008000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000",
    "blockHash": "0xba91110f7df095773df153913f09b1ae1ec681b756c69db26684cb3511a80039",
    "transactionHash": "0xa71bd5fc91e21e335fa5ec7bb0087ca90b0c138888c194bf24740cbba4f87389",
    "logs": [
      {
        "transactionIndex": 62,
        "blockNumber": 13040372,
        "transactionHash": "0xa71bd5fc91e21e335fa5ec7bb0087ca90b0c138888c194bf24740cbba4f87389",
        "address": "0x58774Bb8acD458A640aF0B88238369A167546ef2",
        "topics": [
          "0xb3eacd0e351fafdfefdec84e1cd19679b38dbcd63ea7c2c24da17fd2bc3b3c0e"
        ],
        "data": "0x00000000000000000000000046c6f79952d3046bf673a28132ff2a81f306959c",
        "logIndex": 100,
        "blockHash": "0xba91110f7df095773df153913f09b1ae1ec681b756c69db26684cb3511a80039"
      },
      {
        "transactionIndex": 62,
        "blockNumber": 13040372,
        "transactionHash": "0xa71bd5fc91e21e335fa5ec7bb0087ca90b0c138888c194bf24740cbba4f87389",
        "address": "0x58774Bb8acD458A640aF0B88238369A167546ef2",
        "topics": [
          "0x9176b7f47e4504df5e5516c99d90d82ac7cbd49cc77e7f22ba2ac2f2e3a3eba8"
        ],
        "data": "0x000000000000000000000000d10730069066cda980edfb5e70ef678a38b5265f",
        "logIndex": 101,
        "blockHash": "0xba91110f7df095773df153913f09b1ae1ec681b756c69db26684cb3511a80039"
      }
    ],
    "blockNumber": 13040372,
    "cumulativeGasUsed": "8840195",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x46c6F79952d3046Bf673a28132ff2a81F306959c",
    "0xD10730069066cda980eDFb5e70eF678a38b5265F",
    "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"
  ],
  "solcInputHash": "40ce5451dce8f428cafdaca8fb82d91d",
  "metadata": "{\"compiler\":{\"version\":\"0.8.4+commit.c7e474f2\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract DNSSEC\",\"name\":\"_dnssec\",\"type\":\"address\"},{\"internalType\":\"contract PublicSuffixList\",\"name\":\"_suffixes\",\"type\":\"address\"},{\"internalType\":\"contract ENS\",\"name\":\"_ens\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"dnsname\",\"type\":\"bytes\"}],\"name\":\"Claim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oracle\",\"type\":\"address\"}],\"name\":\"NewOracle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"suffixes\",\"type\":\"address\"}],\"name\":\"NewPublicSuffixList\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ens\",\"outputs\":[{\"internalType\":\"contract ENS\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oracle\",\"outputs\":[{\"internalType\":\"contract DNSSEC\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"rrset\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sig\",\"type\":\"bytes\"}],\"internalType\":\"struct DNSSEC.RRSetWithSignature[]\",\"name\":\"input\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"proveAndClaim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"rrset\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sig\",\"type\":\"bytes\"}],\"internalType\":\"struct DNSSEC.RRSetWithSignature[]\",\"name\":\"input\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"resolver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"proveAndClaimWithResolver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract DNSSEC\",\"name\":\"_dnssec\",\"type\":\"address\"}],\"name\":\"setOracle\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract PublicSuffixList\",\"name\":\"_suffixes\",\"type\":\"address\"}],\"name\":\"setPublicSuffixList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"suffixes\",\"outputs\":[{\"internalType\":\"contract PublicSuffixList\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"An ENS registrar that allows the owner of a DNS name to claim the      corresponding name in ENS.\",\"kind\":\"dev\",\"methods\":{\"claim(bytes,bytes)\":{\"details\":\"Claims a name by proving ownership of its DNS equivalent.\",\"params\":{\"name\":\"The name to claim, in DNS wire format.\",\"proof\":\"A DNS RRSet proving ownership of the name. Must be verified        in the DNSSEC oracle before calling. This RRSET must contain a TXT        record for '_ens.' + name, with the value 'a=0x...'. Ownership of        the name will be transferred to the address specified in the TXT        record.\"}},\"proveAndClaim(bytes,(bytes,bytes)[],bytes)\":{\"details\":\"Submits proofs to the DNSSEC oracle, then claims a name using those proofs.\",\"params\":{\"input\":\"The data to be passed to the Oracle's `submitProofs` function. The last        proof must be the TXT record required by the registrar.\",\"name\":\"The name to claim, in DNS wire format.\",\"proof\":\"The proof record for the first element in input.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/dnsregistrar/DNSRegistrar.sol\":\"DNSRegistrar\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@ensdomains/buffer/contracts/Buffer.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\n/**\\n* @dev A library for working with mutable byte buffers in Solidity.\\n*\\n* Byte buffers are mutable and expandable, and provide a variety of primitives\\n* for writing to them. At any time you can fetch a bytes object containing the\\n* current contents of the buffer. The bytes object should not be stored between\\n* operations, as it may change due to resizing of the buffer.\\n*/\\nlibrary Buffer {\\n    /**\\n    * @dev Represents a mutable buffer. Buffers have a current value (buf) and\\n    *      a capacity. The capacity may be longer than the current value, in\\n    *      which case it can be extended without the need to allocate more memory.\\n    */\\n    struct buffer {\\n        bytes buf;\\n        uint capacity;\\n    }\\n\\n    /**\\n    * @dev Initializes a buffer with an initial capacity.\\n    * @param buf The buffer to initialize.\\n    * @param capacity The number of bytes of space to allocate the buffer.\\n    * @return The buffer, for chaining.\\n    */\\n    function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\\n        if (capacity % 32 != 0) {\\n            capacity += 32 - (capacity % 32);\\n        }\\n        // Allocate space for the buffer data\\n        buf.capacity = capacity;\\n        assembly {\\n            let ptr := mload(0x40)\\n            mstore(buf, ptr)\\n            mstore(ptr, 0)\\n            mstore(0x40, add(32, add(ptr, capacity)))\\n        }\\n        return buf;\\n    }\\n\\n    /**\\n    * @dev Initializes a new buffer from an existing bytes object.\\n    *      Changes to the buffer may mutate the original value.\\n    * @param b The bytes object to initialize the buffer with.\\n    * @return A new buffer.\\n    */\\n    function fromBytes(bytes memory b) internal pure returns(buffer memory) {\\n        buffer memory buf;\\n        buf.buf = b;\\n        buf.capacity = b.length;\\n        return buf;\\n    }\\n\\n    function resize(buffer memory buf, uint capacity) private pure {\\n        bytes memory oldbuf = buf.buf;\\n        init(buf, capacity);\\n        append(buf, oldbuf);\\n    }\\n\\n    function max(uint a, uint b) private pure returns(uint) {\\n        if (a > b) {\\n            return a;\\n        }\\n        return b;\\n    }\\n\\n    /**\\n    * @dev Sets buffer length to 0.\\n    * @param buf The buffer to truncate.\\n    * @return The original buffer, for chaining..\\n    */\\n    function truncate(buffer memory buf) internal pure returns (buffer memory) {\\n        assembly {\\n            let bufptr := mload(buf)\\n            mstore(bufptr, 0)\\n        }\\n        return buf;\\n    }\\n\\n    /**\\n    * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\\n    *      the capacity of the buffer.\\n    * @param buf The buffer to append to.\\n    * @param off The start offset to write to.\\n    * @param data The data to append.\\n    * @param len The number of bytes to copy.\\n    * @return The original buffer, for chaining.\\n    */\\n    function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\\n        require(len <= data.length);\\n\\n        if (off + len > buf.capacity) {\\n            resize(buf, max(buf.capacity, len + off) * 2);\\n        }\\n\\n        uint dest;\\n        uint src;\\n        assembly {\\n            // Memory address of the buffer data\\n            let bufptr := mload(buf)\\n            // Length of existing buffer data\\n            let buflen := mload(bufptr)\\n            // Start address = buffer address + offset + sizeof(buffer length)\\n            dest := add(add(bufptr, 32), off)\\n            // Update buffer length if we're extending it\\n            if gt(add(len, off), buflen) {\\n                mstore(bufptr, add(len, off))\\n            }\\n            src := add(data, 32)\\n        }\\n\\n        // Copy word-length chunks while possible\\n        for (; len >= 32; len -= 32) {\\n            assembly {\\n                mstore(dest, mload(src))\\n            }\\n            dest += 32;\\n            src += 32;\\n        }\\n\\n        // Copy remaining bytes\\n        unchecked {\\n            uint mask = (256 ** (32 - len)) - 1;\\n            assembly {\\n                let srcpart := and(mload(src), not(mask))\\n                let destpart := and(mload(dest), mask)\\n                mstore(dest, or(destpart, srcpart))\\n            }\\n        }\\n\\n        return buf;\\n    }\\n\\n    /**\\n    * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\\n    *      the capacity of the buffer.\\n    * @param buf The buffer to append to.\\n    * @param data The data to append.\\n    * @param len The number of bytes to copy.\\n    * @return The original buffer, for chaining.\\n    */\\n    function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\\n        return write(buf, buf.buf.length, data, len);\\n    }\\n\\n    /**\\n    * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\\n    *      the capacity of the buffer.\\n    * @param buf The buffer to append to.\\n    * @param data The data to append.\\n    * @return The original buffer, for chaining.\\n    */\\n    function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\\n        return write(buf, buf.buf.length, data, data.length);\\n    }\\n\\n    /**\\n    * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\\n    *      capacity of the buffer.\\n    * @param buf The buffer to append to.\\n    * @param off The offset to write the byte at.\\n    * @param data The data to append.\\n    * @return The original buffer, for chaining.\\n    */\\n    function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\\n        if (off >= buf.capacity) {\\n            resize(buf, buf.capacity * 2);\\n        }\\n\\n        assembly {\\n            // Memory address of the buffer data\\n            let bufptr := mload(buf)\\n            // Length of existing buffer data\\n            let buflen := mload(bufptr)\\n            // Address = buffer address + sizeof(buffer length) + off\\n            let dest := add(add(bufptr, off), 32)\\n            mstore8(dest, data)\\n            // Update buffer length if we extended it\\n            if eq(off, buflen) {\\n                mstore(bufptr, add(buflen, 1))\\n            }\\n        }\\n        return buf;\\n    }\\n\\n    /**\\n    * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\\n    *      capacity of the buffer.\\n    * @param buf The buffer to append to.\\n    * @param data The data to append.\\n    * @return The original buffer, for chaining.\\n    */\\n    function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\\n        return writeUint8(buf, buf.buf.length, data);\\n    }\\n\\n    /**\\n    * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\\n    *      exceed the capacity of the buffer.\\n    * @param buf The buffer to append to.\\n    * @param off The offset to write at.\\n    * @param data The data to append.\\n    * @param len The number of bytes to write (left-aligned).\\n    * @return The original buffer, for chaining.\\n    */\\n    function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\\n        if (len + off > buf.capacity) {\\n            resize(buf, (len + off) * 2);\\n        }\\n\\n        unchecked {\\n            uint mask = (256 ** len) - 1;\\n            // Right-align data\\n            data = data >> (8 * (32 - len));\\n            assembly {\\n                // Memory address of the buffer data\\n                let bufptr := mload(buf)\\n                // Address = buffer address + sizeof(buffer length) + off + len\\n                let dest := add(add(bufptr, off), len)\\n                mstore(dest, or(and(mload(dest), not(mask)), data))\\n                // Update buffer length if we extended it\\n                if gt(add(off, len), mload(bufptr)) {\\n                    mstore(bufptr, add(off, len))\\n                }\\n            }\\n        }\\n        return buf;\\n    }\\n\\n    /**\\n    * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\\n    *      capacity of the buffer.\\n    * @param buf The buffer to append to.\\n    * @param off The offset to write at.\\n    * @param data The data to append.\\n    * @return The original buffer, for chaining.\\n    */\\n    function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\\n        return write(buf, off, bytes32(data), 20);\\n    }\\n\\n    /**\\n    * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\\n    *      the capacity of the buffer.\\n    * @param buf The buffer to append to.\\n    * @param data The data to append.\\n    * @return The original buffer, for chhaining.\\n    */\\n    function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\\n        return write(buf, buf.buf.length, bytes32(data), 20);\\n    }\\n\\n    /**\\n    * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\\n    *      the capacity of the buffer.\\n    * @param buf The buffer to append to.\\n    * @param data The data to append.\\n    * @return The original buffer, for chaining.\\n    */\\n    function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\\n        return write(buf, buf.buf.length, data, 32);\\n    }\\n\\n    /**\\n    * @dev Writes an integer to the buffer. Resizes if doing so would exceed\\n    *      the capacity of the buffer.\\n    * @param buf The buffer to append to.\\n    * @param off The offset to write at.\\n    * @param data The data to append.\\n    * @param len The number of bytes to write (right-aligned).\\n    * @return The original buffer, for chaining.\\n    */\\n    function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\\n        if (len + off > buf.capacity) {\\n            resize(buf, (len + off) * 2);\\n        }\\n\\n        uint mask = (256 ** len) - 1;\\n        assembly {\\n            // Memory address of the buffer data\\n            let bufptr := mload(buf)\\n            // Address = buffer address + off + sizeof(buffer length) + len\\n            let dest := add(add(bufptr, off), len)\\n            mstore(dest, or(and(mload(dest), not(mask)), data))\\n            // Update buffer length if we extended it\\n            if gt(add(off, len), mload(bufptr)) {\\n                mstore(bufptr, add(off, len))\\n            }\\n        }\\n        return buf;\\n    }\\n\\n    /**\\n     * @dev Appends a byte to the end of the buffer. Resizes if doing so would\\n     * exceed the capacity of the buffer.\\n     * @param buf The buffer to append to.\\n     * @param data The data to append.\\n     * @return The original buffer.\\n     */\\n    function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\\n        return writeInt(buf, buf.buf.length, data, len);\\n    }\\n}\\n\",\"keccak256\":\"0x18e42be1a3e4f7b4442d7ab0b524af5e09163503439954faf0ab3792cce91caa\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    constructor () {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n}\\n\",\"keccak256\":\"0x1cae4f85f114ff17b90414f5da67365b1d00337abb5bce9bf944eb78a2c0673c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xf930d2df426bfcfc1f7415be724f04081c96f4fb9ec8d0e3a521c07692dface0\",\"license\":\"MIT\"},\"contracts/dnsregistrar/DNSClaimChecker.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\nimport \\\"../dnssec-oracle/DNSSEC.sol\\\";\\nimport \\\"../dnssec-oracle/BytesUtils.sol\\\";\\nimport \\\"../dnssec-oracle/RRUtils.sol\\\";\\nimport \\\"@ensdomains/buffer/contracts/Buffer.sol\\\";\\n\\nlibrary DNSClaimChecker {\\n\\n    using BytesUtils for bytes;\\n    using RRUtils for *;\\n    using Buffer for Buffer.buffer;\\n\\n    uint16 constant CLASS_INET = 1;\\n    uint16 constant TYPE_TXT = 16;\\n\\n    function getOwnerAddress(DNSSEC oracle, bytes memory name, bytes memory proof)\\n        internal\\n        view\\n        returns (address, bool)\\n    {\\n        // Add \\\"_ens.\\\" to the front of the name.\\n        Buffer.buffer memory buf;\\n        buf.init(name.length + 5);\\n        buf.append(\\\"\\\\x04_ens\\\");\\n        buf.append(name);\\n        bytes20 hash;\\n        uint32 expiration;\\n        // Check the provided TXT record has been validated by the oracle\\n        (, expiration, hash) = oracle.rrdata(TYPE_TXT, buf.buf);\\n        if (hash == bytes20(0) && proof.length == 0) return (address(0x0), false);\\n\\n        require(hash == bytes20(keccak256(proof)));\\n\\n        for (RRUtils.RRIterator memory iter = proof.iterateRRs(0); !iter.done(); iter.next()) {\\n            require(RRUtils.serialNumberGte(expiration + iter.ttl, uint32(block.timestamp)), \\\"DNS record is stale; refresh or delete it before proceeding.\\\");\\n\\n            bool found;\\n            address addr;\\n            (addr, found) = parseRR(proof, iter.rdataOffset);\\n            if (found) {\\n                return (addr, true);\\n            }\\n        }\\n\\n        return (address(0x0), false);\\n    }\\n\\n    function parseRR(bytes memory rdata, uint idx) internal pure returns (address, bool) {\\n        while (idx < rdata.length) {\\n            uint len = rdata.readUint8(idx); idx += 1;\\n\\n            bool found;\\n            address addr;\\n            (addr, found) = parseString(rdata, idx, len);\\n\\n            if (found) return (addr, true);\\n            idx += len;\\n        }\\n\\n        return (address(0x0), false);\\n    }\\n\\n    function parseString(bytes memory str, uint idx, uint len) internal pure returns (address, bool) {\\n        // TODO: More robust parsing that handles whitespace and multiple key/value pairs\\n        if (str.readUint32(idx) != 0x613d3078) return (address(0x0), false); // 0x613d3078 == 'a=0x'\\n        if (len < 44) return (address(0x0), false);\\n        return hexToAddress(str, idx + 4);\\n    }\\n\\n    function hexToAddress(bytes memory str, uint idx) internal pure returns (address, bool) {\\n        if (str.length - idx < 40) return (address(0x0), false);\\n        uint ret = 0;\\n        for (uint i = idx; i < idx + 40; i++) {\\n            ret <<= 4;\\n            uint x = str.readUint8(i);\\n            if (x >= 48 && x < 58) {\\n                ret |= x - 48;\\n            } else if (x >= 65 && x < 71) {\\n                ret |= x - 55;\\n            } else if (x >= 97 && x < 103) {\\n                ret |= x - 87;\\n            } else {\\n                return (address(0x0), false);\\n            }\\n        }\\n        return (address(uint160(ret)), true);\\n    }\\n}\\n\",\"keccak256\":\"0xbbae9477060a4e16d01432400029b85d278a7186dad7139d0f24381906cf63db\"},\"contracts/dnsregistrar/DNSRegistrar.sol\":{\"content\":\"pragma solidity ^0.8.4;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../dnssec-oracle/BytesUtils.sol\\\";\\nimport \\\"../dnssec-oracle/DNSSEC.sol\\\";\\nimport \\\"../registry/ENSRegistry.sol\\\";\\nimport \\\"../root/Root.sol\\\";\\nimport \\\"./DNSClaimChecker.sol\\\";\\nimport \\\"./PublicSuffixList.sol\\\";\\nimport \\\"../resolvers/profiles/AddrResolver.sol\\\";\\n\\ninterface IDNSRegistrar {\\n    function claim(bytes memory name, bytes memory proof) external;\\n    function proveAndClaim(bytes memory name, DNSSEC.RRSetWithSignature[] memory input, bytes memory proof) external;\\n    function proveAndClaimWithResolver(bytes memory name, DNSSEC.RRSetWithSignature[] memory input, bytes memory proof, address resolver, address addr) external;\\n}\\n\\n/**\\n * @dev An ENS registrar that allows the owner of a DNS name to claim the\\n *      corresponding name in ENS.\\n */\\ncontract DNSRegistrar is IDNSRegistrar {\\n    using BytesUtils for bytes;\\n\\n    DNSSEC public oracle;\\n    ENS public ens;\\n    PublicSuffixList public suffixes;\\n\\n    bytes4 constant private INTERFACE_META_ID = bytes4(keccak256(\\\"supportsInterface(bytes4)\\\"));\\n\\n    event Claim(bytes32 indexed node, address indexed owner, bytes dnsname);\\n    event NewOracle(address oracle);\\n    event NewPublicSuffixList(address suffixes);\\n\\n    constructor(DNSSEC _dnssec, PublicSuffixList _suffixes, ENS _ens) {\\n        oracle = _dnssec;\\n        emit NewOracle(address(oracle));\\n        suffixes = _suffixes;\\n        emit NewPublicSuffixList(address(suffixes));\\n        ens = _ens;\\n    }\\n\\n    /**\\n     * @dev This contract's owner-only functions can be invoked by the owner of the ENS root.\\n     */\\n    modifier onlyOwner {\\n        Root root = Root(ens.owner(bytes32(0)));\\n        address owner = root.owner();\\n        require(msg.sender == owner);\\n        _;\\n    }\\n\\n    function setOracle(DNSSEC _dnssec) public onlyOwner {\\n        oracle = _dnssec;\\n        emit NewOracle(address(oracle));\\n    }\\n\\n    function setPublicSuffixList(PublicSuffixList _suffixes) public onlyOwner {\\n        suffixes = _suffixes;\\n        emit NewPublicSuffixList(address(suffixes));\\n    }\\n\\n    /**\\n     * @dev Claims a name by proving ownership of its DNS equivalent.\\n     * @param name The name to claim, in DNS wire format.\\n     * @param proof A DNS RRSet proving ownership of the name. Must be verified\\n     *        in the DNSSEC oracle before calling. This RRSET must contain a TXT\\n     *        record for '_ens.' + name, with the value 'a=0x...'. Ownership of\\n     *        the name will be transferred to the address specified in the TXT\\n     *        record.\\n     */\\n    function claim(bytes memory name, bytes memory proof) public override {\\n        (bytes32 rootNode, bytes32 labelHash, address addr) = _claim(name, proof);\\n        ens.setSubnodeOwner(rootNode, labelHash, addr);\\n    }\\n\\n    /**\\n     * @dev Submits proofs to the DNSSEC oracle, then claims a name using those proofs.\\n     * @param name The name to claim, in DNS wire format.\\n     * @param input The data to be passed to the Oracle's `submitProofs` function. The last\\n     *        proof must be the TXT record required by the registrar.\\n     * @param proof The proof record for the first element in input.\\n     */\\n    function proveAndClaim(bytes memory name, DNSSEC.RRSetWithSignature[] memory input, bytes memory proof) public override {\\n        proof = oracle.submitRRSets(input, proof);\\n        claim(name, proof);\\n    }\\n\\n    function proveAndClaimWithResolver(bytes memory name, DNSSEC.RRSetWithSignature[] memory input, bytes memory proof, address resolver, address addr) public override {\\n        proof = oracle.submitRRSets(input, proof);\\n        (bytes32 rootNode, bytes32 labelHash, address owner) = _claim(name, proof);\\n        require(msg.sender == owner, \\\"Only owner can call proveAndClaimWithResolver\\\");\\n        if(addr != address(0)) {\\n            require(resolver != address(0), \\\"Cannot set addr if resolver is not set\\\");\\n            // Set ourselves as the owner so we can set a record on the resolver\\n            ens.setSubnodeRecord(rootNode, labelHash, address(this), resolver, 0);\\n            bytes32 node = keccak256(abi.encodePacked(rootNode, labelHash));\\n            // Set the resolver record\\n            AddrResolver(resolver).setAddr(node, addr);\\n            // Transfer the record to the owner\\n            ens.setOwner(node, owner);\\n        } else {\\n            ens.setSubnodeRecord(rootNode, labelHash, owner, resolver, 0);\\n        }\\n    }\\n\\n    function supportsInterface(bytes4 interfaceID) external pure returns (bool) {\\n        return interfaceID == INTERFACE_META_ID ||\\n               interfaceID == type(IDNSRegistrar).interfaceId;\\n    }\\n\\n    function _claim(bytes memory name, bytes memory proof) internal returns(bytes32 rootNode, bytes32 labelHash, address addr) {\\n        // Get the first label\\n        uint labelLen = name.readUint8(0);\\n        labelHash = name.keccak(1, labelLen);\\n\\n        // Parent name must be in the public suffix list.\\n        bytes memory parentName = name.substring(labelLen + 1, name.length - labelLen - 1);\\n        require(suffixes.isPublicSuffix(parentName), \\\"Parent name must be a public suffix\\\");\\n\\n        // Make sure the parent name is enabled\\n        rootNode = enableNode(parentName, 0);\\n\\n        (addr,) = DNSClaimChecker.getOwnerAddress(oracle, name, proof);\\n\\n        emit Claim(keccak256(abi.encodePacked(rootNode, labelHash)), addr, name);\\n    }\\n\\n    function enableNode(bytes memory domain, uint offset) internal returns(bytes32 node) {\\n        uint len = domain.readUint8(offset);\\n        if(len == 0) {\\n            return bytes32(0);\\n        }\\n\\n        bytes32 parentNode = enableNode(domain, offset + len + 1);\\n        bytes32 label = domain.keccak(offset + 1, len);\\n        node = keccak256(abi.encodePacked(parentNode, label));\\n        address owner = ens.owner(node);\\n        require(owner == address(0) || owner == address(this), \\\"Cannot enable a name owned by someone else\\\");\\n        if(owner != address(this)) {\\n            if(parentNode == bytes32(0)) {\\n                Root root = Root(ens.owner(bytes32(0)));\\n                root.setSubnodeOwner(label, address(this));\\n            } else {\\n                ens.setSubnodeOwner(parentNode, label, address(this));\\n            }\\n        }\\n        return node;\\n    }\\n}\\n\",\"keccak256\":\"0x0781f008efeefa1ff7a9517ed94d69fe160c399c7cd6388a79e26d7f0e4e6001\"},\"contracts/dnsregistrar/PublicSuffixList.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\ninterface PublicSuffixList {\\n    function isPublicSuffix(bytes calldata name) external view returns(bool);\\n}\\n\",\"keccak256\":\"0x8e593c73f54e07a54074ed3b6bc8e976d06211f923051c9793bcb9c10114854d\"},\"contracts/dnssec-oracle/BytesUtils.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\nlibrary BytesUtils {\\n    /*\\n    * @dev Returns the keccak-256 hash of a byte range.\\n    * @param self The byte string to hash.\\n    * @param offset The position to start hashing at.\\n    * @param len The number of bytes to hash.\\n    * @return The hash of the byte range.\\n    */\\n    function keccak(bytes memory self, uint offset, uint len) internal pure returns (bytes32 ret) {\\n        require(offset + len <= self.length);\\n        assembly {\\n            ret := keccak256(add(add(self, 32), offset), len)\\n        }\\n    }\\n\\n\\n    /*\\n    * @dev Returns a positive number if `other` comes lexicographically after\\n    *      `self`, a negative number if it comes before, or zero if the\\n    *      contents of the two bytes are equal.\\n    * @param self The first bytes to compare.\\n    * @param other The second bytes to compare.\\n    * @return The result of the comparison.\\n    */\\n    function compare(bytes memory self, bytes memory other) internal pure returns (int) {\\n        return compare(self, 0, self.length, other, 0, other.length);\\n    }\\n\\n    /*\\n    * @dev Returns a positive number if `other` comes lexicographically after\\n    *      `self`, a negative number if it comes before, or zero if the\\n    *      contents of the two bytes are equal. Comparison is done per-rune,\\n    *      on unicode codepoints.\\n    * @param self The first bytes to compare.\\n    * @param offset The offset of self.\\n    * @param len    The length of self.\\n    * @param other The second bytes to compare.\\n    * @param otheroffset The offset of the other string.\\n    * @param otherlen    The length of the other string.\\n    * @return The result of the comparison.\\n    */\\n    function compare(bytes memory self, uint offset, uint len, bytes memory other, uint otheroffset, uint otherlen) internal pure returns (int) {\\n        uint shortest = len;\\n        if (otherlen < len)\\n        shortest = otherlen;\\n\\n        uint selfptr;\\n        uint otherptr;\\n\\n        assembly {\\n            selfptr := add(self, add(offset, 32))\\n            otherptr := add(other, add(otheroffset, 32))\\n        }\\n        for (uint idx = 0; idx < shortest; idx += 32) {\\n            uint a;\\n            uint b;\\n            assembly {\\n                a := mload(selfptr)\\n                b := mload(otherptr)\\n            }\\n            if (a != b) {\\n                // Mask out irrelevant bytes and check again\\n                uint mask;\\n                if (shortest > 32) {\\n                    mask = type(uint256).max;\\n                } else {\\n                    mask = ~(2 ** (8 * (32 - shortest + idx)) - 1);\\n                }\\n                int diff = int(a & mask) - int(b & mask);\\n                if (diff != 0)\\n                return diff;\\n            }\\n            selfptr += 32;\\n            otherptr += 32;\\n        }\\n\\n        return int(len) - int(otherlen);\\n    }\\n\\n    /*\\n    * @dev Returns true if the two byte ranges are equal.\\n    * @param self The first byte range to compare.\\n    * @param offset The offset into the first byte range.\\n    * @param other The second byte range to compare.\\n    * @param otherOffset The offset into the second byte range.\\n    * @param len The number of bytes to compare\\n    * @return True if the byte ranges are equal, false otherwise.\\n    */\\n    function equals(bytes memory self, uint offset, bytes memory other, uint otherOffset, uint len) internal pure returns (bool) {\\n        return keccak(self, offset, len) == keccak(other, otherOffset, len);\\n    }\\n\\n    /*\\n    * @dev Returns true if the two byte ranges are equal with offsets.\\n    * @param self The first byte range to compare.\\n    * @param offset The offset into the first byte range.\\n    * @param other The second byte range to compare.\\n    * @param otherOffset The offset into the second byte range.\\n    * @return True if the byte ranges are equal, false otherwise.\\n    */\\n    function equals(bytes memory self, uint offset, bytes memory other, uint otherOffset) internal pure returns (bool) {\\n        return keccak(self, offset, self.length - offset) == keccak(other, otherOffset, other.length - otherOffset);\\n    }\\n\\n    /*\\n    * @dev Compares a range of 'self' to all of 'other' and returns True iff\\n    *      they are equal.\\n    * @param self The first byte range to compare.\\n    * @param offset The offset into the first byte range.\\n    * @param other The second byte range to compare.\\n    * @return True if the byte ranges are equal, false otherwise.\\n    */\\n    function equals(bytes memory self, uint offset, bytes memory other) internal pure returns (bool) {\\n        return self.length >= offset + other.length && equals(self, offset, other, 0, other.length);\\n    }\\n\\n    /*\\n    * @dev Returns true if the two byte ranges are equal.\\n    * @param self The first byte range to compare.\\n    * @param other The second byte range to compare.\\n    * @return True if the byte ranges are equal, false otherwise.\\n    */\\n    function equals(bytes memory self, bytes memory other) internal pure returns(bool) {\\n        return self.length == other.length && equals(self, 0, other, 0, self.length);\\n    }\\n\\n    /*\\n    * @dev Returns the 8-bit number at the specified index of self.\\n    * @param self The byte string.\\n    * @param idx The index into the bytes\\n    * @return The specified 8 bits of the string, interpreted as an integer.\\n    */\\n    function readUint8(bytes memory self, uint idx) internal pure returns (uint8 ret) {\\n        return uint8(self[idx]);\\n    }\\n\\n    /*\\n    * @dev Returns the 16-bit number at the specified index of self.\\n    * @param self The byte string.\\n    * @param idx The index into the bytes\\n    * @return The specified 16 bits of the string, interpreted as an integer.\\n    */\\n    function readUint16(bytes memory self, uint idx) internal pure returns (uint16 ret) {\\n        require(idx + 2 <= self.length);\\n        assembly {\\n            ret := and(mload(add(add(self, 2), idx)), 0xFFFF)\\n        }\\n    }\\n\\n    /*\\n    * @dev Returns the 32-bit number at the specified index of self.\\n    * @param self The byte string.\\n    * @param idx The index into the bytes\\n    * @return The specified 32 bits of the string, interpreted as an integer.\\n    */\\n    function readUint32(bytes memory self, uint idx) internal pure returns (uint32 ret) {\\n        require(idx + 4 <= self.length);\\n        assembly {\\n            ret := and(mload(add(add(self, 4), idx)), 0xFFFFFFFF)\\n        }\\n    }\\n\\n    /*\\n    * @dev Returns the 32 byte value at the specified index of self.\\n    * @param self The byte string.\\n    * @param idx The index into the bytes\\n    * @return The specified 32 bytes of the string.\\n    */\\n    function readBytes32(bytes memory self, uint idx) internal pure returns (bytes32 ret) {\\n        require(idx + 32 <= self.length);\\n        assembly {\\n            ret := mload(add(add(self, 32), idx))\\n        }\\n    }\\n\\n    /*\\n    * @dev Returns the 32 byte value at the specified index of self.\\n    * @param self The byte string.\\n    * @param idx The index into the bytes\\n    * @return The specified 32 bytes of the string.\\n    */\\n    function readBytes20(bytes memory self, uint idx) internal pure returns (bytes20 ret) {\\n        require(idx + 20 <= self.length);\\n        assembly {\\n            ret := and(mload(add(add(self, 32), idx)), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000)\\n        }\\n    }\\n\\n    /*\\n    * @dev Returns the n byte value at the specified index of self.\\n    * @param self The byte string.\\n    * @param idx The index into the bytes.\\n    * @param len The number of bytes.\\n    * @return The specified 32 bytes of the string.\\n    */\\n    function readBytesN(bytes memory self, uint idx, uint len) internal pure returns (bytes32 ret) {\\n        require(len <= 32);\\n        require(idx + len <= self.length);\\n        assembly {\\n            let mask := not(sub(exp(256, sub(32, len)), 1))\\n            ret := and(mload(add(add(self, 32), idx)),  mask)\\n        }\\n    }\\n\\n    function memcpy(uint dest, uint src, uint len) private pure {\\n        // Copy word-length chunks while possible\\n        for (; len >= 32; len -= 32) {\\n            assembly {\\n                mstore(dest, mload(src))\\n            }\\n            dest += 32;\\n            src += 32;\\n        }\\n\\n        // Copy remaining bytes\\n        unchecked {\\n            uint mask = (256 ** (32 - len)) - 1;\\n            assembly {\\n                let srcpart := and(mload(src), not(mask))\\n                let destpart := and(mload(dest), mask)\\n                mstore(dest, or(destpart, srcpart))\\n            }\\n        }\\n    }\\n\\n    /*\\n    * @dev Copies a substring into a new byte string.\\n    * @param self The byte string to copy from.\\n    * @param offset The offset to start copying at.\\n    * @param len The number of bytes to copy.\\n    */\\n    function substring(bytes memory self, uint offset, uint len) internal pure returns(bytes memory) {\\n        require(offset + len <= self.length);\\n\\n        bytes memory ret = new bytes(len);\\n        uint dest;\\n        uint src;\\n\\n        assembly {\\n            dest := add(ret, 32)\\n            src := add(add(self, 32), offset)\\n        }\\n        memcpy(dest, src, len);\\n\\n        return ret;\\n    }\\n\\n    // Maps characters from 0x30 to 0x7A to their base32 values.\\n    // 0xFF represents invalid characters in that range.\\n    bytes constant base32HexTable = hex'00010203040506070809FFFFFFFFFFFFFF0A0B0C0D0E0F101112131415161718191A1B1C1D1E1FFFFFFFFFFFFFFFFFFFFF0A0B0C0D0E0F101112131415161718191A1B1C1D1E1F';\\n\\n    /**\\n     * @dev Decodes unpadded base32 data of up to one word in length.\\n     * @param self The data to decode.\\n     * @param off Offset into the string to start at.\\n     * @param len Number of characters to decode.\\n     * @return The decoded data, left aligned.\\n     */\\n    function base32HexDecodeWord(bytes memory self, uint off, uint len) internal pure returns(bytes32) {\\n        require(len <= 52);\\n\\n        uint ret = 0;\\n        uint8 decoded;\\n        for(uint i = 0; i < len; i++) {\\n            bytes1 char = self[off + i];\\n            require(char >= 0x30 && char <= 0x7A);\\n            decoded = uint8(base32HexTable[uint(uint8(char)) - 0x30]);\\n            require(decoded <= 0x20);\\n            if(i == len - 1) {\\n                break;\\n            }\\n            ret = (ret << 5) | decoded;\\n        }\\n\\n        uint bitlen = len * 5;\\n        if(len % 8 == 0) {\\n            // Multiple of 8 characters, no padding\\n            ret = (ret << 5) | decoded;\\n        } else if(len % 8 == 2) {\\n            // Two extra characters - 1 byte\\n            ret = (ret << 3) | (decoded >> 2);\\n            bitlen -= 2;\\n        } else if(len % 8 == 4) {\\n            // Four extra characters - 2 bytes\\n            ret = (ret << 1) | (decoded >> 4);\\n            bitlen -= 4;\\n        } else if(len % 8 == 5) {\\n            // Five extra characters - 3 bytes\\n            ret = (ret << 4) | (decoded >> 1);\\n            bitlen -= 1;\\n        } else if(len % 8 == 7) {\\n            // Seven extra characters - 4 bytes\\n            ret = (ret << 2) | (decoded >> 3);\\n            bitlen -= 3;\\n        } else {\\n            revert();\\n        }\\n\\n        return bytes32(ret << (256 - bitlen));\\n    }\\n}\",\"keccak256\":\"0x83315df2e54c74451577c70da2c267c3459802b08b9aeec6516302eee70f796e\"},\"contracts/dnssec-oracle/DNSSEC.sol\":{\"content\":\"pragma solidity ^0.8.4;\\npragma experimental ABIEncoderV2;\\n\\nabstract contract DNSSEC {\\n\\n    bytes public anchors;\\n\\n    struct RRSetWithSignature {\\n        bytes rrset;\\n        bytes sig;\\n    }\\n\\n    event AlgorithmUpdated(uint8 id, address addr);\\n    event DigestUpdated(uint8 id, address addr);\\n    event NSEC3DigestUpdated(uint8 id, address addr);\\n    event RRSetUpdated(bytes name, bytes rrset);\\n\\n    function submitRRSets(RRSetWithSignature[] memory input, bytes calldata proof) public virtual returns (bytes memory);\\n    function submitRRSet(RRSetWithSignature calldata input, bytes calldata proof) public virtual returns (bytes memory);\\n    function deleteRRSet(uint16 deleteType, bytes calldata deleteName, RRSetWithSignature calldata nsec, bytes calldata proof) public virtual;\\n    function deleteRRSetNSEC3(uint16 deleteType, bytes memory deleteName, RRSetWithSignature memory closestEncloser, RRSetWithSignature memory nextClosest, bytes memory dnskey) public virtual;\\n    function rrdata(uint16 dnstype, bytes calldata name) external virtual view returns (uint32, uint32, bytes20);\\n}\\n\",\"keccak256\":\"0x5b8d2391f66e878e09aa88a97fe8ea5b26604a0c0ad9247feb6124db9817f6c1\"},\"contracts/dnssec-oracle/RRUtils.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\nimport \\\"./BytesUtils.sol\\\";\\nimport \\\"@ensdomains/buffer/contracts/Buffer.sol\\\";\\n\\n/**\\n* @dev RRUtils is a library that provides utilities for parsing DNS resource records.\\n*/\\nlibrary RRUtils {\\n    using BytesUtils for *;\\n    using Buffer for *;\\n\\n    /**\\n    * @dev Returns the number of bytes in the DNS name at 'offset' in 'self'.\\n    * @param self The byte array to read a name from.\\n    * @param offset The offset to start reading at.\\n    * @return The length of the DNS name at 'offset', in bytes.\\n    */\\n    function nameLength(bytes memory self, uint offset) internal pure returns(uint) {\\n        uint idx = offset;\\n        while (true) {\\n            assert(idx < self.length);\\n            uint labelLen = self.readUint8(idx);\\n            idx += labelLen + 1;\\n            if (labelLen == 0) {\\n                break;\\n            }\\n        }\\n        return idx - offset;\\n    }\\n\\n    /**\\n    * @dev Returns a DNS format name at the specified offset of self.\\n    * @param self The byte array to read a name from.\\n    * @param offset The offset to start reading at.\\n    * @return ret The name.\\n    */\\n    function readName(bytes memory self, uint offset) internal pure returns(bytes memory ret) {\\n        uint len = nameLength(self, offset);\\n        return self.substring(offset, len);\\n    }\\n\\n    /**\\n    * @dev Returns the number of labels in the DNS name at 'offset' in 'self'.\\n    * @param self The byte array to read a name from.\\n    * @param offset The offset to start reading at.\\n    * @return The number of labels in the DNS name at 'offset', in bytes.\\n    */\\n    function labelCount(bytes memory self, uint offset) internal pure returns(uint) {\\n        uint count = 0;\\n        while (true) {\\n            assert(offset < self.length);\\n            uint labelLen = self.readUint8(offset);\\n            offset += labelLen + 1;\\n            if (labelLen == 0) {\\n                break;\\n            }\\n            count += 1;\\n        }\\n        return count;\\n    }\\n\\n    uint constant RRSIG_TYPE = 0;\\n    uint constant RRSIG_ALGORITHM = 2;\\n    uint constant RRSIG_LABELS = 3;\\n    uint constant RRSIG_TTL = 4;\\n    uint constant RRSIG_EXPIRATION = 8;\\n    uint constant RRSIG_INCEPTION = 12;\\n    uint constant RRSIG_KEY_TAG = 16;\\n    uint constant RRSIG_SIGNER_NAME = 18;\\n\\n    struct SignedSet {\\n        uint16 typeCovered;\\n        uint8 algorithm;\\n        uint8 labels;\\n        uint32 ttl;\\n        uint32 expiration;\\n        uint32 inception;\\n        uint16 keytag;\\n        bytes signerName;\\n        bytes data;\\n        bytes name;\\n    }\\n\\n    function readSignedSet(bytes memory data) internal pure returns(SignedSet memory self) {\\n        self.typeCovered = data.readUint16(RRSIG_TYPE);\\n        self.algorithm = data.readUint8(RRSIG_ALGORITHM);\\n        self.labels = data.readUint8(RRSIG_LABELS);\\n        self.ttl = data.readUint32(RRSIG_TTL);\\n        self.expiration = data.readUint32(RRSIG_EXPIRATION);\\n        self.inception = data.readUint32(RRSIG_INCEPTION);\\n        self.keytag = data.readUint16(RRSIG_KEY_TAG);\\n        self.signerName = readName(data, RRSIG_SIGNER_NAME);\\n        self.data = data.substring(RRSIG_SIGNER_NAME + self.signerName.length, data.length - RRSIG_SIGNER_NAME - self.signerName.length);\\n    }\\n\\n    function rrs(SignedSet memory rrset) internal pure returns(RRIterator memory) {\\n        return iterateRRs(rrset.data, 0);\\n    }\\n\\n    /**\\n    * @dev An iterator over resource records.\\n    */\\n    struct RRIterator {\\n        bytes data;\\n        uint offset;\\n        uint16 dnstype;\\n        uint16 class;\\n        uint32 ttl;\\n        uint rdataOffset;\\n        uint nextOffset;\\n    }\\n\\n    /**\\n    * @dev Begins iterating over resource records.\\n    * @param self The byte string to read from.\\n    * @param offset The offset to start reading at.\\n    * @return ret An iterator object.\\n    */\\n    function iterateRRs(bytes memory self, uint offset) internal pure returns (RRIterator memory ret) {\\n        ret.data = self;\\n        ret.nextOffset = offset;\\n        next(ret);\\n    }\\n\\n    /**\\n    * @dev Returns true iff there are more RRs to iterate.\\n    * @param iter The iterator to check.\\n    * @return True iff the iterator has finished.\\n    */\\n    function done(RRIterator memory iter) internal pure returns(bool) {\\n        return iter.offset >= iter.data.length;\\n    }\\n\\n    /**\\n    * @dev Moves the iterator to the next resource record.\\n    * @param iter The iterator to advance.\\n    */\\n    function next(RRIterator memory iter) internal pure {\\n        iter.offset = iter.nextOffset;\\n        if (iter.offset >= iter.data.length) {\\n            return;\\n        }\\n\\n        // Skip the name\\n        uint off = iter.offset + nameLength(iter.data, iter.offset);\\n\\n        // Read type, class, and ttl\\n        iter.dnstype = iter.data.readUint16(off);\\n        off += 2;\\n        iter.class = iter.data.readUint16(off);\\n        off += 2;\\n        iter.ttl = iter.data.readUint32(off);\\n        off += 4;\\n\\n        // Read the rdata\\n        uint rdataLength = iter.data.readUint16(off);\\n        off += 2;\\n        iter.rdataOffset = off;\\n        iter.nextOffset = off + rdataLength;\\n    }\\n\\n    /**\\n    * @dev Returns the name of the current record.\\n    * @param iter The iterator.\\n    * @return A new bytes object containing the owner name from the RR.\\n    */\\n    function name(RRIterator memory iter) internal pure returns(bytes memory) {\\n        return iter.data.substring(iter.offset, nameLength(iter.data, iter.offset));\\n    }\\n\\n    /**\\n    * @dev Returns the rdata portion of the current record.\\n    * @param iter The iterator.\\n    * @return A new bytes object containing the RR's RDATA.\\n    */\\n    function rdata(RRIterator memory iter) internal pure returns(bytes memory) {\\n        return iter.data.substring(iter.rdataOffset, iter.nextOffset - iter.rdataOffset);\\n    }\\n\\n    uint constant DNSKEY_FLAGS = 0;\\n    uint constant DNSKEY_PROTOCOL = 2;\\n    uint constant DNSKEY_ALGORITHM = 3;\\n    uint constant DNSKEY_PUBKEY = 4;\\n\\n    struct DNSKEY {\\n        uint16 flags;\\n        uint8 protocol;\\n        uint8 algorithm;\\n        bytes publicKey;\\n    }\\n\\n    function readDNSKEY(bytes memory data, uint offset, uint length) internal pure returns(DNSKEY memory self) {\\n        self.flags = data.readUint16(offset + DNSKEY_FLAGS);\\n        self.protocol = data.readUint8(offset + DNSKEY_PROTOCOL);\\n        self.algorithm = data.readUint8(offset + DNSKEY_ALGORITHM);\\n        self.publicKey = data.substring(offset + DNSKEY_PUBKEY, length - DNSKEY_PUBKEY);\\n    } \\n\\n    uint constant DS_KEY_TAG = 0;\\n    uint constant DS_ALGORITHM = 2;\\n    uint constant DS_DIGEST_TYPE = 3;\\n    uint constant DS_DIGEST = 4;\\n\\n    struct DS {\\n        uint16 keytag;\\n        uint8 algorithm;\\n        uint8 digestType;\\n        bytes digest;\\n    }\\n\\n    function readDS(bytes memory data, uint offset, uint length) internal pure returns(DS memory self) {\\n        self.keytag = data.readUint16(offset + DS_KEY_TAG);\\n        self.algorithm = data.readUint8(offset + DS_ALGORITHM);\\n        self.digestType = data.readUint8(offset + DS_DIGEST_TYPE);\\n        self.digest = data.substring(offset + DS_DIGEST, length - DS_DIGEST);\\n    }\\n\\n    struct NSEC3 {\\n        uint8 hashAlgorithm;\\n        uint8 flags;\\n        uint16 iterations;\\n        bytes salt;\\n        bytes32 nextHashedOwnerName;\\n        bytes typeBitmap;\\n    }\\n\\n    uint constant NSEC3_HASH_ALGORITHM = 0;\\n    uint constant NSEC3_FLAGS = 1;\\n    uint constant NSEC3_ITERATIONS = 2;\\n    uint constant NSEC3_SALT_LENGTH = 4;\\n    uint constant NSEC3_SALT = 5;\\n\\n    function readNSEC3(bytes memory data, uint offset, uint length) internal pure returns(NSEC3 memory self) {\\n        uint end = offset + length;\\n        self.hashAlgorithm = data.readUint8(offset + NSEC3_HASH_ALGORITHM);\\n        self.flags = data.readUint8(offset + NSEC3_FLAGS);\\n        self.iterations = data.readUint16(offset + NSEC3_ITERATIONS);\\n        uint8 saltLength = data.readUint8(offset + NSEC3_SALT_LENGTH);\\n        offset = offset + NSEC3_SALT;\\n        self.salt = data.substring(offset, saltLength);\\n        offset += saltLength;\\n        uint8 nextLength = data.readUint8(offset);\\n        require(nextLength <= 32);\\n        offset += 1;\\n        self.nextHashedOwnerName = data.readBytesN(offset, nextLength);\\n        offset += nextLength;\\n        self.typeBitmap = data.substring(offset, end - offset);\\n    }\\n\\n    function checkTypeBitmap(NSEC3 memory self, uint16 rrtype) internal pure returns(bool) {\\n        return checkTypeBitmap(self.typeBitmap, 0, rrtype);\\n    }\\n\\n    /**\\n    * @dev Checks if a given RR type exists in a type bitmap.\\n    * @param bitmap The byte string to read the type bitmap from.\\n    * @param offset The offset to start reading at.\\n    * @param rrtype The RR type to check for.\\n    * @return True if the type is found in the bitmap, false otherwise.\\n    */\\n    function checkTypeBitmap(bytes memory bitmap, uint offset, uint16 rrtype) internal pure returns (bool) {\\n        uint8 typeWindow = uint8(rrtype >> 8);\\n        uint8 windowByte = uint8((rrtype & 0xff) / 8);\\n        uint8 windowBitmask = uint8(uint8(1) << (uint8(7) - uint8(rrtype & 0x7)));\\n        for (uint off = offset; off < bitmap.length;) {\\n            uint8 window = bitmap.readUint8(off);\\n            uint8 len = bitmap.readUint8(off + 1);\\n            if (typeWindow < window) {\\n                // We've gone past our window; it's not here.\\n                return false;\\n            } else if (typeWindow == window) {\\n                // Check this type bitmap\\n                if (len <= windowByte) {\\n                    // Our type is past the end of the bitmap\\n                    return false;\\n                }\\n                return (bitmap.readUint8(off + windowByte + 2) & windowBitmask) != 0;\\n            } else {\\n                // Skip this type bitmap\\n                off += len + 2;\\n            }\\n        }\\n\\n        return false;\\n    }\\n\\n    function compareNames(bytes memory self, bytes memory other) internal pure returns (int) {\\n        if (self.equals(other)) {\\n            return 0;\\n        }\\n\\n        uint off;\\n        uint otheroff;\\n        uint prevoff;\\n        uint otherprevoff;\\n        uint counts = labelCount(self, 0);\\n        uint othercounts = labelCount(other, 0);\\n\\n        // Keep removing labels from the front of the name until both names are equal length\\n        while (counts > othercounts) {\\n            prevoff = off;\\n            off = progress(self, off);\\n            counts--;\\n        }\\n\\n        while (othercounts > counts) {\\n            otherprevoff = otheroff;\\n            otheroff = progress(other, otheroff);\\n            othercounts--;\\n        }\\n\\n        // Compare the last nonequal labels to each other\\n        while (counts > 0 && !self.equals(off, other, otheroff)) {\\n            prevoff = off;\\n            off = progress(self, off);\\n            otherprevoff = otheroff;\\n            otheroff = progress(other, otheroff);\\n            counts -= 1;\\n        }\\n\\n        if (off == 0) {\\n            return -1;\\n        }\\n        if(otheroff == 0) {\\n            return 1;\\n        }\\n\\n        return self.compare(prevoff + 1, self.readUint8(prevoff), other, otherprevoff + 1, other.readUint8(otherprevoff));\\n    }\\n\\n    /**\\n     * @dev Compares two serial numbers using RFC1982 serial number math.\\n     */\\n    function serialNumberGte(uint32 i1, uint32 i2) internal pure returns(bool) {\\n        return int32(i1) - int32(i2) >= 0;\\n    }\\n\\n    function progress(bytes memory body, uint off) internal pure returns(uint) {\\n        return off + 1 + body.readUint8(off);\\n    }\\n}\",\"keccak256\":\"0x021cc7832a603e41b94d38eced8175452eaa5ab4794376fa3f722362844aeefe\"},\"contracts/registry/ENS.sol\":{\"content\":\"pragma solidity >=0.8.4;\\n\\ninterface ENS {\\n\\n    // Logged when the owner of a node assigns a new owner to a subnode.\\n    event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\\n\\n    // Logged when the owner of a node transfers ownership to a new account.\\n    event Transfer(bytes32 indexed node, address owner);\\n\\n    // Logged when the resolver for a node changes.\\n    event NewResolver(bytes32 indexed node, address resolver);\\n\\n    // Logged when the TTL of a node changes\\n    event NewTTL(bytes32 indexed node, uint64 ttl);\\n\\n    // Logged when an operator is added or removed.\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    function setRecord(bytes32 node, address owner, address resolver, uint64 ttl) external virtual;\\n    function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external virtual;\\n    function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external virtual returns(bytes32);\\n    function setResolver(bytes32 node, address resolver) external virtual;\\n    function setOwner(bytes32 node, address owner) external virtual;\\n    function setTTL(bytes32 node, uint64 ttl) external virtual;\\n    function setApprovalForAll(address operator, bool approved) external virtual;\\n    function owner(bytes32 node) external virtual view returns (address);\\n    function resolver(bytes32 node) external virtual view returns (address);\\n    function ttl(bytes32 node) external virtual view returns (uint64);\\n    function recordExists(bytes32 node) external virtual view returns (bool);\\n    function isApprovedForAll(address owner, address operator) external virtual view returns (bool);\\n}\\n\",\"keccak256\":\"0x942ef29bd7c0f62228aeb91879ddd1ba101f52a2162970d3e48adffa498f4483\"},\"contracts/registry/ENSRegistry.sol\":{\"content\":\"pragma solidity >=0.8.4;\\n\\nimport \\\"./ENS.sol\\\";\\n\\n/**\\n * The ENS registry contract.\\n */\\ncontract ENSRegistry is ENS {\\n\\n    struct Record {\\n        address owner;\\n        address resolver;\\n        uint64 ttl;\\n    }\\n\\n    mapping (bytes32 => Record) records;\\n    mapping (address => mapping(address => bool)) operators;\\n\\n    // Permits modifications only by the owner of the specified node.\\n    modifier authorised(bytes32 node) {\\n        address owner = records[node].owner;\\n        require(owner == msg.sender || operators[owner][msg.sender]);\\n        _;\\n    }\\n\\n    /**\\n     * @dev Constructs a new ENS registrar.\\n     */\\n    constructor() public {\\n        records[0x0].owner = msg.sender;\\n    }\\n\\n    /**\\n     * @dev Sets the record for a node.\\n     * @param node The node to update.\\n     * @param owner The address of the new owner.\\n     * @param resolver The address of the resolver.\\n     * @param ttl The TTL in seconds.\\n     */\\n    function setRecord(bytes32 node, address owner, address resolver, uint64 ttl) external virtual override {\\n        setOwner(node, owner);\\n        _setResolverAndTTL(node, resolver, ttl);\\n    }\\n\\n    /**\\n     * @dev Sets the record for a subnode.\\n     * @param node The parent node.\\n     * @param label The hash of the label specifying the subnode.\\n     * @param owner The address of the new owner.\\n     * @param resolver The address of the resolver.\\n     * @param ttl The TTL in seconds.\\n     */\\n    function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external virtual override {\\n        bytes32 subnode = setSubnodeOwner(node, label, owner);\\n        _setResolverAndTTL(subnode, resolver, ttl);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of a node to a new address. May only be called by the current owner of the node.\\n     * @param node The node to transfer ownership of.\\n     * @param owner The address of the new owner.\\n     */\\n    function setOwner(bytes32 node, address owner) public virtual override authorised(node) {\\n        _setOwner(node, owner);\\n        emit Transfer(node, owner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of a subnode keccak256(node, label) to a new address. May only be called by the owner of the parent node.\\n     * @param node The parent node.\\n     * @param label The hash of the label specifying the subnode.\\n     * @param owner The address of the new owner.\\n     */\\n    function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public virtual override authorised(node) returns(bytes32) {\\n        bytes32 subnode = keccak256(abi.encodePacked(node, label));\\n        _setOwner(subnode, owner);\\n        emit NewOwner(node, label, owner);\\n        return subnode;\\n    }\\n\\n    /**\\n     * @dev Sets the resolver address for the specified node.\\n     * @param node The node to update.\\n     * @param resolver The address of the resolver.\\n     */\\n    function setResolver(bytes32 node, address resolver) public virtual override authorised(node) {\\n        emit NewResolver(node, resolver);\\n        records[node].resolver = resolver;\\n    }\\n\\n    /**\\n     * @dev Sets the TTL for the specified node.\\n     * @param node The node to update.\\n     * @param ttl The TTL in seconds.\\n     */\\n    function setTTL(bytes32 node, uint64 ttl) public virtual override authorised(node) {\\n        emit NewTTL(node, ttl);\\n        records[node].ttl = ttl;\\n    }\\n\\n    /**\\n     * @dev Enable or disable approval for a third party (\\\"operator\\\") to manage\\n     *  all of `msg.sender`'s ENS records. Emits the ApprovalForAll event.\\n     * @param operator Address to add to the set of authorized operators.\\n     * @param approved True if the operator is approved, false to revoke approval.\\n     */\\n    function setApprovalForAll(address operator, bool approved) external virtual override {\\n        operators[msg.sender][operator] = approved;\\n        emit ApprovalForAll(msg.sender, operator, approved);\\n    }\\n\\n    /**\\n     * @dev Returns the address that owns the specified node.\\n     * @param node The specified node.\\n     * @return address of the owner.\\n     */\\n    function owner(bytes32 node) public virtual override view returns (address) {\\n        address addr = records[node].owner;\\n        if (addr == address(this)) {\\n            return address(0x0);\\n        }\\n\\n        return addr;\\n    }\\n\\n    /**\\n     * @dev Returns the address of the resolver for the specified node.\\n     * @param node The specified node.\\n     * @return address of the resolver.\\n     */\\n    function resolver(bytes32 node) public virtual override view returns (address) {\\n        return records[node].resolver;\\n    }\\n\\n    /**\\n     * @dev Returns the TTL of a node, and any records associated with it.\\n     * @param node The specified node.\\n     * @return ttl of the node.\\n     */\\n    function ttl(bytes32 node) public virtual override view returns (uint64) {\\n        return records[node].ttl;\\n    }\\n\\n    /**\\n     * @dev Returns whether a record has been imported to the registry.\\n     * @param node The specified node.\\n     * @return Bool if record exists\\n     */\\n    function recordExists(bytes32 node) public virtual override view returns (bool) {\\n        return records[node].owner != address(0x0);\\n    }\\n\\n    /**\\n     * @dev Query if an address is an authorized operator for another address.\\n     * @param owner The address that owns the records.\\n     * @param operator The address that acts on behalf of the owner.\\n     * @return True if `operator` is an approved operator for `owner`, false otherwise.\\n     */\\n    function isApprovedForAll(address owner, address operator) external virtual override view returns (bool) {\\n        return operators[owner][operator];\\n    }\\n\\n    function _setOwner(bytes32 node, address owner) internal virtual {\\n        records[node].owner = owner;\\n    }\\n\\n    function _setResolverAndTTL(bytes32 node, address resolver, uint64 ttl) internal {\\n        if(resolver != records[node].resolver) {\\n            records[node].resolver = resolver;\\n            emit NewResolver(node, resolver);\\n        }\\n\\n        if(ttl != records[node].ttl) {\\n            records[node].ttl = ttl;\\n            emit NewTTL(node, ttl);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xf025a2fa3fcf89a3db7064e85e9b618707a39cb47c9c1bfedaec5313b118a1c6\"},\"contracts/resolvers/ResolverBase.sol\":{\"content\":\"pragma solidity >=0.8.4;\\nabstract contract ResolverBase {\\n    bytes4 private constant INTERFACE_META_ID = 0x01ffc9a7;\\n\\n    function supportsInterface(bytes4 interfaceID) virtual public pure returns(bool) {\\n        return interfaceID == INTERFACE_META_ID;\\n    }\\n\\n    function isAuthorised(bytes32 node) internal virtual view returns(bool);\\n\\n    modifier authorised(bytes32 node) {\\n        require(isAuthorised(node));\\n        _;\\n    }\\n}\\n\",\"keccak256\":\"0xcc3f82e486c012d1f63c07d3c366b06ac2796758aecd175684e82255c0cd1fdf\"},\"contracts/resolvers/profiles/AddrResolver.sol\":{\"content\":\"pragma solidity >=0.8.4;\\nimport \\\"../ResolverBase.sol\\\";\\n\\nabstract contract AddrResolver is ResolverBase {\\n    bytes4 constant private ADDR_INTERFACE_ID = 0x3b3b57de;\\n    bytes4 constant private ADDRESS_INTERFACE_ID = 0xf1cb7e06;\\n    uint constant private COIN_TYPE_ETH = 60;\\n\\n    event AddrChanged(bytes32 indexed node, address a);\\n    event AddressChanged(bytes32 indexed node, uint coinType, bytes newAddress);\\n\\n    mapping(bytes32=>mapping(uint=>bytes)) _addresses;\\n\\n    /**\\n     * Sets the address associated with an ENS node.\\n     * May only be called by the owner of that node in the ENS registry.\\n     * @param node The node to update.\\n     * @param a The address to set.\\n     */\\n    function setAddr(bytes32 node, address a) external authorised(node) {\\n        setAddr(node, COIN_TYPE_ETH, addressToBytes(a));\\n    }\\n\\n    /**\\n     * Returns the address associated with an ENS node.\\n     * @param node The ENS node to query.\\n     * @return The associated address.\\n     */\\n    function addr(bytes32 node) public view returns (address payable) {\\n        bytes memory a = addr(node, COIN_TYPE_ETH);\\n        if(a.length == 0) {\\n            return payable(0);\\n        }\\n        return bytesToAddress(a);\\n    }\\n\\n    function setAddr(bytes32 node, uint coinType, bytes memory a) public authorised(node) {\\n        emit AddressChanged(node, coinType, a);\\n        if(coinType == COIN_TYPE_ETH) {\\n            emit AddrChanged(node, bytesToAddress(a));\\n        }\\n        _addresses[node][coinType] = a;\\n    }\\n\\n    function addr(bytes32 node, uint coinType) public view returns(bytes memory) {\\n        return _addresses[node][coinType];\\n    }\\n\\n    function supportsInterface(bytes4 interfaceID) virtual override public pure returns(bool) {\\n        return interfaceID == ADDR_INTERFACE_ID || interfaceID == ADDRESS_INTERFACE_ID || super.supportsInterface(interfaceID);\\n    }\\n\\n    function bytesToAddress(bytes memory b) internal pure returns(address payable a) {\\n        require(b.length == 20);\\n        assembly {\\n            a := div(mload(add(b, 32)), exp(256, 12))\\n        }\\n    }\\n\\n    function addressToBytes(address a) internal pure returns(bytes memory b) {\\n        b = new bytes(20);\\n        assembly {\\n            mstore(add(b, 32), mul(a, exp(256, 12)))\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x143cf15a5fc6e0dbed86e5ea862ddfa175e8987db42c70204067f140acb9e423\"},\"contracts/root/Controllable.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\ncontract Controllable is Ownable {\\n    mapping(address => bool) public controllers;\\n\\n    event ControllerChanged(address indexed controller, bool enabled);\\n\\n    modifier onlyController {\\n        require(\\n            controllers[msg.sender],\\n            \\\"Controllable: Caller is not a controller\\\"\\n        );\\n        _;\\n    }\\n\\n    function setController(address controller, bool enabled) public onlyOwner {\\n        controllers[controller] = enabled;\\n        emit ControllerChanged(controller, enabled);\\n    }\\n}\\n\",\"keccak256\":\"0x0c364a5b65b6fff279adbe1fd6498c488feabeec781599cd60a5844e80ee7d88\"},\"contracts/root/Root.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\nimport \\\"../registry/ENS.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"./Controllable.sol\\\";\\n\\ncontract Root is Ownable, Controllable {\\n    bytes32 private constant ROOT_NODE = bytes32(0);\\n\\n    bytes4 private constant INTERFACE_META_ID =\\n        bytes4(keccak256(\\\"supportsInterface(bytes4)\\\"));\\n\\n    event TLDLocked(bytes32 indexed label);\\n\\n    ENS public ens;\\n    mapping(bytes32 => bool) public locked;\\n\\n    constructor(ENS _ens) public {\\n        ens = _ens;\\n    }\\n\\n    function setSubnodeOwner(bytes32 label, address owner)\\n        external\\n        onlyController\\n    {\\n        require(!locked[label]);\\n        ens.setSubnodeOwner(ROOT_NODE, label, owner);\\n    }\\n\\n    function setResolver(address resolver) external onlyOwner {\\n        ens.setResolver(ROOT_NODE, resolver);\\n    }\\n\\n    function lock(bytes32 label) external onlyOwner {\\n        emit TLDLocked(label);\\n        locked[label] = true;\\n    }\\n\\n    function supportsInterface(bytes4 interfaceID)\\n        external\\n        pure\\n        returns (bool)\\n    {\\n        return interfaceID == INTERFACE_META_ID;\\n    }\\n}\\n\",\"keccak256\":\"0xf6fed46bbdc8a425d112c473a649045148b2e0404647c97590d2a3e2798c9fe3\"}},\"version\":1}",
  "bytecode": "0x60806040523480156200001157600080fd5b5060405162003488380380620034888339818101604052810190620000379190620001fb565b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb3eacd0e351fafdfefdec84e1cd19679b38dbcd63ea7c2c24da17fd2bc3b3c0e60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051620000c8919062000262565b60405180910390a181600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f9176b7f47e4504df5e5516c99d90d82ac7cbd49cc77e7f22ba2ac2f2e3a3eba8600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405162000164919062000262565b60405180910390a180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200033d565b600081519050620001c781620002ef565b92915050565b600081519050620001de8162000309565b92915050565b600081519050620001f58162000323565b92915050565b6000806000606084860312156200021157600080fd5b60006200022186828701620001b6565b93505060206200023486828701620001e4565b92505060406200024786828701620001cd565b9150509250925092565b6200025c816200027f565b82525050565b600060208201905062000279600083018462000251565b92915050565b60006200028c82620002cf565b9050919050565b6000620002a0826200027f565b9050919050565b6000620002b4826200027f565b9050919050565b6000620002c8826200027f565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620002fa8162000293565b81146200030657600080fd5b50565b6200031481620002a7565b81146200032057600080fd5b50565b6200032e81620002bb565b81146200033a57600080fd5b50565b61313b806200034d6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80633f15457f116100665780633f15457f1461011e5780637adbf9731461013c5780637dc0d1d0146101585780638bbedf7514610176578063be27b22c1461019257610093565b806301ffc9a7146100985780631ecfc411146100c8578063224199c2146100e457806330349ebe14610100575b600080fd5b6100b260048036038101906100ad919061211f565b6101ae565b6040516100bf91906126e7565b60405180910390f35b6100e260048036038101906100dd9190612374565b610280565b005b6100fe60048036038101906100f99190612220565b61048b565b005b6101086108cc565b6040516101159190612828565b60405180910390f35b6101266108f2565b604051610133919061280d565b60405180910390f35b6101566004803603810190610151919061234b565b610918565b005b610160610b20565b60405161016d91906127f2565b60405180910390f35b610190600480360381019061018b9190612189565b610b44565b005b6101ac60048036038101906101a791906122df565b610c07565b005b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061027957507f17d8f49b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be36000801b6040518263ffffffff1660e01b81526004016102e09190612702565b60206040518083038186803b1580156102f857600080fd5b505afa15801561030c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033091906120a4565b905060008173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561037a57600080fd5b505afa15801561038e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b291906120a4565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103ec57600080fd5b82600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f9176b7f47e4504df5e5516c99d90d82ac7cbd49cc77e7f22ba2ac2f2e3a3eba8600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405161047e9190612695565b60405180910390a1505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663435cc16285856040518363ffffffff1660e01b81526004016104e69291906126b0565b600060405180830381600087803b15801561050057600080fd5b505af1158015610514573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061053d9190612148565b9250600080600061054e8887610cd5565b9250925092508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b9906128c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461082b57600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065d90612843565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ef2c7f08484308960006040518663ffffffff1660e01b81526004016106ca95949392919061277d565b600060405180830381600087803b1580156106e457600080fd5b505af11580156106f8573d6000803e3d6000fd5b5050505060008383604051602001610711929190612669565b6040516020818303038152906040528051906020012090508573ffffffffffffffffffffffffffffffffffffffff1663d5fa2b0082876040518363ffffffff1660e01b815260040161076492919061271d565b600060405180830381600087803b15801561077e57600080fd5b505af1158015610792573d6000803e3d6000fd5b50505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635b0fc9c382846040518363ffffffff1660e01b81526004016107f392919061271d565b600060405180830381600087803b15801561080d57600080fd5b505af1158015610821573d6000803e3d6000fd5b50505050506108c2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ef2c7f08484848960006040518663ffffffff1660e01b815260040161088f95949392919061277d565b600060405180830381600087803b1580156108a957600080fd5b505af11580156108bd573d6000803e3d6000fd5b505050505b5050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be36000801b6040518263ffffffff1660e01b81526004016109789190612702565b60206040518083038186803b15801561099057600080fd5b505afa1580156109a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c891906120a4565b905060008173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1257600080fd5b505afa158015610a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4a91906120a4565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a8457600080fd5b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb3eacd0e351fafdfefdec84e1cd19679b38dbcd63ea7c2c24da17fd2bc3b3c0e60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051610b139190612695565b60405180910390a1505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663435cc16283836040518363ffffffff1660e01b8152600401610b9f9291906126b0565b600060405180830381600087803b158015610bb957600080fd5b505af1158015610bcd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bf69190612148565b9050610c028382610c07565b505050565b6000806000610c168585610cd5565b925092509250600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306ab59238484846040518463ffffffff1660e01b8152600401610c7b93929190612746565b602060405180830381600087803b158015610c9557600080fd5b505af1158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd91906120f6565b505050505050565b600080600080610cef600087610ef090919063ffffffff16565b60ff169050610d0a60018288610f419092919063ffffffff16565b92506000610d47600183610d1e9190612a0c565b6001848a51610d2d9190612b6e565b610d379190612b6e565b89610f6d9092919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f89059e826040518263ffffffff1660e01b8152600401610da491906127d0565b60206040518083038186803b158015610dbc57600080fd5b505afa158015610dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df491906120cd565b610e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2a90612863565b60405180910390fd5b610e3e816000611028565b9450610e6b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff168888611443565b50809350508273ffffffffffffffffffffffffffffffffffffffff168585604051602001610e9a929190612669565b604051602081830303815290604052805190602001207fa2e66ce20e6fb2c4f61339c364ad79f15160cf5307230c8bc4d628adbca2ba3989604051610edf91906127d0565b60405180910390a350509250925092565b6000828281518110610f2b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c905092915050565b600083518284610f519190612a0c565b1115610f5c57600080fd5b818360208601012090509392505050565b606083518284610f7d9190612a0c565b1115610f8857600080fd5b60008267ffffffffffffffff811115610fca577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610ffc5781602001600182028036833780820191505090505b509050600080602083019150856020880101905061101b8282876116b4565b8293505050509392505050565b60008061103e8385610ef090919063ffffffff16565b60ff1690506000811415611058576000801b91505061143d565b600061107b856001848761106c9190612a0c565b6110769190612a0c565b611028565b905060006110a060018661108f9190612a0c565b8488610f419092919063ffffffff16565b905081816040516020016110b5929190612669565b6040516020818303038152906040528051906020012093506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be3866040518263ffffffff1660e01b815260040161112a9190612702565b60206040518083038186803b15801561114257600080fd5b505afa158015611156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117a91906120a4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806111e257503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121890612883565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611438576000801b831415611384576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be36000801b6040518263ffffffff1660e01b81526004016112bf9190612702565b60206040518083038186803b1580156112d757600080fd5b505afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f91906120a4565b90508073ffffffffffffffffffffffffffffffffffffffff16638cb8ecec84306040518363ffffffff1660e01b815260040161134c92919061271d565b600060405180830381600087803b15801561136657600080fd5b505af115801561137a573d6000803e3d6000fd5b5050505050611437565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306ab59238484306040518463ffffffff1660e01b81526004016113e393929190612746565b602060405180830381600087803b1580156113fd57600080fd5b505af1158015611411573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143591906120f6565b505b5b505050505b92915050565b60008061144e611d86565b61146e6005865161145f9190612a0c565b8261171890919063ffffffff16565b506114b76040518060400160405280600581526020017f045f656e730000000000000000000000000000000000000000000000000000008152508261178290919063ffffffff16565b506114cb858261178290919063ffffffff16565b506000808773ffffffffffffffffffffffffffffffffffffffff1663087991bc601085600001516040518363ffffffff1660e01b815260040161150f9291906128e3565b60606040518083038186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f919061239d565b9091508093508192505050600060601b6bffffffffffffffffffffffff1916826bffffffffffffffffffffffff191614801561159c575060008651145b156115b057600080945094505050506116ac565b85805190602001206bffffffffffffffffffffffff1916826bffffffffffffffffffffffff1916146115e157600080fd5b60006115f76000886117a490919063ffffffff16565b90505b611603816117ce565b6116a05761162081608001518361161a9190612a62565b426117e4565b61165f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611656906128a3565b60405180910390fd5b600080611670898460a00151611800565b8093508192505050811561169057806001975097505050505050506116ac565b505061169b81611886565b6115fa565b50600080945094505050505b935093915050565b5b602081106116f357815183526020836116ce9190612a0c565b92506020826116dd9190612a0c565b91506020816116ec9190612b6e565b90506116b5565b60006001826020036101000a0390508019835116818551168181178652505050505050565b611720611d86565b600060208361172f9190612df3565b1461175b576020826117419190612df3565b602061174d9190612b6e565b826117589190612a0c565b91505b81836020018181525050604051808452600081528281016020016040525082905092915050565b61178a611d86565b61179c838460000151518485516119d0565b905092915050565b6117ac611da0565b828160000181905250818160c00181815250506117c881611886565b92915050565b6000816000015151826020015110159050919050565b60008082846117f39190612af6565b60030b1215905092915050565b6000805b83518310156118775760006118228486610ef090919063ffffffff16565b60ff1690506001846118349190612a0c565b9350600080611844878785611abf565b80935081925050508115611861578060019450945050505061187f565b828661186d9190612a0c565b9550505050611804565b600080915091505b9250929050565b8060c001518160200181815250508060000151518160200151106118a9576119cd565b60006118bd82600001518360200151611b29565b82602001516118cc9190612a0c565b90506118e5818360000151611bcc90919063ffffffff16565b826040019061ffff16908161ffff16815250506002816119059190612a0c565b905061191e818360000151611bcc90919063ffffffff16565b826060019061ffff16908161ffff168152505060028161193e9190612a0c565b9050611957818360000151611bfb90919063ffffffff16565b826080019063ffffffff16908163ffffffff168152505060048161197b9190612a0c565b90506000611996828460000151611bcc90919063ffffffff16565b61ffff1690506002826119a99190612a0c565b9150818360a001818152505080826119c19190612a0c565b8360c001818152505050505b50565b6119d8611d86565b82518211156119e657600080fd5b846020015182856119f79190612a0c565b1115611a2c57611a2b856002611a1c88602001518887611a179190612a0c565b611c2c565b611a269190612a9c565b611c48565b5b600080865180518760208301019350808887011115611a4b5787860182525b60208701925050505b60208410611a925780518252602082611a6d9190612a0c565b9150602081611a7c9190612a0c565b9050602084611a8b9190612b6e565b9350611a54565b60006001856020036101000a03905080198251168184511681811785525050508692505050949350505050565b60008063613d3078611ada8587611bfb90919063ffffffff16565b63ffffffff1614611af15760008091509150611b21565b602c831015611b065760008091509150611b21565b611b1c85600486611b179190612a0c565b611c6c565b915091505b935093915050565b6000808290505b600115611bb75783518110611b6e577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000611b838286610ef090919063ffffffff16565b60ff169050600181611b959190612a0c565b82611ba09190612a0c565b91506000811415611bb15750611bb7565b50611b30565b8281611bc39190612b6e565b91505092915050565b60008251600283611bdd9190612a0c565b1115611be857600080fd5b61ffff8260028501015116905092915050565b60008251600483611c0c9190612a0c565b1115611c1757600080fd5b63ffffffff8260048501015116905092915050565b600081831115611c3e57829050611c42565b8190505b92915050565b600082600001519050611c5b8383611718565b50611c668382611782565b50505050565b6000806028838551611c7e9190612b6e565b1015611c905760008091509150611d7f565b6000808490505b602885611ca49190612a0c565b811015611d7557600482901b91506000611cc78288610ef090919063ffffffff16565b60ff16905060308110158015611cdd5750603a81105b15611cf857603081611cef9190612b6e565b83179250611d61565b60418110158015611d095750604781105b15611d2457603781611d1b9190612b6e565b83179250611d60565b60618110158015611d355750606781105b15611d5057605781611d479190612b6e565b83179250611d5f565b60008094509450505050611d7f565b5b5b508080611d6d90612da0565b915050611c97565b5080600192509250505b9250929050565b604051806040016040528060608152602001600081525090565b6040518060e001604052806060815260200160008152602001600061ffff168152602001600061ffff168152602001600063ffffffff16815260200160008152602001600081525090565b6000611dfe611df984612938565b612913565b90508083825260208201905082856020860282011115611e1d57600080fd5b60005b85811015611e6757813567ffffffffffffffff811115611e3f57600080fd5b808601611e4c8982612013565b85526020850194506020840193505050600181019050611e20565b5050509392505050565b6000611e84611e7f84612964565b612913565b905082815260208101848484011115611e9c57600080fd5b611ea7848285612d2d565b509392505050565b6000611ec2611ebd84612964565b612913565b905082815260208101848484011115611eda57600080fd5b611ee5848285612d3c565b509392505050565b600081359050611efc8161304d565b92915050565b600081519050611f118161304d565b92915050565b600082601f830112611f2857600080fd5b8135611f38848260208601611deb565b91505092915050565b600081519050611f5081613064565b92915050565b600081519050611f658161307b565b92915050565b600081519050611f7a81613092565b92915050565b600081359050611f8f816130a9565b92915050565b600082601f830112611fa657600080fd5b8135611fb6848260208601611e71565b91505092915050565b600082601f830112611fd057600080fd5b8151611fe0848260208601611eaf565b91505092915050565b600081359050611ff8816130c0565b92915050565b60008135905061200d816130d7565b92915050565b60006040828403121561202557600080fd5b61202f6040612913565b9050600082013567ffffffffffffffff81111561204b57600080fd5b61205784828501611f95565b600083015250602082013567ffffffffffffffff81111561207757600080fd5b61208384828501611f95565b60208301525092915050565b60008151905061209e816130ee565b92915050565b6000602082840312156120b657600080fd5b60006120c484828501611f02565b91505092915050565b6000602082840312156120df57600080fd5b60006120ed84828501611f41565b91505092915050565b60006020828403121561210857600080fd5b600061211684828501611f6b565b91505092915050565b60006020828403121561213157600080fd5b600061213f84828501611f80565b91505092915050565b60006020828403121561215a57600080fd5b600082015167ffffffffffffffff81111561217457600080fd5b61218084828501611fbf565b91505092915050565b60008060006060848603121561219e57600080fd5b600084013567ffffffffffffffff8111156121b857600080fd5b6121c486828701611f95565b935050602084013567ffffffffffffffff8111156121e157600080fd5b6121ed86828701611f17565b925050604084013567ffffffffffffffff81111561220a57600080fd5b61221686828701611f95565b9150509250925092565b600080600080600060a0868803121561223857600080fd5b600086013567ffffffffffffffff81111561225257600080fd5b61225e88828901611f95565b955050602086013567ffffffffffffffff81111561227b57600080fd5b61228788828901611f17565b945050604086013567ffffffffffffffff8111156122a457600080fd5b6122b088828901611f95565b93505060606122c188828901611eed565b92505060806122d288828901611eed565b9150509295509295909350565b600080604083850312156122f257600080fd5b600083013567ffffffffffffffff81111561230c57600080fd5b61231885828601611f95565b925050602083013567ffffffffffffffff81111561233557600080fd5b61234185828601611f95565b9150509250929050565b60006020828403121561235d57600080fd5b600061236b84828501611fe9565b91505092915050565b60006020828403121561238657600080fd5b600061239484828501611ffe565b91505092915050565b6000806000606084860312156123b257600080fd5b60006123c08682870161208f565b93505060206123d18682870161208f565b92505060406123e286828701611f56565b9150509250925092565b60006123f88383612616565b905092915050565b61240981612ba2565b82525050565b600061241a826129a5565b61242481856129c8565b93508360208202850161243685612995565b8060005b85811015612472578484038952815161245385826123ec565b945061245e836129bb565b925060208a0199505060018101905061243a565b50829750879550505050505092915050565b61248d81612bb4565b82525050565b61249c81612bec565b82525050565b6124b36124ae82612bec565b612de9565b82525050565b60006124c4826129b0565b6124ce81856129d9565b93506124de818560208601612d3c565b6124e781612eb1565b840191505092915050565b60006124fd826129b0565b61250781856129ea565b9350612517818560208601612d3c565b61252081612eb1565b840191505092915050565b61253481612caf565b82525050565b61254381612cd3565b82525050565b61255281612cf7565b82525050565b61256181612d1b565b82525050565b60006125746026836129fb565b915061257f82612ec2565b604082019050919050565b60006125976023836129fb565b91506125a282612f11565b604082019050919050565b60006125ba602a836129fb565b91506125c582612f60565b604082019050919050565b60006125dd603c836129fb565b91506125e882612faf565b604082019050919050565b6000612600602d836129fb565b915061260b82612ffe565b604082019050919050565b6000604083016000830151848203600086015261263382826124b9565b9150506020830151848203602086015261264d82826124b9565b9150508091505092915050565b61266381612c53565b82525050565b600061267582856124a2565b60208201915061268582846124a2565b6020820191508190509392505050565b60006020820190506126aa6000830184612400565b92915050565b600060408201905081810360008301526126ca818561240f565b905081810360208301526126de81846124f2565b90509392505050565b60006020820190506126fc6000830184612484565b92915050565b60006020820190506127176000830184612493565b92915050565b60006040820190506127326000830185612493565b61273f6020830184612400565b9392505050565b600060608201905061275b6000830186612493565b6127686020830185612493565b6127756040830184612400565b949350505050565b600060a0820190506127926000830188612493565b61279f6020830187612493565b6127ac6040830186612400565b6127b96060830185612400565b6127c66080830184612558565b9695505050505050565b600060208201905081810360008301526127ea81846124f2565b905092915050565b6000602082019050612807600083018461252b565b92915050565b6000602082019050612822600083018461253a565b92915050565b600060208201905061283d6000830184612549565b92915050565b6000602082019050818103600083015261285c81612567565b9050919050565b6000602082019050818103600083015261287c8161258a565b9050919050565b6000602082019050818103600083015261289c816125ad565b9050919050565b600060208201905081810360008301526128bc816125d0565b9050919050565b600060208201905081810360008301526128dc816125f3565b9050919050565b60006040820190506128f8600083018561265a565b818103602083015261290a81846124f2565b90509392505050565b600061291d61292e565b90506129298282612d6f565b919050565b6000604051905090565b600067ffffffffffffffff82111561295357612952612e82565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561297f5761297e612e82565b5b61298882612eb1565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612a1782612c81565b9150612a2283612c81565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a5757612a56612e24565b5b828201905092915050565b6000612a6d82612c8b565b9150612a7883612c8b565b92508263ffffffff03821115612a9157612a90612e24565b5b828201905092915050565b6000612aa782612c81565b9150612ab283612c81565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612aeb57612aea612e24565b5b828202905092915050565b6000612b0182612c46565b9150612b0c83612c46565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000001821260008412151615612b4757612b46612e24565b5b82637fffffff018213600084121615612b6357612b62612e24565b5b828203905092915050565b6000612b7982612c81565b9150612b8483612c81565b925082821015612b9757612b96612e24565b5b828203905092915050565b6000612bad82612c61565b9050919050565b60008115159050919050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000612c2d82612ba2565b9050919050565b6000612c3f82612ba2565b9050919050565b60008160030b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b6000612cba82612cc1565b9050919050565b6000612ccc82612c61565b9050919050565b6000612cde82612ce5565b9050919050565b6000612cf082612c61565b9050919050565b6000612d0282612d09565b9050919050565b6000612d1482612c61565b9050919050565b6000612d2682612c9b565b9050919050565b82818337600083830152505050565b60005b83811015612d5a578082015181840152602081019050612d3f565b83811115612d69576000848401525b50505050565b612d7882612eb1565b810181811067ffffffffffffffff82111715612d9757612d96612e82565b5b80604052505050565b6000612dab82612c81565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612dde57612ddd612e24565b5b600182019050919050565b6000819050919050565b6000612dfe82612c81565b9150612e0983612c81565b925082612e1957612e18612e53565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f43616e6e6f74207365742061646472206966207265736f6c766572206973206e60008201527f6f74207365740000000000000000000000000000000000000000000000000000602082015250565b7f506172656e74206e616d65206d7573742062652061207075626c69632073756660008201527f6669780000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420656e61626c652061206e616d65206f776e656420627920736f60008201527f6d656f6e6520656c736500000000000000000000000000000000000000000000602082015250565b7f444e53207265636f7264206973207374616c653b2072656672657368206f722060008201527f64656c657465206974206265666f72652070726f63656564696e672e00000000602082015250565b7f4f6e6c79206f776e65722063616e2063616c6c2070726f7665416e64436c616960008201527f6d576974685265736f6c76657200000000000000000000000000000000000000602082015250565b61305681612ba2565b811461306157600080fd5b50565b61306d81612bb4565b811461307857600080fd5b50565b61308481612bc0565b811461308f57600080fd5b50565b61309b81612bec565b81146130a657600080fd5b50565b6130b281612bf6565b81146130bd57600080fd5b50565b6130c981612c22565b81146130d457600080fd5b50565b6130e081612c34565b81146130eb57600080fd5b50565b6130f781612c8b565b811461310257600080fd5b5056fea26469706673582212206ee5cab83a909097227319cce5a4b719af0f19534dc0e6e62503c5f38a59e2e764736f6c63430008040033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100935760003560e01c80633f15457f116100665780633f15457f1461011e5780637adbf9731461013c5780637dc0d1d0146101585780638bbedf7514610176578063be27b22c1461019257610093565b806301ffc9a7146100985780631ecfc411146100c8578063224199c2146100e457806330349ebe14610100575b600080fd5b6100b260048036038101906100ad919061211f565b6101ae565b6040516100bf91906126e7565b60405180910390f35b6100e260048036038101906100dd9190612374565b610280565b005b6100fe60048036038101906100f99190612220565b61048b565b005b6101086108cc565b6040516101159190612828565b60405180910390f35b6101266108f2565b604051610133919061280d565b60405180910390f35b6101566004803603810190610151919061234b565b610918565b005b610160610b20565b60405161016d91906127f2565b60405180910390f35b610190600480360381019061018b9190612189565b610b44565b005b6101ac60048036038101906101a791906122df565b610c07565b005b60007f01ffc9a7a5cef8baa21ed3c5c0d7e23accb804b619e9333b597f47a0d84076e27bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061027957507f17d8f49b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be36000801b6040518263ffffffff1660e01b81526004016102e09190612702565b60206040518083038186803b1580156102f857600080fd5b505afa15801561030c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033091906120a4565b905060008173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561037a57600080fd5b505afa15801561038e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b291906120a4565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103ec57600080fd5b82600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f9176b7f47e4504df5e5516c99d90d82ac7cbd49cc77e7f22ba2ac2f2e3a3eba8600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405161047e9190612695565b60405180910390a1505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663435cc16285856040518363ffffffff1660e01b81526004016104e69291906126b0565b600060405180830381600087803b15801561050057600080fd5b505af1158015610514573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061053d9190612148565b9250600080600061054e8887610cd5565b9250925092508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b9906128c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461082b57600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065d90612843565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ef2c7f08484308960006040518663ffffffff1660e01b81526004016106ca95949392919061277d565b600060405180830381600087803b1580156106e457600080fd5b505af11580156106f8573d6000803e3d6000fd5b5050505060008383604051602001610711929190612669565b6040516020818303038152906040528051906020012090508573ffffffffffffffffffffffffffffffffffffffff1663d5fa2b0082876040518363ffffffff1660e01b815260040161076492919061271d565b600060405180830381600087803b15801561077e57600080fd5b505af1158015610792573d6000803e3d6000fd5b50505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635b0fc9c382846040518363ffffffff1660e01b81526004016107f392919061271d565b600060405180830381600087803b15801561080d57600080fd5b505af1158015610821573d6000803e3d6000fd5b50505050506108c2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ef2c7f08484848960006040518663ffffffff1660e01b815260040161088f95949392919061277d565b600060405180830381600087803b1580156108a957600080fd5b505af11580156108bd573d6000803e3d6000fd5b505050505b5050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be36000801b6040518263ffffffff1660e01b81526004016109789190612702565b60206040518083038186803b15801561099057600080fd5b505afa1580156109a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c891906120a4565b905060008173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a1257600080fd5b505afa158015610a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4a91906120a4565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a8457600080fd5b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb3eacd0e351fafdfefdec84e1cd19679b38dbcd63ea7c2c24da17fd2bc3b3c0e60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051610b139190612695565b60405180910390a1505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663435cc16283836040518363ffffffff1660e01b8152600401610b9f9291906126b0565b600060405180830381600087803b158015610bb957600080fd5b505af1158015610bcd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bf69190612148565b9050610c028382610c07565b505050565b6000806000610c168585610cd5565b925092509250600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306ab59238484846040518463ffffffff1660e01b8152600401610c7b93929190612746565b602060405180830381600087803b158015610c9557600080fd5b505af1158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd91906120f6565b505050505050565b600080600080610cef600087610ef090919063ffffffff16565b60ff169050610d0a60018288610f419092919063ffffffff16565b92506000610d47600183610d1e9190612a0c565b6001848a51610d2d9190612b6e565b610d379190612b6e565b89610f6d9092919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f89059e826040518263ffffffff1660e01b8152600401610da491906127d0565b60206040518083038186803b158015610dbc57600080fd5b505afa158015610dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df491906120cd565b610e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2a90612863565b60405180910390fd5b610e3e816000611028565b9450610e6b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff168888611443565b50809350508273ffffffffffffffffffffffffffffffffffffffff168585604051602001610e9a929190612669565b604051602081830303815290604052805190602001207fa2e66ce20e6fb2c4f61339c364ad79f15160cf5307230c8bc4d628adbca2ba3989604051610edf91906127d0565b60405180910390a350509250925092565b6000828281518110610f2b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c905092915050565b600083518284610f519190612a0c565b1115610f5c57600080fd5b818360208601012090509392505050565b606083518284610f7d9190612a0c565b1115610f8857600080fd5b60008267ffffffffffffffff811115610fca577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610ffc5781602001600182028036833780820191505090505b509050600080602083019150856020880101905061101b8282876116b4565b8293505050509392505050565b60008061103e8385610ef090919063ffffffff16565b60ff1690506000811415611058576000801b91505061143d565b600061107b856001848761106c9190612a0c565b6110769190612a0c565b611028565b905060006110a060018661108f9190612a0c565b8488610f419092919063ffffffff16565b905081816040516020016110b5929190612669565b6040516020818303038152906040528051906020012093506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be3866040518263ffffffff1660e01b815260040161112a9190612702565b60206040518083038186803b15801561114257600080fd5b505afa158015611156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117a91906120a4565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806111e257503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121890612883565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611438576000801b831415611384576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be36000801b6040518263ffffffff1660e01b81526004016112bf9190612702565b60206040518083038186803b1580156112d757600080fd5b505afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f91906120a4565b90508073ffffffffffffffffffffffffffffffffffffffff16638cb8ecec84306040518363ffffffff1660e01b815260040161134c92919061271d565b600060405180830381600087803b15801561136657600080fd5b505af115801561137a573d6000803e3d6000fd5b5050505050611437565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306ab59238484306040518463ffffffff1660e01b81526004016113e393929190612746565b602060405180830381600087803b1580156113fd57600080fd5b505af1158015611411573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143591906120f6565b505b5b505050505b92915050565b60008061144e611d86565b61146e6005865161145f9190612a0c565b8261171890919063ffffffff16565b506114b76040518060400160405280600581526020017f045f656e730000000000000000000000000000000000000000000000000000008152508261178290919063ffffffff16565b506114cb858261178290919063ffffffff16565b506000808773ffffffffffffffffffffffffffffffffffffffff1663087991bc601085600001516040518363ffffffff1660e01b815260040161150f9291906128e3565b60606040518083038186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f919061239d565b9091508093508192505050600060601b6bffffffffffffffffffffffff1916826bffffffffffffffffffffffff191614801561159c575060008651145b156115b057600080945094505050506116ac565b85805190602001206bffffffffffffffffffffffff1916826bffffffffffffffffffffffff1916146115e157600080fd5b60006115f76000886117a490919063ffffffff16565b90505b611603816117ce565b6116a05761162081608001518361161a9190612a62565b426117e4565b61165f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611656906128a3565b60405180910390fd5b600080611670898460a00151611800565b8093508192505050811561169057806001975097505050505050506116ac565b505061169b81611886565b6115fa565b50600080945094505050505b935093915050565b5b602081106116f357815183526020836116ce9190612a0c565b92506020826116dd9190612a0c565b91506020816116ec9190612b6e565b90506116b5565b60006001826020036101000a0390508019835116818551168181178652505050505050565b611720611d86565b600060208361172f9190612df3565b1461175b576020826117419190612df3565b602061174d9190612b6e565b826117589190612a0c565b91505b81836020018181525050604051808452600081528281016020016040525082905092915050565b61178a611d86565b61179c838460000151518485516119d0565b905092915050565b6117ac611da0565b828160000181905250818160c00181815250506117c881611886565b92915050565b6000816000015151826020015110159050919050565b60008082846117f39190612af6565b60030b1215905092915050565b6000805b83518310156118775760006118228486610ef090919063ffffffff16565b60ff1690506001846118349190612a0c565b9350600080611844878785611abf565b80935081925050508115611861578060019450945050505061187f565b828661186d9190612a0c565b9550505050611804565b600080915091505b9250929050565b8060c001518160200181815250508060000151518160200151106118a9576119cd565b60006118bd82600001518360200151611b29565b82602001516118cc9190612a0c565b90506118e5818360000151611bcc90919063ffffffff16565b826040019061ffff16908161ffff16815250506002816119059190612a0c565b905061191e818360000151611bcc90919063ffffffff16565b826060019061ffff16908161ffff168152505060028161193e9190612a0c565b9050611957818360000151611bfb90919063ffffffff16565b826080019063ffffffff16908163ffffffff168152505060048161197b9190612a0c565b90506000611996828460000151611bcc90919063ffffffff16565b61ffff1690506002826119a99190612a0c565b9150818360a001818152505080826119c19190612a0c565b8360c001818152505050505b50565b6119d8611d86565b82518211156119e657600080fd5b846020015182856119f79190612a0c565b1115611a2c57611a2b856002611a1c88602001518887611a179190612a0c565b611c2c565b611a269190612a9c565b611c48565b5b600080865180518760208301019350808887011115611a4b5787860182525b60208701925050505b60208410611a925780518252602082611a6d9190612a0c565b9150602081611a7c9190612a0c565b9050602084611a8b9190612b6e565b9350611a54565b60006001856020036101000a03905080198251168184511681811785525050508692505050949350505050565b60008063613d3078611ada8587611bfb90919063ffffffff16565b63ffffffff1614611af15760008091509150611b21565b602c831015611b065760008091509150611b21565b611b1c85600486611b179190612a0c565b611c6c565b915091505b935093915050565b6000808290505b600115611bb75783518110611b6e577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b6000611b838286610ef090919063ffffffff16565b60ff169050600181611b959190612a0c565b82611ba09190612a0c565b91506000811415611bb15750611bb7565b50611b30565b8281611bc39190612b6e565b91505092915050565b60008251600283611bdd9190612a0c565b1115611be857600080fd5b61ffff8260028501015116905092915050565b60008251600483611c0c9190612a0c565b1115611c1757600080fd5b63ffffffff8260048501015116905092915050565b600081831115611c3e57829050611c42565b8190505b92915050565b600082600001519050611c5b8383611718565b50611c668382611782565b50505050565b6000806028838551611c7e9190612b6e565b1015611c905760008091509150611d7f565b6000808490505b602885611ca49190612a0c565b811015611d7557600482901b91506000611cc78288610ef090919063ffffffff16565b60ff16905060308110158015611cdd5750603a81105b15611cf857603081611cef9190612b6e565b83179250611d61565b60418110158015611d095750604781105b15611d2457603781611d1b9190612b6e565b83179250611d60565b60618110158015611d355750606781105b15611d5057605781611d479190612b6e565b83179250611d5f565b60008094509450505050611d7f565b5b5b508080611d6d90612da0565b915050611c97565b5080600192509250505b9250929050565b604051806040016040528060608152602001600081525090565b6040518060e001604052806060815260200160008152602001600061ffff168152602001600061ffff168152602001600063ffffffff16815260200160008152602001600081525090565b6000611dfe611df984612938565b612913565b90508083825260208201905082856020860282011115611e1d57600080fd5b60005b85811015611e6757813567ffffffffffffffff811115611e3f57600080fd5b808601611e4c8982612013565b85526020850194506020840193505050600181019050611e20565b5050509392505050565b6000611e84611e7f84612964565b612913565b905082815260208101848484011115611e9c57600080fd5b611ea7848285612d2d565b509392505050565b6000611ec2611ebd84612964565b612913565b905082815260208101848484011115611eda57600080fd5b611ee5848285612d3c565b509392505050565b600081359050611efc8161304d565b92915050565b600081519050611f118161304d565b92915050565b600082601f830112611f2857600080fd5b8135611f38848260208601611deb565b91505092915050565b600081519050611f5081613064565b92915050565b600081519050611f658161307b565b92915050565b600081519050611f7a81613092565b92915050565b600081359050611f8f816130a9565b92915050565b600082601f830112611fa657600080fd5b8135611fb6848260208601611e71565b91505092915050565b600082601f830112611fd057600080fd5b8151611fe0848260208601611eaf565b91505092915050565b600081359050611ff8816130c0565b92915050565b60008135905061200d816130d7565b92915050565b60006040828403121561202557600080fd5b61202f6040612913565b9050600082013567ffffffffffffffff81111561204b57600080fd5b61205784828501611f95565b600083015250602082013567ffffffffffffffff81111561207757600080fd5b61208384828501611f95565b60208301525092915050565b60008151905061209e816130ee565b92915050565b6000602082840312156120b657600080fd5b60006120c484828501611f02565b91505092915050565b6000602082840312156120df57600080fd5b60006120ed84828501611f41565b91505092915050565b60006020828403121561210857600080fd5b600061211684828501611f6b565b91505092915050565b60006020828403121561213157600080fd5b600061213f84828501611f80565b91505092915050565b60006020828403121561215a57600080fd5b600082015167ffffffffffffffff81111561217457600080fd5b61218084828501611fbf565b91505092915050565b60008060006060848603121561219e57600080fd5b600084013567ffffffffffffffff8111156121b857600080fd5b6121c486828701611f95565b935050602084013567ffffffffffffffff8111156121e157600080fd5b6121ed86828701611f17565b925050604084013567ffffffffffffffff81111561220a57600080fd5b61221686828701611f95565b9150509250925092565b600080600080600060a0868803121561223857600080fd5b600086013567ffffffffffffffff81111561225257600080fd5b61225e88828901611f95565b955050602086013567ffffffffffffffff81111561227b57600080fd5b61228788828901611f17565b945050604086013567ffffffffffffffff8111156122a457600080fd5b6122b088828901611f95565b93505060606122c188828901611eed565b92505060806122d288828901611eed565b9150509295509295909350565b600080604083850312156122f257600080fd5b600083013567ffffffffffffffff81111561230c57600080fd5b61231885828601611f95565b925050602083013567ffffffffffffffff81111561233557600080fd5b61234185828601611f95565b9150509250929050565b60006020828403121561235d57600080fd5b600061236b84828501611fe9565b91505092915050565b60006020828403121561238657600080fd5b600061239484828501611ffe565b91505092915050565b6000806000606084860312156123b257600080fd5b60006123c08682870161208f565b93505060206123d18682870161208f565b92505060406123e286828701611f56565b9150509250925092565b60006123f88383612616565b905092915050565b61240981612ba2565b82525050565b600061241a826129a5565b61242481856129c8565b93508360208202850161243685612995565b8060005b85811015612472578484038952815161245385826123ec565b945061245e836129bb565b925060208a0199505060018101905061243a565b50829750879550505050505092915050565b61248d81612bb4565b82525050565b61249c81612bec565b82525050565b6124b36124ae82612bec565b612de9565b82525050565b60006124c4826129b0565b6124ce81856129d9565b93506124de818560208601612d3c565b6124e781612eb1565b840191505092915050565b60006124fd826129b0565b61250781856129ea565b9350612517818560208601612d3c565b61252081612eb1565b840191505092915050565b61253481612caf565b82525050565b61254381612cd3565b82525050565b61255281612cf7565b82525050565b61256181612d1b565b82525050565b60006125746026836129fb565b915061257f82612ec2565b604082019050919050565b60006125976023836129fb565b91506125a282612f11565b604082019050919050565b60006125ba602a836129fb565b91506125c582612f60565b604082019050919050565b60006125dd603c836129fb565b91506125e882612faf565b604082019050919050565b6000612600602d836129fb565b915061260b82612ffe565b604082019050919050565b6000604083016000830151848203600086015261263382826124b9565b9150506020830151848203602086015261264d82826124b9565b9150508091505092915050565b61266381612c53565b82525050565b600061267582856124a2565b60208201915061268582846124a2565b6020820191508190509392505050565b60006020820190506126aa6000830184612400565b92915050565b600060408201905081810360008301526126ca818561240f565b905081810360208301526126de81846124f2565b90509392505050565b60006020820190506126fc6000830184612484565b92915050565b60006020820190506127176000830184612493565b92915050565b60006040820190506127326000830185612493565b61273f6020830184612400565b9392505050565b600060608201905061275b6000830186612493565b6127686020830185612493565b6127756040830184612400565b949350505050565b600060a0820190506127926000830188612493565b61279f6020830187612493565b6127ac6040830186612400565b6127b96060830185612400565b6127c66080830184612558565b9695505050505050565b600060208201905081810360008301526127ea81846124f2565b905092915050565b6000602082019050612807600083018461252b565b92915050565b6000602082019050612822600083018461253a565b92915050565b600060208201905061283d6000830184612549565b92915050565b6000602082019050818103600083015261285c81612567565b9050919050565b6000602082019050818103600083015261287c8161258a565b9050919050565b6000602082019050818103600083015261289c816125ad565b9050919050565b600060208201905081810360008301526128bc816125d0565b9050919050565b600060208201905081810360008301526128dc816125f3565b9050919050565b60006040820190506128f8600083018561265a565b818103602083015261290a81846124f2565b90509392505050565b600061291d61292e565b90506129298282612d6f565b919050565b6000604051905090565b600067ffffffffffffffff82111561295357612952612e82565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561297f5761297e612e82565b5b61298882612eb1565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612a1782612c81565b9150612a2283612c81565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a5757612a56612e24565b5b828201905092915050565b6000612a6d82612c8b565b9150612a7883612c8b565b92508263ffffffff03821115612a9157612a90612e24565b5b828201905092915050565b6000612aa782612c81565b9150612ab283612c81565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612aeb57612aea612e24565b5b828202905092915050565b6000612b0182612c46565b9150612b0c83612c46565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000001821260008412151615612b4757612b46612e24565b5b82637fffffff018213600084121615612b6357612b62612e24565b5b828203905092915050565b6000612b7982612c81565b9150612b8483612c81565b925082821015612b9757612b96612e24565b5b828203905092915050565b6000612bad82612c61565b9050919050565b60008115159050919050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000612c2d82612ba2565b9050919050565b6000612c3f82612ba2565b9050919050565b60008160030b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b6000612cba82612cc1565b9050919050565b6000612ccc82612c61565b9050919050565b6000612cde82612ce5565b9050919050565b6000612cf082612c61565b9050919050565b6000612d0282612d09565b9050919050565b6000612d1482612c61565b9050919050565b6000612d2682612c9b565b9050919050565b82818337600083830152505050565b60005b83811015612d5a578082015181840152602081019050612d3f565b83811115612d69576000848401525b50505050565b612d7882612eb1565b810181811067ffffffffffffffff82111715612d9757612d96612e82565b5b80604052505050565b6000612dab82612c81565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612dde57612ddd612e24565b5b600182019050919050565b6000819050919050565b6000612dfe82612c81565b9150612e0983612c81565b925082612e1957612e18612e53565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f43616e6e6f74207365742061646472206966207265736f6c766572206973206e60008201527f6f74207365740000000000000000000000000000000000000000000000000000602082015250565b7f506172656e74206e616d65206d7573742062652061207075626c69632073756660008201527f6669780000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420656e61626c652061206e616d65206f776e656420627920736f60008201527f6d656f6e6520656c736500000000000000000000000000000000000000000000602082015250565b7f444e53207265636f7264206973207374616c653b2072656672657368206f722060008201527f64656c657465206974206265666f72652070726f63656564696e672e00000000602082015250565b7f4f6e6c79206f776e65722063616e2063616c6c2070726f7665416e64436c616960008201527f6d576974685265736f6c76657200000000000000000000000000000000000000602082015250565b61305681612ba2565b811461306157600080fd5b50565b61306d81612bb4565b811461307857600080fd5b50565b61308481612bc0565b811461308f57600080fd5b50565b61309b81612bec565b81146130a657600080fd5b50565b6130b281612bf6565b81146130bd57600080fd5b50565b6130c981612c22565b81146130d457600080fd5b50565b6130e081612c34565b81146130eb57600080fd5b50565b6130f781612c8b565b811461310257600080fd5b5056fea26469706673582212206ee5cab83a909097227319cce5a4b719af0f19534dc0e6e62503c5f38a59e2e764736f6c63430008040033",
  "devdoc": {
    "details": "An ENS registrar that allows the owner of a DNS name to claim the      corresponding name in ENS.",
    "kind": "dev",
    "methods": {
      "claim(bytes,bytes)": {
        "details": "Claims a name by proving ownership of its DNS equivalent.",
        "params": {
          "name": "The name to claim, in DNS wire format.",
          "proof": "A DNS RRSet proving ownership of the name. Must be verified        in the DNSSEC oracle before calling. This RRSET must contain a TXT        record for '_ens.' + name, with the value 'a=0x...'. Ownership of        the name will be transferred to the address specified in the TXT        record."
        }
      },
      "proveAndClaim(bytes,(bytes,bytes)[],bytes)": {
        "details": "Submits proofs to the DNSSEC oracle, then claims a name using those proofs.",
        "params": {
          "input": "The data to be passed to the Oracle's `submitProofs` function. The last        proof must be the TXT record required by the registrar.",
          "name": "The name to claim, in DNS wire format.",
          "proof": "The proof record for the first element in input."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 2640,
        "contract": "contracts/dnsregistrar/DNSRegistrar.sol:DNSRegistrar",
        "label": "oracle",
        "offset": 0,
        "slot": "0",
        "type": "t_contract(DNSSEC)4213"
      },
      {
        "astId": 2643,
        "contract": "contracts/dnsregistrar/DNSRegistrar.sol:DNSRegistrar",
        "label": "ens",
        "offset": 0,
        "slot": "1",
        "type": "t_contract(ENS)11957"
      },
      {
        "astId": 2646,
        "contract": "contracts/dnsregistrar/DNSRegistrar.sol:DNSRegistrar",
        "label": "suffixes",
        "offset": 0,
        "slot": "2",
        "type": "t_contract(PublicSuffixList)3193"
      }
    ],
    "types": {
      "t_contract(DNSSEC)4213": {
        "encoding": "inplace",
        "label": "contract DNSSEC",
        "numberOfBytes": "20"
      },
      "t_contract(ENS)11957": {
        "encoding": "inplace",
        "label": "contract ENS",
        "numberOfBytes": "20"
      },
      "t_contract(PublicSuffixList)3193": {
        "encoding": "inplace",
        "label": "contract PublicSuffixList",
        "numberOfBytes": "20"
      }
    }
  }
}