ETH Price: $3,107.24 (+1.25%)
Gas: 5 Gwei

Contract

0xe42096724170Ac8FAB152F8b605752151410d3c3
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Add Complex Shap...170180592023-04-10 13:21:47457 days ago1681132907IN
0xe4209672...51410d3c3
0 ETH0.0728594922.27960448
Add Complex Shap...170180592023-04-10 13:21:47457 days ago1681132907IN
0xe4209672...51410d3c3
0 ETH0.0732404722.27960448
Add Complex Shap...170180592023-04-10 13:21:47457 days ago1681132907IN
0xe4209672...51410d3c3
0 ETH0.0588364922.27960448
Add Complex Shap...170180582023-04-10 13:21:35457 days ago1681132895IN
0xe4209672...51410d3c3
0 ETH0.0691988921.16023497
Add Complex Shap...170180582023-04-10 13:21:35457 days ago1681132895IN
0xe4209672...51410d3c3
0 ETH0.0695607321.16023497
Add Complex Shap...170180582023-04-10 13:21:35457 days ago1681132895IN
0xe4209672...51410d3c3
0 ETH0.0553985521.16023497
Add Complex Shap...170180582023-04-10 13:21:35457 days ago1681132895IN
0xe4209672...51410d3c3
0 ETH0.0691988921.16023497
Add Complex Shap...170160682023-04-10 6:35:59457 days ago1681108559IN
0xe4209672...51410d3c3
0 ETH0.0855170326.01410659
Add Complex Shap...170158962023-04-10 6:00:59457 days ago1681106459IN
0xe4209672...51410d3c3
0 ETH0.0262088731.697751
Add Complex Shap...170158962023-04-10 6:00:59457 days ago1681106459IN
0xe4209672...51410d3c3
0 ETH0.1036590331.697751
Add Complex Shap...170158952023-04-10 6:00:35457 days ago1681106435IN
0xe4209672...51410d3c3
0 ETH0.0983859630.08530875
Add Complex Shap...170158952023-04-10 6:00:35457 days ago1681106435IN
0xe4209672...51410d3c3
0 ETH0.0983859630.08530875
Add Complex Shap...170158952023-04-10 6:00:35457 days ago1681106435IN
0xe4209672...51410d3c3
0 ETH0.0989004230.08530875
Add Complex Shap...170158952023-04-10 6:00:35457 days ago1681106435IN
0xe4209672...51410d3c3
0 ETH0.0168350730.08530875
Add Complex Shap...170158952023-04-10 6:00:35457 days ago1681106435IN
0xe4209672...51410d3c3
0 ETH0.092152928.17930875
Add Complex Shap...170158952023-04-10 6:00:35457 days ago1681106435IN
0xe4209672...51410d3c3
0 ETH0.092152928.17930875
Add Complex Shap...170158952023-04-10 6:00:35457 days ago1681106435IN
0xe4209672...51410d3c3
0 ETH0.0926347728.17930875
Add Complex Shap...170158952023-04-10 6:00:35457 days ago1681106435IN
0xe4209672...51410d3c3
0 ETH0.0110227828.17930875
Add Complex Shap...170158952023-04-10 6:00:35457 days ago1681106435IN
0xe4209672...51410d3c3
0 ETH0.092152928.17930875
Add Complex Shap...170158942023-04-10 6:00:23457 days ago1681106423IN
0xe4209672...51410d3c3
0 ETH0.0826407125.13913659
Add Complex Shap...170158942023-04-10 6:00:23457 days ago1681106423IN
0xe4209672...51410d3c3
0 ETH0.0098976325.13913659
Add Complex Shap...170158922023-04-10 5:59:59457 days ago1681106399IN
0xe4209672...51410d3c3
0 ETH0.0752861523.02164993
Add Complex Shap...170158922023-04-10 5:59:59457 days ago1681106399IN
0xe4209672...51410d3c3
0 ETH0.0756798223.02164993
Add Complex Shap...170158922023-04-10 5:59:59457 days ago1681106399IN
0xe4209672...51410d3c3
0 ETH0.0196239723.02164993
Add Complex Shap...170158922023-04-10 5:59:59457 days ago1681106399IN
0xe4209672...51410d3c3
0 ETH0.0756798223.02164993
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
170180592023-04-10 13:21:47457 days ago1681132907
0xe4209672...51410d3c3
 Contract Creation0 ETH
170180592023-04-10 13:21:47457 days ago1681132907
0xe4209672...51410d3c3
 Contract Creation0 ETH
170180592023-04-10 13:21:47457 days ago1681132907
0xe4209672...51410d3c3
 Contract Creation0 ETH
170180582023-04-10 13:21:35457 days ago1681132895
0xe4209672...51410d3c3
 Contract Creation0 ETH
170180582023-04-10 13:21:35457 days ago1681132895
0xe4209672...51410d3c3
 Contract Creation0 ETH
170180582023-04-10 13:21:35457 days ago1681132895
0xe4209672...51410d3c3
 Contract Creation0 ETH
170180582023-04-10 13:21:35457 days ago1681132895
0xe4209672...51410d3c3
 Contract Creation0 ETH
170160682023-04-10 6:35:59457 days ago1681108559
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158962023-04-10 6:00:59457 days ago1681106459
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158962023-04-10 6:00:59457 days ago1681106459
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158952023-04-10 6:00:35457 days ago1681106435
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158952023-04-10 6:00:35457 days ago1681106435
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158952023-04-10 6:00:35457 days ago1681106435
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158952023-04-10 6:00:35457 days ago1681106435
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158952023-04-10 6:00:35457 days ago1681106435
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158952023-04-10 6:00:35457 days ago1681106435
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158952023-04-10 6:00:35457 days ago1681106435
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158952023-04-10 6:00:35457 days ago1681106435
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158952023-04-10 6:00:35457 days ago1681106435
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158942023-04-10 6:00:23457 days ago1681106423
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158942023-04-10 6:00:23457 days ago1681106423
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158922023-04-10 5:59:59457 days ago1681106399
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158922023-04-10 5:59:59457 days ago1681106399
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158922023-04-10 5:59:59457 days ago1681106399
0xe4209672...51410d3c3
 Contract Creation0 ETH
170158922023-04-10 5:59:59457 days ago1681106399
0xe4209672...51410d3c3
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
goodblocksGen1

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 3 : gbGen1.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "./SSTORE2.sol";

error YooooThatTokenIdIsWayTooHigh();
error GottaUnlockGen1Please();
error YoureNotTheOwnerHomie();

/*

     ██████   ██████   ██████  ██████  ██████  ██       ██████   ██████ ██   ██ ███████ 
    ██       ██    ██ ██    ██ ██   ██ ██   ██ ██      ██    ██ ██      ██  ██  ██      
    ██   ███ ██    ██ ██    ██ ██   ██ ██████  ██      ██    ██ ██      █████   ███████ 
    ██    ██ ██    ██ ██    ██ ██   ██ ██   ██ ██      ██    ██ ██      ██  ██       ██ 
     ██████   ██████   ██████  ██████  ██████  ███████  ██████   ██████ ██   ██ ███████ 
                                                                                        
                                                                                        
     ██████  ███████ ███    ██        ██                                                
    ██       ██      ████   ██       ███                                                
    ██   ███ █████   ██ ██  ██ █████  ██                                                
    ██    ██ ██      ██  ██ ██        ██                                                
     ██████  ███████ ██   ████        ██

    
    circles and squares

*/


contract goodblocksGen1
{
    // gen-1 description
    string private constant Gen1Description = unicode"who said circles and squares cant get along? welcome to gen-1 where these two shapes come together in perfect harmony. you know the drill... enjoy the art, explore the code, and dont forget to click around for some extra fun! 😉";



    /*

        ███████ ████████  ██████  ██████  ███████     ████████ ██   ██ ███████ ███    ███     ██████  ██       ██████   ██████ ██   ██ ███████ 
        ██         ██    ██    ██ ██   ██ ██             ██    ██   ██ ██      ████  ████     ██   ██ ██      ██    ██ ██      ██  ██  ██      
        ███████    ██    ██    ██ ██████  █████          ██    ███████ █████   ██ ████ ██     ██████  ██      ██    ██ ██      █████   ███████ 
             ██    ██    ██    ██ ██   ██ ██             ██    ██   ██ ██      ██  ██  ██     ██   ██ ██      ██    ██ ██      ██  ██       ██ 
        ███████    ██     ██████  ██   ██ ███████        ██    ██   ██ ███████ ██      ██     ██████  ███████  ██████   ██████ ██   ██ ███████

    */

    // gen-1 block struct
    struct Gen1Block
    {
        uint256 numLevels;
        uint256 widthInterval;
        uint256 circleCount;
        uint256 squareCount;
        uint256 noneCount;
        uint256 complexityLevel;
        bool glitchy;
        string svg;
        string name;
        string[4] palette;
    }

    // struct to store complex shapes
    struct ComplexShape
    {
        // array of addresses that store complex shape string pieces
        address[] pointers;
    }

    // 32 complex shapes for gen-1
    ComplexShape[32] private ComplexShapes;

    // write string with sstore2
    function writeString(string memory _string) external onlyOwner returns(address)
    {
        return SSTORE2.write(bytes(_string));
    }

    // add pointer to complex shape address data
    function addComplexShapePointer(uint256 _shapeIndex, uint256 _pointerIndex, address _pointer) external onlyOwner
    {
        ComplexShapes[_shapeIndex].pointers[_pointerIndex] = _pointer;
    }

    // add another sstore2 contract address to a complex shape array by index
    function addComplexShapeString(uint256 _shapeIndex, string memory _string) external onlyOwner
    {
        // write string and get pointer
        address _newPointer = SSTORE2.write(bytes(_string));
        // add pointer to complex shape array
        ComplexShapes[_shapeIndex].pointers.push(_newPointer);
    }

    // returns the svg shapes of a complex shape
    function getComplexShape(uint256 _shapeIndex) public view returns(string memory)
    {
        // if complex shape not loaded, return empty string
        if(ComplexShapes[_shapeIndex].pointers.length == 0)
        {
            return "";
        }

        uint256 i;
        string memory output;
        address[] memory pointers = ComplexShapes[_shapeIndex].pointers;
        unchecked
        {
            do
            {
                output = string.concat(output, string(SSTORE2.read(pointers[i])));
                ++i;
            } while(i<pointers.length);
        }
        return output;
    }

    // reset complex shape to rewrite shape
    function resetComplexShapePointers(uint256 _shapeIndex) external onlyOwner
    {
        delete ComplexShapes[_shapeIndex].pointers;
    }

    // borrowed colors and palettes from gen0
    string[7] private ColorGroupNames = ["Joy", "Night", "Cosmos", "Earth", "Arctic", "Serenity", "Twilight"];
    string[4][56] private ColorPalettes = 
    [
        ["#FDFF8F","#A8ECE7","#F4BEEE","#D47AE8"], // 0 palette (Joy)
        ["#FD6F96","#FFEBA1","#95DAC1","#6F69AC"],
        ["#FFDF6B","#FF79CD","#AA2EE6","#23049D"],
        ["#95E1D3","#EAFFD0","#FCE38A","#FF75A0"],
        ["#FFCC29","#F58634","#007965","#00AF91"],
        ["#998CEB","#77E4D4","#B4FE98","#FBF46D"],
        ["#EEEEEE","#77D970","#172774","#FF0075"],
        ["#005F99","#FF449F","#FFF5B7","#00EAD3"],
        ["#0B0B0D","#474A56","#929AAB","#D3D5FD"], // 1 palette (Night)
        ["#07031A","#4F8A8B","#B1B493","#FFCB74"],
        ["#2E3A63","#665C84","#71A0A5","#FAB95B"],
        ["#000000","#226089","#4592AF","#E3C4A8"],
        ["#1B1F3A","#53354A","#A64942","#FF7844"],
        ["#1a1a1a","#153B44","#2D6E7E","#C6DE41"],
        ["#0F0A3C","#07456F","#009F9D","#CDFFEB"],
        ["#130026","#801336","#C72C41","#EE4540"],
        ["#111D5E","#C70039","#F37121","#C0E218"], // 2 palette (Cosmos)
        ["#02383C","#230338","#ED5107","#C70D3A"],
        ["#03C4A1","#C62A88","#590995","#150485"],
        ["#00A8CC","#005082","#000839","#FFA41B"],
        ["#E94560","#0F3460","#16213E","#1A1A2E"],
        ["#D2FAFB","#FE346E","#512B58","#2C003E"],
        ["#706C61","#E1F4F3","#FFFFFF","#333333"],
        ["#FAF7F2","#2BB3C0","#161C2E","#EF6C35"],
        ["#FFFBE9","#E3CAA5","#CEAB93","#AD8B73"], // 3 palette (Earth)
        ["#A09F57","#C56824","#CFB784","#EADEB8"],
        ["#E3D0B9","#E1BC91","#C19277","#62959C"],
        ["#E9C891","#8A8635","#AE431E","#D06224"],
        ["#83B582","#D6E4AA","#FFFFC5","#F0DD92"],
        ["#303E27","#B4BB72","#E7EAA8","#F6FAF7"],
        ["#A8896C","#F1E8A7","#AED09E","#61B292"],
        ["#F4DFBA","#EEC373","#CA965C","#876445"],
        ["#42C2FF","#85F4FF","#B8FFF9","#EFFFFD"], // 4 palette (Arctic)
        ["#E8F0F2","#A2DBFA","#39A2DB","#053742"],
        ["#3E64FF","#5EDFFF","#B2FCFF","#ECFCFF"],
        ["#D1FFFA","#4AA9AF","#3E31AE","#1C226B"],
        ["#F7F3F3","#C1EAF2","#5CC2F2","#191BA9"],
        ["#F3F3F3","#303841","#3A4750","#2185D5"],
        ["#769FCD","#B9D7EA","#D6E6F2","#F7FBFC"],
        ["#3D6CB9","#00D1FF","#00FFF0","#FAFAF6"],
        ["#99FEFF","#94DAFF","#94B3FD","#B983FF"], // 5 palette (Serenity)
        ["#E5707E","#E6B566","#E8E9A1","#A3DDCB"],
        ["#6892D5","#79D1C3","#C9FDD7","#F8FCFB"],
        ["#6C5B7B","#C06C84","#F67280","#F8B195"],
        ["#30475E","#BA6B57","#F1935C","#E7B2A5"],
        ["#FFEBD3","#264E70","#679186","#FFB4AC"],
        ["#6DDCCF","#94EBCD","#FFEFA1","#FFCB91"],
        ["#D8EFF0","#B0E0A8","#F0F69F","#F3C1C6"],
        ["#35477D","#6C5B7B","#C06C84","#F67280"], // 6 palette (Twilight)
        ["#F6C065","#55B3B1","#AF0069","#09015F"],
        ["#470D21","#9C0F48","#D67D3E","#F9E4D4"],
        ["#001F52","#A10054","#FF8D68","#FFECBA"],
        ["#FF6C00","#A0204C","#23103A","#282D4F"],
        ["#FFF9B2","#ECAC5D","#B24080","#3F0713"],
        ["#FFE98A","#C84771","#61105E","#280B45"],
        ["#EDE862","#FA9856","#F27370","#22559C"]
    ];

    // bones of the gen-1 svg
    address[4] private SVGAddresses;

    // set svg piece
    function setSvgPiece(uint256 _index, string memory _string) external onlyOwner returns(address)
    {
        SVGAddresses[_index] = SSTORE2.write(bytes(_string));
        return SVGAddresses[_index];
    }
    
    // read svg piece
    function readSvgPiece(uint256 _index) public view returns(string memory)
    {
        return string(SSTORE2.read(SVGAddresses[_index]));
    }
    


    /*

        ███    ███  █████  ██   ██ ███████     ██████  ███████ ███    ███     ██████  ██       ██████   ██████ ██   ██ ███████ 
        ████  ████ ██   ██ ██  ██  ██          ██   ██ ██      ████  ████     ██   ██ ██      ██    ██ ██      ██  ██  ██      
        ██ ████ ██ ███████ █████   █████       ██   ██ █████   ██ ████ ██     ██████  ██      ██    ██ ██      █████   ███████ 
        ██  ██  ██ ██   ██ ██  ██  ██          ██   ██ ██      ██  ██  ██     ██   ██ ██      ██    ██ ██      ██  ██       ██ 
        ██      ██ ██   ██ ██   ██ ███████     ██████  ███████ ██      ██     ██████  ███████  ██████   ██████ ██   ██ ███████ 

    */

    // get token uri for gen-1
    function tokenGenURI(uint256 _tokenId, string memory _tokenMetadata, string memory _tokenAttributes) public view returns(string memory)
    {
        // check if valid token ID
        if(_tokenId > 8280) revert YooooThatTokenIdIsWayTooHigh();
        // get token data
        IGBContract.TokenData memory tokenData = GBTokenContract.getTokenData(_tokenId);
        // check if gen-1 has been unlocked
        if(tokenData.highestGenLevel < 1) revert GottaUnlockGen1Please();
        // get gen-0 block
        IGen0Contract.GoodBlock memory gen0_block = Gen0Contract.tokenToGoodblock(_tokenId);
        // get gen-1 block
        Gen1Block memory gen1_block = getGen1Block(_tokenId, tokenData, gen0_block);
        // get token metadata
        string memory metadata = blockToMetadata(tokenData, gen0_block, gen1_block, _tokenAttributes);

        // construct token uri
        string memory tokenUri = string.concat(
            '{"name":"',
            ColorGroupNames[gen0_block.colorGroupIndex],
            ' #',
            OZ.toString(_tokenId),
            '","description":"',
            Gen1Description,
            '",',
            _tokenMetadata,
            '"attributes":[',
            metadata,
            '],"image":"data:image/svg+xml;base64,',
            string(OZ.encode(bytes(gen1_block.svg))),
            '"}'
        );
        // return that suckah!
        return string.concat("data:application/json;base64,", string(OZ.encode(bytes(tokenUri))));
    }

    // get token svg (interoperability)
    function getTokenSVG(uint256 _tokenId) public view returns(string memory)
    {
        // check if valid token ID
        if(_tokenId > 8280) revert YooooThatTokenIdIsWayTooHigh();
        // get token data
        IGBContract.TokenData memory tokenData = GBTokenContract.getTokenData(_tokenId);
        // check if gen-1 has been unlocked
        if(tokenData.highestGenLevel < 1) revert GottaUnlockGen1Please();
        // get gen-0 block
        IGen0Contract.GoodBlock memory gen0_block = Gen0Contract.tokenToGoodblock(_tokenId);

        Gen1Block memory gen1Block = getGen1Block(_tokenId, tokenData, gen0_block);
        return gen1Block.svg;
    }

    // get gen-1 block
    function getGen1Block(uint256 _tokenId, IGBContract.TokenData memory _tokenData, IGen0Contract.GoodBlock memory _gen0block) private view returns(Gen1Block memory)
    {
        // create gen-1 block
        Gen1Block memory gen1_block;
        // create token id as string
        string memory tokenIdString = OZ.toString(_tokenId);
        unchecked
        {
            // set levels and shape width interval
            gen1_block.numLevels = (random(string.concat(tokenIdString, "create x innovate x impact x do good"))%4) + 5;
            gen1_block.widthInterval = 3000/gen1_block.numLevels;   
            // retrieve color palette
            string[4] memory palette = ColorPalettes[(_gen0block.colorGroupIndex * 8) + _gen0block.paletteIndex];    
            gen1_block.palette = palette;
        }
        // get svg
        gen1_block.svg = getGen1SVG(_tokenId, _tokenData, _gen0block, gen1_block);
        // return gen-1 block
        return gen1_block;
    }
    
    // generate svg for gen-1 block
    function getGen1SVG(uint256 _tokenId, IGBContract.TokenData memory _tokenData, IGen0Contract.GoodBlock memory _gen0Block,  Gen1Block memory _gen1Block) private view returns(string memory)
    {
        uint256 width;
        uint256 shapeDesign;
        uint256 tokenRand;
        uint256 scale;
        uint256 i;

        // svg intro
        string memory svg = string.concat(
            readSvgPiece(1),
            '<g id="art"',
            _gen0Block.symmetryIndex == 5 ? ' filter="url(#glitch)">\n\n' : '>\n\n',
            '<rect x="0" y="0" width="100%" height="100%" fill="',
            _gen0Block.isDarkBlock ? '#000' : _gen1Block.palette[0],
            '"/>\n\n<g id="shapes"',
            _gen0Block.symmetryIndex == 5 ? ' filter="url(#noise)">\n\n' : '>\n\n'
        );

        unchecked
        {
            do
            {
                // get random number
                tokenRand = (_tokenId+13)*(i+1);
                
                // check if complexity is possible
                if(_gen1Block.complexityLevel > 1  || i > 5)
                {
                    // get simpler shape
                    shapeDesign = getShapeDesign(tokenRand, 150);
                } else
                {
                    // get more complex shape
                    shapeDesign = getShapeDesign(tokenRand, 300);
                }

                // update width
                width = _gen1Block.widthInterval*(_gen1Block.numLevels-i);

                // none
                if(shapeDesign == 0)
                {
                    // nothing to see here folks!
                    ++_gen1Block.noneCount;


                // basic circle
                } else if(shapeDesign == 1)
                {
                    // add to svg
                    svg = string.concat(
                        svg,
                        '<g id="shapeGroup_',
                        OZ.toString(i),
                        '" fill="',
                        _gen0Block.isDarkBlock && (tokenRand % 13 == 0) ? "#000" : _gen1Block.palette[(tokenRand+1)%4],
                        '" stroke="',
                        _gen1Block.palette[(tokenRand+2)%4],
                        '" stroke-width="50">\n',
                        drawCircle(width/2),
                        '</g>\n\n'
                    );
                    ++_gen1Block.circleCount;


                // basic square
                } else if(shapeDesign == 2)
                {
                    // add to svg
                    svg = string.concat(
                        svg,
                        '<g id="shapeGroup_',
                        OZ.toString(i),
                        '" fill="',
                        _gen0Block.isDarkBlock && (tokenRand % 13 == 0) ? "#000" : _gen1Block.palette[(tokenRand+10)%4],
                        '" stroke="',
                        _gen1Block.palette[(tokenRand+11)%4],
                        '" stroke-width="50">\n',
                        drawSquare(width),
                        '</g>\n\n'
                    );
                    ++_gen1Block.squareCount;


                // repeated circle
                } else if(shapeDesign == 3)
                {
                    // add to svg
                    scale = (width*100)/(4000);
                    svg = string.concat(
                        svg,
                        '<g id="shapeGroup_',
                        OZ.toString(i),
                        string.concat(
                            '" fill="',
                            _gen0Block.isDarkBlock && (tokenRand % 13 == 0) ? "#000" : _gen1Block.palette[(tokenRand+3)%4],
                            '" stroke="',
                            _gen1Block.palette[(tokenRand+4)%4]
                            ),
                        '" stroke-width="10" transform="translate(',
                        string.concat(addDecimalFromTheRight(200000-2000*(scale), 2), ', ', addDecimalFromTheRight(200000-2000*(scale), 2))
                    );
                    svg = string.concat(
                        svg,
                        ') scale(',
                        string.concat(addDecimalFromTheRight((scale), 2), ', ', addDecimalFromTheRight((scale), 2)),
                        ')" >\n',
                        getComplexShape((tokenRand)%12),
                        '</g>\n\n'
                    );
                    // update counts
                    ++_gen1Block.circleCount;
                    ++_gen1Block.complexityLevel;


                // repeated square
                } else if(shapeDesign == 4)
                {
                    // add to svg
                    scale = (width*100)/(4000);
                    svg = string.concat(
                        svg,
                        '<g id="shapeGroup_',
                        OZ.toString(i),
                        string.concat(
                            '" fill="',
                            _gen0Block.isDarkBlock && (tokenRand % 13 == 0) ? "#000" : _gen1Block.palette[(tokenRand+3)%4],
                            '" stroke="',
                            _gen1Block.palette[(tokenRand+4)%4]
                            ),
                        '" stroke-width="10" transform="translate(',
                        string.concat(addDecimalFromTheRight(200000-2000*(scale), 2), ', ', addDecimalFromTheRight(200000-2000*(scale), 2))
                    );
                    svg = string.concat(
                        svg,
                        ') scale(',
                        string.concat(addDecimalFromTheRight((scale), 2), ', ', addDecimalFromTheRight((scale), 2)),
                        ')" >\n',
                        getComplexShape((tokenRand)%12),
                        '</g>\n\n'
                    );
                    // update counts
                    ++_gen1Block.squareCount;
                    ++_gen1Block.complexityLevel;


                // rotated square same
                } else if(shapeDesign == 5)
                {
                    // add to svg
                    scale = (width*100)/(4000);
                    svg = string.concat(
                        svg,
                        '<g id="shapeGroup_',
                        OZ.toString(i),
                        string.concat(
                            '" fill="',
                            _gen0Block.isDarkBlock && (tokenRand % 13 == 0) ? "#000" : _gen1Block.palette[(tokenRand+3)%4],
                            '" stroke="',
                            _gen1Block.palette[(tokenRand+4)%4]
                            ),
                        '" stroke-width="10" transform="translate(',
                        string.concat(addDecimalFromTheRight(200000-2000*(scale), 2), ', ', addDecimalFromTheRight(200000-2000*(scale), 2))
                    );
                    svg = string.concat(
                        svg,
                        ') scale(',
                        string.concat(addDecimalFromTheRight((scale), 2), ', ', addDecimalFromTheRight((scale), 2)),
                        ')" >\n',
                        getComplexShape((tokenRand)%12),
                        '</g>\n\n'
                    );
                    // update counts
                    ++_gen1Block.squareCount;
                    ++_gen1Block.complexityLevel;


                //rotated square bi direction
                } else if(shapeDesign == 6)
                {
                    // add to svg
                    scale = (width*100)/(4000);
                    svg = string.concat(
                        svg,
                        '<g id="shapeGroup_',
                        OZ.toString(i),
                        string.concat(
                            '" fill="',
                            _gen0Block.isDarkBlock && (tokenRand % 13 == 0) ? "#000" : _gen1Block.palette[(tokenRand+7)%4],
                            '" stroke="',
                            _gen1Block.palette[(tokenRand+8)%4]
                            ),
                        '" stroke-width="10" transform="translate(',
                        string.concat(addDecimalFromTheRight(200000-2000*(scale), 2), ', ', addDecimalFromTheRight(200000-2000*(scale), 2))
                    );
                    svg = string.concat(
                        svg,
                        ') scale(',
                        string.concat(addDecimalFromTheRight((scale), 2), ', ', addDecimalFromTheRight((scale), 2)),
                        ')" >\n',
                        getComplexShape(((tokenRand)%12)+12),
                        '</g>\n\n'
                    );
                    // update counts
                    ++_gen1Block.squareCount;
                    ++_gen1Block.complexityLevel;
                }
                // iterate to next shape
                ++i;

            // continue until all levels are complete
            } while (i<_gen1Block.numLevels);
        }

        // return final svg
        return string.concat(
            readSvgPiece(0),
            getTokenDataString(_tokenId, _tokenData, _gen0Block, _gen1Block),
            svg,
            // end shapes group and add token name
            readSvgPiece(2),
            _gen0Block.symmetryIndex == 5 ? readSvgPiece(3) : '',
            '\n\n</svg>' // close svg
        );
    }

    // get metadata for gen-1 block
    function blockToMetadata(IGBContract.TokenData memory _tokenData, IGen0Contract.GoodBlock memory _gen0Block, Gen1Block memory _gen1Block, string memory _tokenAttributes) private view returns(string memory)
    {
        // get attribute substring
        string[2] memory ogAttributes = cleanAttributes(_tokenAttributes);
        // begin metadata
        string memory metadata = string.concat(
            '{"trait_type": "Generations Unlocked", "value":',
            OZ.toString(_tokenData.highestGenLevel+1),
            '},{"trait_type": "Active Generation", "value":',
            OZ.toString(_tokenData.activeGen),
            '},{"trait_type": "Times Transferred", "value":"',
            ogAttributes[0],
            '"},{"trait_type": "Owned Since", "value":"',
            ogAttributes[1]
        );
        metadata = string.concat(
            metadata,
            '"},{"trait_type": "Color Group", "value":"',
            ColorGroupNames[_gen0Block.colorGroupIndex],
            '"},{"trait_type": "Palette Index", "value":"',
            OZ.toString(_gen0Block.paletteIndex),

            '{"trait_type": "Shape Count", "value":"',
            OZ.toString(_gen1Block.numLevels),
            '"},{"trait_type": "Circle Count", "value":"',
            OZ.toString(_gen1Block.circleCount),
            '"},{"trait_type": "Square Count", "value":"',
            OZ.toString(_gen1Block.squareCount),
            '"},{"trait_type": "None Count", "value":"',
            OZ.toString(_gen1Block.noneCount)
        );
        metadata = string.concat(
            metadata,
            '"},{"trait_type": "Complexity Level", "value":"',
            OZ.toString(_gen1Block.complexityLevel),
            '"},{"trait_type": "Glitchy", "value":"',
            _gen0Block.symmetryIndex == 5 ? "True" : "False",
            '"},{"trait_type": "Special Trait", "value":"',
            _gen0Block.isDarkBlock ? 'Do Good"}' : 'None"}'
        );
        // return metadata string
        return metadata;
    }

    // create token data string
    function getTokenDataString(uint256 _tokenId, IGBContract.TokenData memory _tokenData, IGen0Contract.GoodBlock memory _gen0Block, Gen1Block memory _gen1Block) private view returns(string memory)
    {
        // create name
        _gen1Block.name = string.concat(ColorGroupNames[_gen0Block.colorGroupIndex], ' #', OZ.toString(_tokenId));
        // begin token data string for token
        string memory tokenDataString = string.concat(
            OZ.toString(_tokenId),
            "|",
            _gen1Block.name,
            "|",
            OZ.toHexString(_tokenData.tokenOwner),
            "|",
            OZ.toString(_tokenData.ownedSince),
            "|",
            OZ.toString(_tokenData.timesTransferred),
            "|",
            OZ.toString(_tokenData.highestGenLevel),
            "|",
            OZ.toString(_tokenData.activeGen),
            "|",
            ColorGroupNames[_gen0Block.colorGroupIndex],
            "|",
            OZ.toString(_gen0Block.paletteIndex),
            "|"
        );
        tokenDataString = string.concat(
            tokenDataString,
            OZ.toString(_gen1Block.numLevels),
            "|",
            OZ.toString(_gen1Block.circleCount),
            "|",
            OZ.toString(_gen1Block.squareCount),
            "|",
            OZ.toString(_gen1Block.noneCount),
            "|",
            OZ.toString(_gen1Block.complexityLevel),
            "|",
            _gen0Block.symmetryIndex == 5 ? "true" : "false",
            "|",
            _gen0Block.isDarkBlock ? "Do Good" : "None",
            "|",
            _gen1Block.palette[0],
            "|",
            _gen1Block.palette[1],
            "|",
            _gen1Block.palette[2],
            "|",
            _gen1Block.palette[3]
        );
        // return token data string
        return tokenDataString;
    }

    // determine shape design
    function getShapeDesign(uint256 _seed, uint256 _limit) private pure returns(uint256)
    {
        // set shape weights
        uint8[7] memory ShapeDesignWeights = [50, 50, 50, 15, 15, 60, 60];
        // select a shape at random
        unchecked
        {
            uint256 index = 0;
            uint256 j = ShapeDesignWeights[0];
            uint256 i = random(string.concat("its a good day", OZ.toString(_seed*13), "to have a good day"))%_limit;
            while (j <= i)
            {
                ++index;
                j += ShapeDesignWeights[index];
            }
            return index;
        }
    }



    /*
        ██████  ██    ██ ██████  ██      ██  ██████     ████████  ██████   ██████  ██      ███████
        ██   ██ ██    ██ ██   ██ ██      ██ ██             ██    ██    ██ ██    ██ ██      ██     
        ██████  ██    ██ ██████  ██      ██ ██             ██    ██    ██ ██    ██ ██      ███████
        ██      ██    ██ ██   ██ ██      ██ ██             ██    ██    ██ ██    ██ ██           ██
        ██       ██████  ██████  ███████ ██  ██████        ██     ██████   ██████  ███████ ███████
    */

    // draw circle centered at (2000,2000)
    function drawCircle(uint256 _radius) public pure returns(string memory)
    {
        return string.concat(
            '<circle cx="2000" cy="2000" r="',
            OZ.toString(_radius),
            '"/>\n'
        );
    }

    // draw circle centered at (2000,2000)
    function drawSquare(uint256 _width) public pure returns(string memory)
    {
        uint256 o = 2000 - _width/2;
        string memory outputSVG = string.concat(
            '<rect x="',
            OZ.toString(o),
            '" y="',
            OZ.toString(o),
            '" width="',
            OZ.toString(_width),
            '" height="',
            OZ.toString(_width),
            '"/>\n'
        );
        return outputSVG;
    }

    // add decimal number from the right
    function addDecimalFromTheRight(uint256 _number, uint256 _sigFigs) public pure returns(string memory)
    {
        // get initial variables
        string memory numString = OZ.toString(_number);
        uint256 length = bytes(numString).length;
        bytes memory decimal = new bytes(_sigFigs);

        unchecked
        {
            // check if sig fig greater thant length (0 padded)
            if(_sigFigs > length)
            {
                uint256 i = _sigFigs-length;
                do
                {
                    if(i < _sigFigs-length)
                    {
                        decimal[i] = bytes("0")[0];
                    } else
                    {
                        decimal[i] = bytes(numString)[i-(_sigFigs-length)];
                    }
                    --i;
                } while(i>0);
                
                decimal[0] = "0";
                // return string
                return string.concat("0", ".", string(decimal));

            // sig figs is = length
            } else if(_sigFigs == length)
            {
                // return string
                return string.concat("0", ".", numString);
            
            // sig figs < length
            } else
            {
                uint256 wholeIndex;
                uint256 decimalIndex;
                uint256 i;
                bytes memory whole = new bytes(length-_sigFigs);
                do
                {
                    if(i < length-_sigFigs)
                    {
                        whole[wholeIndex] = bytes(numString)[i];
                        ++wholeIndex;
                    } else
                    {
                        decimal[decimalIndex] = bytes(numString)[i];
                        ++decimalIndex;
                    }
                    ++i;
                } while(i<length);
                
                // return string
                return string.concat(string(whole), ".", string(decimal));
            }   
        }
    }

    // get random number back
    function random(string memory _input) public pure returns (uint256)
    {
        return uint256(keccak256(abi.encodePacked(_input)));
    }

    // attribute data
    struct AttData
    {
        uint256 ownedStart;
        uint256 ownedEnd;
        uint256 ownedLength;
        uint256 transferStart;
        uint256 transferEnd;
        uint256 transferLength;
    }

    // funciton clean original attributes
    function cleanAttributes(string memory _attributes) public pure returns(string[2] memory)
    {
        uint256 i;
        bytes memory attBytes = bytes(_attributes);
        AttData memory attData;
        // get time owned attribute
        attData.ownedEnd = attBytes.length-3;
        for(i=attData.ownedEnd; i>0; --i)
        {
            if(attBytes[i] == bytes1('"'))
            {
                attData.ownedStart = i+1;
                attData.ownedLength = (attData.ownedEnd-attData.ownedStart+1);
                break;
            }
        }
        // get times transfrerred attribute
        attData.transferEnd = attData.ownedStart-43;
        for(i=attData.transferEnd; i>0; --i)
        {
            if(attBytes[i] == bytes1('"'))
            {
                attData.transferStart = i+1;
                attData.transferLength = (attData.transferEnd-attData.transferStart+1);
                break;
            }            
        }

        bytes memory timesTransferredBytes = new bytes(attData.transferLength);
        bytes memory ownedSinceBytes = new bytes(attData.ownedLength);
        
        for(i=0; i<attData.transferLength; i++)
        {
            timesTransferredBytes[i] = attBytes[attData.transferStart + i];
        }
        
        for(i=0; i<attData.ownedLength; i++)
        {
            ownedSinceBytes[i] = attBytes[attData.ownedStart + i];
        }

        // return attributes
        return [string(timesTransferredBytes), string(ownedSinceBytes)];
    }



    /*

        ██ ███    ██ ████████ ███████ ██████  ███████  █████   ██████ ███████     ███████ ████████ ██    ██ ███████ ███████ 
        ██ ████   ██    ██    ██      ██   ██ ██      ██   ██ ██      ██          ██         ██    ██    ██ ██      ██      
        ██ ██ ██  ██    ██    █████   ██████  █████   ███████ ██      █████       ███████    ██    ██    ██ █████   █████   
        ██ ██  ██ ██    ██    ██      ██   ██ ██      ██   ██ ██      ██               ██    ██    ██    ██ ██      ██      
        ██ ██   ████    ██    ███████ ██   ██ ██      ██   ██  ██████ ███████     ███████    ██     ██████  ██      ██

    */

    // interface contracts
    IGBContract private GBTokenContract = IGBContract(address(0x29B4Ea6B1164C7cd8A3a0a1dc4ad88d1E0589124));
    IGen0Contract private Gen0Contract = IGen0Contract(address(0xAd77f8106d1E4891be0428133f35F78977671F2F));
    
    // set contract addresses
    function setInterfaceAddresses(address[2] memory _newAddresses) external onlyOwner
    {
        GBTokenContract = IGBContract(_newAddresses[0]);
        Gen0Contract = IGen0Contract(_newAddresses[1]);    
    } 



    /*
  
         ██████  ██     ██ ███    ██ ███████ ██████      ███████ ██   ██ ██ ███████ 
        ██    ██ ██     ██ ████   ██ ██      ██   ██     ██      ██   ██ ██    ███  
        ██    ██ ██  █  ██ ██ ██  ██ █████   ██████      ███████ ███████ ██   ███   
        ██    ██ ██ ███ ██ ██  ██ ██ ██      ██   ██          ██ ██   ██ ██  ███    
         ██████   ███ ███  ██   ████ ███████ ██   ██     ███████ ██   ██ ██ ███████
  
    */

    // construct that thing
    constructor()
    {
        ContractOwner = msg.sender;
    }

    // contract owner 
    address private ContractOwner;

    // only owner modifier
    function _onlyOwner() private view
    {
        if(msg.sender != ContractOwner) revert YoureNotTheOwnerHomie();
    }
    modifier onlyOwner()
    {
        _onlyOwner();
        _;
    }

    // transfer contract ownership
    function transferOwnership(address _newOwner) external onlyOwner
    {
        ContractOwner = _newOwner;
    }

    // if youre reading this, make a goodblocks collage with all our tokens
}


// interface for the goodblocks contract
interface IGBContract
{
    struct TokenData
    {
        uint8 activeGen;
        uint8 highestGenLevel;
        uint64 timesTransferred;
        uint64 ownedSince;
        address tokenOwner;
    }
    function ownerOf(uint256 _tokenId) external view returns(address);
    function getTokenData(uint256 _tokenId) external view returns (TokenData memory);
}

// interface for the gen-0 contract
interface IGen0Contract
{
    struct GoodBlock
    {
        uint8 pixelSizeIndex;
        uint8 symmetryIndex;
        uint8 colorGroupIndex;
        uint8 paletteIndex;
        bool isDarkBlock; 
        uint16 tokenIndex;
        bytes3 labelColor;
        string blockDNA;
    }
    
    function tokenToGoodblock(uint256 _tokenId) external view returns(GoodBlock memory);
}



/*

        ██      ██ ██████  ██████   █████  ██████  ██ ███████ ███████ 
        ██      ██ ██   ██ ██   ██ ██   ██ ██   ██ ██ ██      ██      
        ██      ██ ██████  ██████  ███████ ██████  ██ █████   ███████ 
        ██      ██ ██   ██ ██   ██ ██   ██ ██   ██ ██ ██           ██ 
        ███████ ██ ██████  ██   ██ ██   ██ ██   ██ ██ ███████ ███████

        using OpenZeppelin Strings and Base64 contracts

    */

library OZ
{
    // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;
    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256)
    {
        uint256 result = 0;
        unchecked
        {
            if (value >= 10**64)
            {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32)
            {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16)
            {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8)
            {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4)
            {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2)
            {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1)
            {
                result += 1;
            }
        }
        return result;
    }
    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory)
    {
        unchecked
        {
            uint256 length = log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly
            {
                ptr := add(buffer, add(32, length))
            }
            while (true)
            {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly
                {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }
    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory)
    {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i)
        {
            buffer[i] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }


    // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory)
    {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        /// @solidity memory-safe-assembly
        assembly
        {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for
            {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr)
            {

            }
            {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1
            {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2
            {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }
        return result;
    }
}

File 2 of 3 : Bytecode.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


library Bytecode {
  error InvalidCodeAtRange(uint256 _size, uint256 _start, uint256 _end);

  /**
    @notice Generate a creation code that results on a contract with `_code` as bytecode
    @param _code The returning value of the resulting `creationCode`
    @return creationCode (constructor) for new contract
  */
  function creationCodeFor(bytes memory _code) internal pure returns (bytes memory) {
    /*
      0x00    0x63         0x63XXXXXX  PUSH4 _code.length  size
      0x01    0x80         0x80        DUP1                size size
      0x02    0x60         0x600e      PUSH1 14            14 size size
      0x03    0x60         0x6000      PUSH1 00            0 14 size size
      0x04    0x39         0x39        CODECOPY            size
      0x05    0x60         0x6000      PUSH1 00            0 size
      0x06    0xf3         0xf3        RETURN
      <CODE>
    */

    return abi.encodePacked(
      hex"63",
      uint32(_code.length),
      hex"80_60_0E_60_00_39_60_00_F3",
      _code
    );
  }

  /**
    @notice Returns the size of the code on a given address
    @param _addr Address that may or may not contain code
    @return size of the code on the given `_addr`
  */
  function codeSize(address _addr) internal view returns (uint256 size) {
    assembly { size := extcodesize(_addr) }
  }

  /**
    @notice Returns the code of a given address
    @dev It will fail if `_end < _start`
    @param _addr Address that may or may not contain code
    @param _start number of bytes of code to skip on read
    @param _end index before which to end extraction
    @return oCode read from `_addr` deployed bytecode

    Forked from: https://gist.github.com/KardanovIR/fe98661df9338c842b4a30306d507fbd
  */
  function codeAt(address _addr, uint256 _start, uint256 _end) internal view returns (bytes memory oCode) {
    uint256 csize = codeSize(_addr);
    if (csize == 0) return bytes("");

    if (_start > csize) return bytes("");
    if (_end < _start) revert InvalidCodeAtRange(csize, _start, _end); 

    unchecked {
      uint256 reqSize = _end - _start;
      uint256 maxSize = csize - _start;

      uint256 size = maxSize < reqSize ? maxSize : reqSize;

      assembly {
        // allocate output byte array - this could also be done without assembly
        // by using o_code = new bytes(size)
        oCode := mload(0x40)
        // new "memory end" including padding
        mstore(0x40, add(oCode, and(add(add(size, 0x20), 0x1f), not(0x1f))))
        // store length in memory
        mstore(oCode, size)
        // actually retrieve the code, this needs assembly
        extcodecopy(_addr, add(oCode, 0x20), _start, size)
      }
    }
  }
}

File 3 of 3 : SSTORE2.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./Bytecode.sol";

/**
  @title A key-value storage with auto-generated keys for storing chunks of data with a lower write & read cost.
  @author Agustin Aguilar <[email protected]>

  Readme: https://github.com/0xsequence/sstore2#readme
*/
library SSTORE2 {
  error WriteError();

  /**
    @notice Stores `_data` and returns `pointer` as key for later retrieval
    @dev The pointer is a contract address with `_data` as code
    @param _data to be written
    @return pointer Pointer to the written `_data`
  */
  function write(bytes memory _data) internal returns (address pointer) {
    // Append 00 to _data so contract can't be called
    // Build init code
    bytes memory code = Bytecode.creationCodeFor(
      abi.encodePacked(
        hex'00',
        _data
      )
    );

    // Deploy contract using create
    assembly { pointer := create(0, add(code, 32), mload(code)) }

    // Address MUST be non-zero
    if (pointer == address(0)) revert WriteError();
  }

  /**
    @notice Reads the contents of the `_pointer` code as data, skips the first byte 
    @dev The function is intended for reading pointers generated by `write`
    @param _pointer to be read
    @return data read from `_pointer` contract
  */
  function read(address _pointer) internal view returns (bytes memory) {
    return Bytecode.codeAt(_pointer, 1, type(uint256).max);
  }

  /**
    @notice Reads the contents of the `_pointer` code as data, skips the first byte 
    @dev The function is intended for reading pointers generated by `write`
    @param _pointer to be read
    @param _start number of bytes to skip
    @return data read from `_pointer` contract
  */
  function read(address _pointer, uint256 _start) internal view returns (bytes memory) {
    return Bytecode.codeAt(_pointer, _start + 1, type(uint256).max);
  }

  /**
    @notice Reads the contents of the `_pointer` code as data, skips the first byte 
    @dev The function is intended for reading pointers generated by `write`
    @param _pointer to be read
    @param _start number of bytes to skip
    @param _end index before which to end extraction
    @return data read from `_pointer` contract
  */
  function read(address _pointer, uint256 _start, uint256 _end) internal view returns (bytes memory) {
    return Bytecode.codeAt(_pointer, _start + 1, _end + 1);
  }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"GottaUnlockGen1Please","type":"error"},{"inputs":[{"internalType":"uint256","name":"_size","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"InvalidCodeAtRange","type":"error"},{"inputs":[],"name":"WriteError","type":"error"},{"inputs":[],"name":"YooooThatTokenIdIsWayTooHigh","type":"error"},{"inputs":[],"name":"YoureNotTheOwnerHomie","type":"error"},{"inputs":[{"internalType":"uint256","name":"_shapeIndex","type":"uint256"},{"internalType":"uint256","name":"_pointerIndex","type":"uint256"},{"internalType":"address","name":"_pointer","type":"address"}],"name":"addComplexShapePointer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shapeIndex","type":"uint256"},{"internalType":"string","name":"_string","type":"string"}],"name":"addComplexShapeString","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_number","type":"uint256"},{"internalType":"uint256","name":"_sigFigs","type":"uint256"}],"name":"addDecimalFromTheRight","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"_attributes","type":"string"}],"name":"cleanAttributes","outputs":[{"internalType":"string[2]","name":"","type":"string[2]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_radius","type":"uint256"}],"name":"drawCircle","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_width","type":"uint256"}],"name":"drawSquare","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shapeIndex","type":"uint256"}],"name":"getComplexShape","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTokenSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_input","type":"string"}],"name":"random","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"readSvgPiece","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shapeIndex","type":"uint256"}],"name":"resetComplexShapePointers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[2]","name":"_newAddresses","type":"address[2]"}],"name":"setInterfaceAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"string","name":"_string","type":"string"}],"name":"setSvgPiece","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenMetadata","type":"string"},{"internalType":"string","name":"_tokenAttributes","type":"string"}],"name":"tokenGenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_string","type":"string"}],"name":"writeString","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060e001604052806040518060400160405280600381526020017f4a6f79000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4e6967687400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f436f736d6f73000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f456172746800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f417263746963000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f536572656e69747900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5477696c696768740000000000000000000000000000000000000000000000008152508152506020906007620001bc9291906200398c565b5060405180610700016040528060405180608001604052806040518060400160405280600781526020017f234644464638460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234138454345370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234634424545450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2344343741453800000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234644364639360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646454241310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233935444143310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2336463639414300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646444636420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646373943440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234141324545360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2332333034394400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233935453144330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234541464644300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234643453338410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346463735413000000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646434332390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234635383633340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233030373936350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2330304146393100000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233939384345420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233737453444340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234234464539380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346424634364400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234545454545450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233737443937300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233137323737340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346463030373500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233030354639390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646343439460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646463542370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2330304541443300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233042304230440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233437344135360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233932394141420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2344334435464400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233037303331410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233446384138420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234231423439330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346464342373400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233245334136330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233636354338340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233731413041350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346414239354200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233030303030300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233232363038390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233435393241460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345334334413800000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233142314633410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233533333534410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234136343934320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346463738343400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233161316131610000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233135334234340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233244364537450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2343364445343100000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233046304133430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233037343536460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233030394639440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2343444646454200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233133303032360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233830313333360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234337324334310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345453435343000000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233131314435450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234337303033390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234633373132310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2343304532313800000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233032333833430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233233303333380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234544353130370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2343373044334100000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233033433441310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234336324138380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233539303939350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2331353034383500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233030413843430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233030353038320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233030303833390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346464134314200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234539343536300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233046333436300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233136323133450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2331413141324500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234432464146420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234645333436450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233531324235380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2332433030334500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233730364336310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234531463446330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646464646460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2333333333333300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234641463746320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233242423343300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233136314332450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345463643333500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646464245390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234533434141350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234345414239330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2341443842373300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234130394635370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234335363832340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234346423738340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345414445423800000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234533443042390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234531424339310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234331393237370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2336323935394300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234539433839310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233841383633350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234145343331450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2344303632323400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233833423538320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234436453441410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646464643350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346304444393200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233330334532370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234234424237320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234537454141380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346364641463700000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234138383936430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234631453841370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234145443039450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2336314232393200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234634444642410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234545433337330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234341393635430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2338373634343500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233432433246460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233835463446460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234238464646390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345464646464400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234538463046320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234132444246410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233339413244420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2330353337343200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233345363446460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233545444646460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234232464346460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345434643464600000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234431464646410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233441413941460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233345333141450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2331433232364200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234637463346330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234331454146320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233543433246320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2331393142413900000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234633463346330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233330333834310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233341343735300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2332313835443500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233736394643440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234239443745410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234436453646320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346374642464300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233344364342390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233030443146460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233030464646300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346414641463600000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233939464546460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233934444146460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233934423346440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2342393833464600000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234535373037450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234536423536360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234538453941310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2341334444434200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233638393244350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233739443143330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234339464444370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346384643464200000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233643354237420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234330364338340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234636373238300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346384231393500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233330343735450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234241364235370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234631393335430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2345374232413500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646454244330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233236344537300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233637393138360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346464234414300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233644444343460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233934454243440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646454641310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346464342393100000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234438454646300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234230453041380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234630463639460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346334331433600000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233335343737440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233643354237420000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234330364338340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346363732383000000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234636433036350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233535423342310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234146303036390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2330393031354600000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233437304432310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233943304634380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234436374433450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346394534443400000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f233030314635320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234131303035340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234646384436380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2346464543424100000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646364330300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234130323034430000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233233313033410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2332383244344600000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646463942320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234543414335440000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234232343038300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2333463037313300000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234646453938410000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234338343737310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f233631313035450000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2332383042343500000000000000000000000000000000000000000000000000815250815250815260200160405180608001604052806040518060400160405280600781526020017f234544453836320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234641393835360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f234632373337300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2332323535394300000000000000000000000000000000000000000000000000815250815250815250602790603862003889929190620039df565b507329b4ea6b1164c7cd8a3a0a1dc4ad88d1e058912461010b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ad77f8106d1e4891be0428133f35f78977671f2f61010c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200394357600080fd5b503361010d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062003eed565b8260078101928215620039cc579160200282015b82811115620039cb578251829081620039ba919062003e06565b5091602001919060010190620039a0565b5b509050620039db919062003a37565b5090565b826038600402810192821562003a24579160200282015b8281111562003a235782518290600462003a1292919062003a5f565b5091602001919060040190620039f6565b5b50905062003a33919062003ab2565b5090565b5b8082111562003a5b576000818162003a51919062003ada565b5060010162003a38565b5090565b826004810192821562003a9f579160200282015b8281111562003a9e57825182908162003a8d919062003e06565b509160200191906001019062003a73565b5b50905062003aae919062003a37565b5090565b5b8082111562003ad6576000818162003acc919062003b20565b5060040162003ab3565b5090565b50805462003ae89062003bf5565b6000825580601f1062003afc575062003b1d565b601f01602090049060005260206000209081019062003b1c919062003b6d565b5b50565b506000818162003b31919062003ada565b506001016000818162003b45919062003ada565b506001016000818162003b59919062003ada565b50600101600062003b6b919062003ada565b565b5b8082111562003b8857600081600090555060010162003b6e565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062003c0e57607f821691505b60208210810362003c245762003c2362003bc6565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262003c8e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262003c4f565b62003c9a868362003c4f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062003ce762003ce162003cdb8462003cb2565b62003cbc565b62003cb2565b9050919050565b6000819050919050565b62003d038362003cc6565b62003d1b62003d128262003cee565b84845462003c5c565b825550505050565b600090565b62003d3262003d23565b62003d3f81848462003cf8565b505050565b5b8181101562003d675762003d5b60008262003d28565b60018101905062003d45565b5050565b601f82111562003db65762003d808162003c2a565b62003d8b8462003c3f565b8101602085101562003d9b578190505b62003db362003daa8562003c3f565b83018262003d44565b50505b505050565b600082821c905092915050565b600062003ddb6000198460080262003dbb565b1980831691505092915050565b600062003df6838362003dc8565b9150826002028217905092915050565b62003e118262003b8c565b67ffffffffffffffff81111562003e2d5762003e2c62003b97565b5b62003e39825462003bf5565b62003e4682828562003d6b565b600060209050601f83116001811462003e7e576000841562003e69578287015190505b62003e75858262003de8565b86555062003ee5565b601f19841662003e8e8662003c2a565b60005b8281101562003eb85784890151825560018201915060208501945060208101905062003e91565b8683101562003ed8578489015162003ed4601f89168262003dc8565b8355505b6001600288020188555050505b505050505050565b615a878062003efd6000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063a0a93f0711610097578063d2e1e30911610066578063d2e1e3091461031d578063dd20620214610339578063e4fbf23a14610369578063f2fde38b1461038557610100565b8063a0a93f071461025d578063c379dc431461028d578063c382a04b146102bd578063c7ab2dbc146102ed57610100565b8063373e3526116100d3578063373e3526146101b157806367462265146101e15780637f4f479114610211578063952178261461024157610100565b806311b315421461010557806322b8d04414610135578063321d8bb91461016557806336e10fa014610181575b600080fd5b61011f600480360381019061011a919061354e565b6103a1565b60405161012c91906136cc565b60405180910390f35b61014f600480360381019061014a919061354e565b6107b5565b60405161015c9190613707565b60405180910390f35b61017f600480360381019061017a919061374e565b6107e8565b005b61019b600480360381019061019691906137aa565b61087b565b6040516101a89190613821565b60405180910390f35b6101cb60048036038101906101c69190613843565b6108ef565b6040516101d89190613821565b60405180910390f35b6101fb60048036038101906101f691906137aa565b610cb1565b6040516102089190613821565b60405180910390f35b61022b600480360381019061022691906137aa565b610cf9565b6040516102389190613821565b60405180910390f35b61025b60048036038101906102569190613997565b610e39565b005b610277600480360381019061027291906137aa565b610ef8565b6040516102849190613821565b60405180910390f35b6102a760048036038101906102a291906139c4565b610f29565b6040516102b49190613821565b60405180910390f35b6102d760048036038101906102d2919061374e565b6111bb565b6040516102e49190613a5e565b60405180910390f35b610307600480360381019061030291906137aa565b611261565b6040516103149190613821565b60405180910390f35b610337600480360381019061033291906137aa565b611446565b005b610353600480360381019061034e919061354e565b611475565b6040516103609190613a5e565b60405180910390f35b610383600480360381019061037e9190613a79565b61148f565b005b61039f600480360381019061039a9190613acc565b61150f565b005b6103a96132d7565b6000808390506103b76132fe565b600382516103c59190613b28565b816020018181525050806020015192505b60008311156104bc577f22000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191682848151811061043557610434613b5c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036104ab576001836104749190613b8b565b8160000181815250506001816000015182602001516104939190613b28565b61049d9190613b8b565b8160400181815250506104bc565b826104b590613bbf565b92506103d6565b602b81600001516104cd9190613b28565b816080018181525050806080015192505b60008311156105c4577f22000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191682848151811061053d5761053c613b5c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036105b35760018361057c9190613b8b565b81606001818152505060018160600151826080015161059b9190613b28565b6105a59190613b8b565b8160a00181815250506105c4565b826105bd90613bbf565b92506104de565b60008160a0015167ffffffffffffffff8111156105e4576105e3613423565b5b6040519080825280601f01601f1916602001820160405280156106165781602001600182028036833780820191505090505b5090506000826040015167ffffffffffffffff81111561063957610638613423565b5b6040519080825280601f01601f19166020018201604052801561066b5781602001600182028036833780820191505090505b509050600094505b8260a0015185101561070157838584606001516106909190613b8b565b815181106106a1576106a0613b5c565b5b602001015160f81c60f81b8286815181106106bf576106be613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535084806106f990613be8565b955050610673565b600094505b826040015185101561079457838584600001516107239190613b8b565b8151811061073457610733613b5c565b5b602001015160f81c60f81b81868151811061075257610751613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350848061078c90613be8565b955050610706565b60405180604001604052808381526020018281525095505050505050919050565b6000816040516020016107c89190613c6c565b6040516020818303038152906040528051906020012060001c9050919050565b6107f061155c565b60006107fb826115e6565b90506000836020811061081157610810613b5c565b5b01600001819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6060600060028361088c9190613cb2565b6107d06108999190613b28565b905060006108a68261168a565b6108af8361168a565b6108b88661168a565b6108c18761168a565b6040516020016108d49493929190613da1565b60405160208183030381529060405290508092505050919050565b606060006108fc8461168a565b905060008151905060008467ffffffffffffffff8111156109205761091f613423565b5b6040519080825280601f01601f1916602001820160405280156109525781602001600182028036833780820191505090505b50905081851115610b0d57600082860390505b828603811015610a0a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152506000815181106109b8576109b7613b5c565b5b602001015160f81c60f81b8282815181106109d6576109d5613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610a6f565b83838703820381518110610a2157610a20613b5c565b5b602001015160f81c60f81b828281518110610a3f57610a3e613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b8060019003905060008111610965577f300000000000000000000000000000000000000000000000000000000000000082600081518110610ab357610ab2613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081604051602001610af39190613e76565b604051602081830303815290604052945050505050610cab565b818503610b3e5782604051602001610b259190613e76565b6040516020818303038152906040529350505050610cab565b60008060008088860367ffffffffffffffff811115610b6057610b5f613423565b5b6040519080825280601f01601f191660200182016040528015610b925781602001600182028036833780820191505090505b5090505b888603821015610c0b57868281518110610bb357610bb2613b5c565b5b602001015160f81c60f81b818581518110610bd157610bd0613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350836001019350610c72565b868281518110610c1e57610c1d613b5c565b5b602001015160f81c60f81b858481518110610c3c57610c3b613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508260010192505b816001019150858210610b96578085604051602001610c92929190613eab565b6040516020818303038152906040529750505050505050505b92915050565b6060610cf26101078360048110610ccb57610cca613b5c565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611758565b9050919050565b60606000808360208110610d1057610d0f613b5c565b5b016000018054905003610d3457604051806020016040528060008152509050610e34565b600060606000808560208110610d4d57610d4c613b5c565b5b01600001805480602002602001604051908101604052809291908181526020018280548015610dd157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610d87575b505050505090505b81610dfd828581518110610df057610def613b5c565b5b6020026020010151611758565b604051602001610e0e929190613ede565b604051602081830303815290604052915082600101925080518310610dd9578193505050505b919050565b610e4161155c565b80600060028110610e5557610e54613b5c565b5b602002015161010b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160028110610eaf57610eae613b5c565b5b602002015161010c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060610f038261168a565b604051602001610f139190613f28565b6040516020818303038152906040529050919050565b6060612058841115610f67576040517f4621ae1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b09afec1866040518263ffffffff1660e01b8152600401610fc59190613707565b60a060405180830381865afa158015610fe2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110069190614081565b90506001816020015160ff16101561104a576040517fb14f83d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166307160cf5876040518263ffffffff1660e01b81526004016110a89190613707565b600060405180830381865afa1580156110c5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ee91906142ce565b905060006110fd87848461178d565b9050600061110d84848489611924565b905060006020846040015160ff166007811061112c5761112b613b5c565b5b016111368a61168a565b60405180610120016040528060e6815260200161592c60e691398a8561115f8860e00151611b7a565b60405160200161117496959493929190614565565b604051602081830303815290604052905061118e81611b7a565b60405160200161119e9190614648565b604051602081830303815290604052955050505050509392505050565b60006111c561155c565b6111ce826115e6565b61010784600481106111e3576111e2613b5c565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610107836004811061123757611236613b5c565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b606061205882111561129f576040517f4621ae1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b09afec1846040518263ffffffff1660e01b81526004016112fd9190613707565b60a060405180830381865afa15801561131a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133e9190614081565b90506001816020015160ff161015611382576040517fb14f83d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166307160cf5856040518263ffffffff1660e01b81526004016113e09190613707565b600060405180830381865afa1580156113fd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061142691906142ce565b9050600061143585848461178d565b90508060e001519350505050919050565b61144e61155c565b6000816020811061146257611461613b5c565b5b0160000160006114729190613334565b50565b600061147f61155c565b611488826115e6565b9050919050565b61149761155c565b80600084602081106114ac576114ab613b5c565b5b0160000183815481106114c2576114c1613b5c565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b61151761155c565b8061010d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61010d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f8e2aa84b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600080611611836040516020016115fd91906146e1565b604051602081830303815290604052611cdd565b90508051602082016000f09150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611684576040517f08d4abb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50919050565b60606000600161169984611d09565b01905060008167ffffffffffffffff8111156116b8576116b7613423565b5b6040519080825280601f01601f1916602001820160405280156116ea5781602001600182028036833780820191505090505b509050600082602001820190505b60011561174d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161174157611740613c83565b5b049450600085036116f8575b819350505050919050565b60606117868260017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611e5c565b9050919050565b611795613355565b61179d613355565b60006117a88661168a565b9050600560046117d6836040516020016117c29190614775565b6040516020818303038152906040526107b5565b816117e4576117e3613c83565b5b06018260000181815250508160000151610bb88161180557611804613c83565b5b0482602001818152505060006027856060015160088760400151020160ff166038811061183557611834613b5c565b5b60040201600480602002604051908101604052809291906000905b828210156118f35783820180546118669061436c565b80601f01602080910402602001604051908101604052809291908181526020018280546118929061436c565b80156118df5780601f106118b4576101008083540402835291602001916118df565b820191906000526020600020905b8154815290600101906020018083116118c257829003601f168201915b505050505081526020019060010190611850565b505050509050808361012001819052505061191086868685611f41565b8260e0018190525081925050509392505050565b60606000611931836103a1565b90506000611951600188602001516119499190614797565b60ff1661168a565b611961886000015160ff1661168a565b8360006002811061197557611974613b5c565b5b60200201518460016002811061198e5761198d613b5c565b5b60200201516040516020016119a69493929190614994565b6040516020818303038152906040529050806020876040015160ff16600781106119d3576119d2613b5c565b5b016119e4886060015160ff1661168a565b6119f1886000015161168a565b6119fe896040015161168a565b611a0b8a6060015161168a565b611a188b6080015161168a565b604051602001611a2e9796959493929190614caa565b604051602081830303815290604052905080611a4d8660a0015161168a565b6005886020015160ff1614611a97576040518060400160405280600581526020017f46616c7365000000000000000000000000000000000000000000000000000000815250611ace565b6040518060400160405280600481526020017f54727565000000000000000000000000000000000000000000000000000000008152505b8860800151611b12576040518060400160405280600681526020017f4e6f6e65227d0000000000000000000000000000000000000000000000000000815250611b49565b6040518060400160405280600981526020017f446f20476f6f64227d00000000000000000000000000000000000000000000008152505b604051602001611b5c9493929190614ea7565b60405160208183030381529060405290508092505050949350505050565b60606000825103611b9c57604051806020016040528060008152509050611cd8565b6000604051806060016040528060408152602001615a126040913990506000600360028551611bcb9190613b8b565b611bd59190613cb2565b6004611be19190614f06565b67ffffffffffffffff811115611bfa57611bf9613423565b5b6040519080825280601f01601f191660200182016040528015611c2c5781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015611c98576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050611c3d565b5050600386510660018114611cb45760028114611cc757611ccf565b603d6001830353603d6002830353611ccf565b603d60018303535b50505080925050505b919050565b6060815182604051602001611cf3929190615026565b6040516020818303038152906040529050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611d67577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611d5d57611d5c613c83565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611da4576d04ee2d6d415b85acef81000000008381611d9a57611d99613c83565b5b0492506020810190505b662386f26fc100008310611dd357662386f26fc100008381611dc957611dc8613c83565b5b0492506010810190505b6305f5e1008310611dfc576305f5e1008381611df257611df1613c83565b5b0492506008810190505b6127108310611e21576127108381611e1757611e16613c83565b5b0492506004810190505b60648310611e445760648381611e3a57611e39613c83565b5b0492506002810190505b600a8310611e53576001810190505b80915050919050565b60606000611e6985612c69565b905060008103611e8b5760405180602001604052806000815250915050611f3a565b80841115611eab5760405180602001604052806000815250915050611f3a565b83831015611ef4578084846040517f2c4a89fa000000000000000000000000000000000000000000000000000000008152600401611eeb93929190615064565b60405180910390fd5b60008484039050600085830390506000828210611f115782611f13565b815b90506040519450601f19601f60208301011685016040528085528087602087018a3c505050505b9392505050565b6060600080600080600080611f566001610cb1565b60058a6020015160ff1614611fa0576040518060400160405280600381526020017f3e0a0a0000000000000000000000000000000000000000000000000000000000815250611fd7565b6040518060400160405280601981526020017f2066696c7465723d2275726c2823676c6974636829223e0a0a000000000000008152505b8a6080015161200357896101200151600060048110611ff957611ff8613b5c565b5b602002015161203a565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b60058c6020015160ff1614612084576040518060400160405280600381526020017f3e0a0a00000000000000000000000000000000000000000000000000000000008152506120bb565b6040518060400160405280601881526020017f2066696c7465723d2275726c28236e6f69736529223e0a0a00000000000000008152505b6040516020016120ce9493929190615159565b60405160208183030381529060405290505b60018201600d8c0102935060018860a0015111806120fe5750600582115b156121155761210e846096612c74565b9450612124565b6121218461012c612c74565b94505b8188600001510388602001510295506000850361214f57876080018051600101908181525050612bd5565b6001850361227857806121618361168a565b8a60800151801561218357506000600d87816121805761217f613c83565b5b06145b6121bd57896101200151600460018801816121a1576121a0613c83565b5b06600481106121b3576121b2613b5c565b5b60200201516121f4565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a61012001516004600289018161220e5761220d613c83565b5b06600481106122205761221f613b5c565b5b602002015161223f60028b8161223957612238613c83565b5b04610ef8565b60405160200161225395949392919061527e565b6040516020818303038152906040529050876040018051600101908181525050612bd4565b60028503612390578061228a8361168a565b8a6080015180156122ac57506000600d87816122a9576122a8613c83565b5b06145b6122e6578961012001516004600a8801816122ca576122c9613c83565b5b06600481106122dc576122db613b5c565b5b602002015161231d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a61012001516004600b89018161233757612336613c83565b5b066004811061234957612348613b5c565b5b60200201516123578a61087b565b60405160200161236b95949392919061527e565b6040516020818303038152906040529050876060018051600101908181525050612bd3565b600385036125a057610fa060648702816123ad576123ac613c83565b5b049250806123ba8361168a565b8a6080015180156123dc57506000600d87816123d9576123d8613c83565b5b06145b61241657896101200151600460038801816123fa576123f9613c83565b5b066004811061240c5761240b613b5c565b5b602002015161244d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160048089018161246657612465613c83565b5b066004811061247857612477613b5c565b5b602002015160405160200161248e929190615314565b6040516020818303038152906040526124b1866107d00262030d400360026108ef565b6124c5876107d00262030d400360026108ef565b6040516020016124d692919061537c565b6040516020818303038152906040526040516020016124f89493929190615421565b6040516020818303038152906040529050806125158460026108ef565b6125208560026108ef565b60405160200161253192919061537c565b60405160208183030381529060405261255a600c878161255457612553613c83565b5b06610cf9565b60405160200161256c939291906154c5565b60405160208183030381529060405290508760400180516001019081815250508760a0018051600101908181525050612bd2565b600485036127b057610fa060648702816125bd576125bc613c83565b5b049250806125ca8361168a565b8a6080015180156125ec57506000600d87816125e9576125e8613c83565b5b06145b612626578961012001516004600388018161260a57612609613c83565b5b066004811061261c5761261b613b5c565b5b602002015161265d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160048089018161267657612675613c83565b5b066004811061268857612687613b5c565b5b602002015160405160200161269e929190615314565b6040516020818303038152906040526126c1866107d00262030d400360026108ef565b6126d5876107d00262030d400360026108ef565b6040516020016126e692919061537c565b6040516020818303038152906040526040516020016127089493929190615421565b6040516020818303038152906040529050806127258460026108ef565b6127308560026108ef565b60405160200161274192919061537c565b60405160208183030381529060405261276a600c878161276457612763613c83565b5b06610cf9565b60405160200161277c939291906154c5565b60405160208183030381529060405290508760600180516001019081815250508760a0018051600101908181525050612bd1565b600585036129c057610fa060648702816127cd576127cc613c83565b5b049250806127da8361168a565b8a6080015180156127fc57506000600d87816127f9576127f8613c83565b5b06145b612836578961012001516004600388018161281a57612819613c83565b5b066004811061282c5761282b613b5c565b5b602002015161286d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160048089018161288657612885613c83565b5b066004811061289857612897613b5c565b5b60200201516040516020016128ae929190615314565b6040516020818303038152906040526128d1866107d00262030d400360026108ef565b6128e5876107d00262030d400360026108ef565b6040516020016128f692919061537c565b6040516020818303038152906040526040516020016129189493929190615421565b6040516020818303038152906040529050806129358460026108ef565b6129408560026108ef565b60405160200161295192919061537c565b60405160208183030381529060405261297a600c878161297457612973613c83565b5b06610cf9565b60405160200161298c939291906154c5565b60405160208183030381529060405290508760600180516001019081815250508760a0018051600101908181525050612bd0565b60068503612bcf57610fa060648702816129dd576129dc613c83565b5b049250806129ea8361168a565b8a608001518015612a0c57506000600d8781612a0957612a08613c83565b5b06145b612a465789610120015160046007880181612a2a57612a29613c83565b5b0660048110612a3c57612a3b613b5c565b5b6020020151612a7d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160046008890181612a9757612a96613c83565b5b0660048110612aa957612aa8613b5c565b5b6020020151604051602001612abf929190615314565b604051602081830303815290604052612ae2866107d00262030d400360026108ef565b612af6876107d00262030d400360026108ef565b604051602001612b0792919061537c565b604051602081830303815290604052604051602001612b299493929190615421565b604051602081830303815290604052905080612b468460026108ef565b612b518560026108ef565b604051602001612b6292919061537c565b604051602081830303815290604052612b8d600c808881612b8657612b85613c83565b5b0601610cf9565b604051602001612b9f939291906154c5565b60405160208183030381529060405290508760600180516001019081815250508760a00180516001019081815250505b5b5b5b5b5b5b816001019150876000015182106120e057612bf06000610cb1565b612bfc8c8c8c8c612d6f565b82612c076002610cb1565b60058d6020015160ff1614612c2b5760405180602001604052806000815250612c36565b612c356003610cb1565b5b604051602001612c4a959493929190615549565b6040516020818303038152906040529650505050505050949350505050565b6000813b9050919050565b6000806040518060e00160405280603260ff168152602001603260ff168152602001603260ff168152602001600f60ff168152602001600f60ff168152602001603c60ff168152602001603c60ff16815250905060008082600060078110612cdf57612cde613b5c565b5b602002015160ff169050600085612d1f612cfb600d8a0261168a565b604051602001612d0b91906155ef565b6040516020818303038152906040526107b5565b81612d2d57612d2c613c83565b5b0690505b808211612d6257826001019250838360078110612d5157612d50613b5c565b5b602002015160ff1682019150612d31565b8294505050505092915050565b60606020836040015160ff1660078110612d8c57612d8b613b5c565b5b01612d968661168a565b604051602001612da7929190615624565b6040516020818303038152906040528261010001819052506000612dca8661168a565b836101000151612ddd876080015161306e565b612df4886060015167ffffffffffffffff1661168a565b612e0b896040015167ffffffffffffffff1661168a565b612e1b8a6020015160ff1661168a565b612e2b8b6000015160ff1661168a565b60208b6040015160ff1660078110612e4657612e45613b5c565b5b01612e578c6060015160ff1661168a565b604051602001612e6f9998979695949392919061567d565b604051602081830303815290604052905080612e8e846000015161168a565b612e9b856040015161168a565b612ea8866060015161168a565b612eb5876080015161168a565b612ec28860a0015161168a565b60058a6020015160ff1614612f0c576040518060400160405280600581526020017f66616c7365000000000000000000000000000000000000000000000000000000815250612f43565b6040518060400160405280600481526020017f74727565000000000000000000000000000000000000000000000000000000008152505b8a60800151612f87576040518060400160405280600481526020017f4e6f6e6500000000000000000000000000000000000000000000000000000000815250612fbe565b6040518060400160405280600781526020017f446f20476f6f64000000000000000000000000000000000000000000000000008152505b8a6101200151600060048110612fd757612fd6613b5c565b5b60200201518b6101200151600160048110612ff557612ff4613b5c565b5b60200201518c610120015160026004811061301357613012613b5c565b5b60200201518d610120015160036004811061303157613030613b5c565b5b60200201516040516020016130519c9b9a99989796959493929190615783565b604051602081830303815290604052905080915050949350505050565b60606130948273ffffffffffffffffffffffffffffffffffffffff16601460ff1661309b565b9050919050565b6060600060028360026130ae9190614f06565b6130b89190613b8b565b67ffffffffffffffff8111156130d1576130d0613423565b5b6040519080825280601f01601f1916602001820160405280156131035781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061313b5761313a613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061319f5761319e613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026131df9190614f06565b6131e99190613b8b565b90505b6001811115613289577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061322b5761322a613b5c565b5b1a60f81b82828151811061324257613241613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061328290613bbf565b90506131ec565b50600084146132cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c49061590b565b60405180910390fd5b8091505092915050565b60405180604001604052806002905b60608152602001906001900390816132e65790505090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b508054600082559060005260206000209081019061335291906133b0565b50565b60405180610140016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160608152602001606081526020016133aa6133cd565b81525090565b5b808211156133c95760008160009055506001016133b1565b5090565b60405180608001604052806004905b60608152602001906001900390816133dc5790505090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61345b82613412565b810181811067ffffffffffffffff8211171561347a57613479613423565b5b80604052505050565b600061348d6133f4565b90506134998282613452565b919050565b600067ffffffffffffffff8211156134b9576134b8613423565b5b6134c282613412565b9050602081019050919050565b82818337600083830152505050565b60006134f16134ec8461349e565b613483565b90508281526020810184848401111561350d5761350c61340d565b5b6135188482856134cf565b509392505050565b600082601f83011261353557613534613408565b5b81356135458482602086016134de565b91505092915050565b600060208284031215613564576135636133fe565b5b600082013567ffffffffffffffff81111561358257613581613403565b5b61358e84828501613520565b91505092915050565b600060029050919050565b600081905092915050565b6000819050919050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135f15780820151818401526020810190506135d6565b60008484015250505050565b6000613608826135b7565b61361281856135c2565b93506136228185602086016135d3565b61362b81613412565b840191505092915050565b600061364283836135fd565b905092915050565b6000602082019050919050565b600061366282613597565b61366c81856135a2565b93508360208202850161367e856135ad565b8060005b858110156136ba578484038952815161369b8582613636565b94506136a68361364a565b925060208a01995050600181019050613682565b50829750879550505050505092915050565b600060208201905081810360008301526136e68184613657565b905092915050565b6000819050919050565b613701816136ee565b82525050565b600060208201905061371c60008301846136f8565b92915050565b61372b816136ee565b811461373657600080fd5b50565b60008135905061374881613722565b92915050565b60008060408385031215613765576137646133fe565b5b600061377385828601613739565b925050602083013567ffffffffffffffff81111561379457613793613403565b5b6137a085828601613520565b9150509250929050565b6000602082840312156137c0576137bf6133fe565b5b60006137ce84828501613739565b91505092915050565b600082825260208201905092915050565b60006137f3826135b7565b6137fd81856137d7565b935061380d8185602086016135d3565b61381681613412565b840191505092915050565b6000602082019050818103600083015261383b81846137e8565b905092915050565b6000806040838503121561385a576138596133fe565b5b600061386885828601613739565b925050602061387985828601613739565b9150509250929050565b600067ffffffffffffffff82111561389e5761389d613423565b5b602082029050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138d9826138ae565b9050919050565b6138e9816138ce565b81146138f457600080fd5b50565b600081359050613906816138e0565b92915050565b600061391f61391a84613883565b613483565b90508060208402830185811115613939576139386138a9565b5b835b81811015613962578061394e88826138f7565b84526020840193505060208101905061393b565b5050509392505050565b600082601f83011261398157613980613408565b5b600261398e84828561390c565b91505092915050565b6000604082840312156139ad576139ac6133fe565b5b60006139bb8482850161396c565b91505092915050565b6000806000606084860312156139dd576139dc6133fe565b5b60006139eb86828701613739565b935050602084013567ffffffffffffffff811115613a0c57613a0b613403565b5b613a1886828701613520565b925050604084013567ffffffffffffffff811115613a3957613a38613403565b5b613a4586828701613520565b9150509250925092565b613a58816138ce565b82525050565b6000602082019050613a736000830184613a4f565b92915050565b600080600060608486031215613a9257613a916133fe565b5b6000613aa086828701613739565b9350506020613ab186828701613739565b9250506040613ac2868287016138f7565b9150509250925092565b600060208284031215613ae257613ae16133fe565b5b6000613af0848285016138f7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b33826136ee565b9150613b3e836136ee565b9250828203905081811115613b5657613b55613af9565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613b96826136ee565b9150613ba1836136ee565b9250828201905080821115613bb957613bb8613af9565b5b92915050565b6000613bca826136ee565b915060008203613bdd57613bdc613af9565b5b600182039050919050565b6000613bf3826136ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c2557613c24613af9565b5b600182019050919050565b600081905092915050565b6000613c46826135b7565b613c508185613c30565b9350613c608185602086016135d3565b80840191505092915050565b6000613c788284613c3b565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613cbd826136ee565b9150613cc8836136ee565b925082613cd857613cd7613c83565b5b828204905092915050565b7f3c7265637420783d220000000000000000000000000000000000000000000000815250565b7f2220793d22000000000000000000000000000000000000000000000000000000815250565b7f222077696474683d220000000000000000000000000000000000000000000000815250565b7f22206865696768743d2200000000000000000000000000000000000000000000815250565b7f222f3e0a00000000000000000000000000000000000000000000000000000000815250565b6000613dac82613ce3565b600982019150613dbc8287613c3b565b9150613dc782613d09565b600582019150613dd78286613c3b565b9150613de282613d2f565b600982019150613df28285613c3b565b9150613dfd82613d55565b600a82019150613e0d8284613c3b565b9150613e1882613d7b565b60048201915081905095945050505050565b7f3000000000000000000000000000000000000000000000000000000000000000815250565b7f2e00000000000000000000000000000000000000000000000000000000000000815250565b6000613e8182613e2a565b600182019150613e9082613e50565b600182019150613ea08284613c3b565b915081905092915050565b6000613eb78285613c3b565b9150613ec282613e50565b600182019150613ed28284613c3b565b91508190509392505050565b6000613eea8285613c3b565b9150613ef68284613c3b565b91508190509392505050565b7f3c636972636c652063783d2232303030222063793d22323030302220723d2200815250565b6000613f3382613f02565b601f82019150613f438284613c3b565b9150613f4e82613d7b565b60048201915081905092915050565b600080fd5b600080fd5b600060ff82169050919050565b613f7d81613f67565b8114613f8857600080fd5b50565b600081519050613f9a81613f74565b92915050565b600067ffffffffffffffff82169050919050565b613fbd81613fa0565b8114613fc857600080fd5b50565b600081519050613fda81613fb4565b92915050565b600081519050613fef816138e0565b92915050565b600060a0828403121561400b5761400a613f5d565b5b61401560a0613483565b9050600061402584828501613f8b565b600083015250602061403984828501613f8b565b602083015250604061404d84828501613fcb565b604083015250606061406184828501613fcb565b606083015250608061407584828501613fe0565b60808301525092915050565b600060a08284031215614097576140966133fe565b5b60006140a584828501613ff5565b91505092915050565b60008115159050919050565b6140c3816140ae565b81146140ce57600080fd5b50565b6000815190506140e0816140ba565b92915050565b600061ffff82169050919050565b6140fd816140e6565b811461410857600080fd5b50565b60008151905061411a816140f4565b92915050565b60007fffffff000000000000000000000000000000000000000000000000000000000082169050919050565b61415581614120565b811461416057600080fd5b50565b6000815190506141728161414c565b92915050565b600061418b6141868461349e565b613483565b9050828152602081018484840111156141a7576141a661340d565b5b6141b28482856135d3565b509392505050565b600082601f8301126141cf576141ce613408565b5b81516141df848260208601614178565b91505092915050565b600061010082840312156141ff576141fe613f5d565b5b61420a610100613483565b9050600061421a84828501613f8b565b600083015250602061422e84828501613f8b565b602083015250604061424284828501613f8b565b604083015250606061425684828501613f8b565b606083015250608061426a848285016140d1565b60808301525060a061427e8482850161410b565b60a08301525060c061429284828501614163565b60c08301525060e082015167ffffffffffffffff8111156142b6576142b5613f62565b5b6142c2848285016141ba565b60e08301525092915050565b6000602082840312156142e4576142e36133fe565b5b600082015167ffffffffffffffff81111561430257614301613403565b5b61430e848285016141e8565b91505092915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000815250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061438457607f821691505b6020821081036143975761439661433d565b5b50919050565b60008190508160005260206000209050919050565b600081546143bf8161436c565b6143c98186613c30565b945060018216600081146143e457600181146143f95761442c565b60ff198316865281151582028601935061442c565b6144028561439d565b60005b8381101561442457815481890152600182019150602081019050614405565b838801955050505b50505092915050565b7f2023000000000000000000000000000000000000000000000000000000000000815250565b7f222c226465736372697074696f6e223a22000000000000000000000000000000815250565b7f222c000000000000000000000000000000000000000000000000000000000000815250565b7f2261747472696275746573223a5b000000000000000000000000000000000000815250565b7f5d2c22696d616765223a22646174613a696d6167652f7376672b786d6c3b626160008201527f736536342c000000000000000000000000000000000000000000000000000000602082015250565b6000614529602583613c30565b9150614534826144cd565b602582019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000815250565b600061457082614317565b60098201915061458082896143b2565b915061458b82614435565b60028201915061459b8288613c3b565b91506145a68261445b565b6011820191506145b68287613c3b565b91506145c182614481565b6002820191506145d18286613c3b565b91506145dc826144a7565b600e820191506145ec8285613c3b565b91506145f78261451c565b91506146038284613c3b565b915061460e8261453f565b600282019150819050979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250565b600061465382614622565b601d820191506146638284613c3b565b915081905092915050565b60008082015250565b6000614684600183613c30565b915061468f8261466e565b600182019050919050565b600081519050919050565b600081905092915050565b60006146bb8261469a565b6146c581856146a5565b93506146d58185602086016135d3565b80840191505092915050565b60006146ec82614677565b91506146f882846146b0565b915081905092915050565b7f637265617465207820696e6e6f76617465207820696d70616374207820646f2060008201527f676f6f6400000000000000000000000000000000000000000000000000000000602082015250565b600061475f602483613c30565b915061476a82614703565b602482019050919050565b60006147818284613c3b565b915061478c82614752565b915081905092915050565b60006147a282613f67565b91506147ad83613f67565b9250828201905060ff8111156147c6576147c5613af9565b5b92915050565b7f7b2274726169745f74797065223a202247656e65726174696f6e7320556e6c6f60008201527f636b6564222c202276616c7565223a0000000000000000000000000000000000602082015250565b6000614828602f83613c30565b9150614833826147cc565b602f82019050919050565b7f7d2c7b2274726169745f74797065223a20224163746976652047656e6572617460008201527f696f6e222c202276616c7565223a000000000000000000000000000000000000602082015250565b600061489a602e83613c30565b91506148a58261483e565b602e82019050919050565b7f7d2c7b2274726169745f74797065223a202254696d6573205472616e7366657260008201527f726564222c202276616c7565223a220000000000000000000000000000000000602082015250565b600061490c602f83613c30565b9150614917826148b0565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a20224f776e65642053696e6365222c60008201527f202276616c7565223a2200000000000000000000000000000000000000000000602082015250565b600061497e602a83613c30565b915061498982614922565b602a82019050919050565b600061499f8261481b565b91506149ab8287613c3b565b91506149b68261488d565b91506149c28286613c3b565b91506149cd826148ff565b91506149d98285613c3b565b91506149e482614971565b91506149f08284613c3b565b915081905095945050505050565b7f227d2c7b2274726169745f74797065223a2022436f6c6f722047726f7570222c60008201527f202276616c7565223a2200000000000000000000000000000000000000000000602082015250565b6000614a5a602a83613c30565b9150614a65826149fe565b602a82019050919050565b7f227d2c7b2274726169745f74797065223a202250616c6574746520496e64657860008201527f222c202276616c7565223a220000000000000000000000000000000000000000602082015250565b6000614acc602c83613c30565b9150614ad782614a70565b602c82019050919050565b7f7b2274726169745f74797065223a2022536861706520436f756e74222c20227660008201527f616c7565223a2200000000000000000000000000000000000000000000000000602082015250565b6000614b3e602783613c30565b9150614b4982614ae2565b602782019050919050565b7f227d2c7b2274726169745f74797065223a2022436972636c6520436f756e742260008201527f2c202276616c7565223a22000000000000000000000000000000000000000000602082015250565b6000614bb0602b83613c30565b9150614bbb82614b54565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202253717561726520436f756e742260008201527f2c202276616c7565223a22000000000000000000000000000000000000000000602082015250565b6000614c22602b83613c30565b9150614c2d82614bc6565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a20224e6f6e6520436f756e74222c2060008201527f2276616c7565223a220000000000000000000000000000000000000000000000602082015250565b6000614c94602983613c30565b9150614c9f82614c38565b602982019050919050565b6000614cb6828a613c3b565b9150614cc182614a4d565b9150614ccd82896143b2565b9150614cd882614abf565b9150614ce48288613c3b565b9150614cef82614b31565b9150614cfb8287613c3b565b9150614d0682614ba3565b9150614d128286613c3b565b9150614d1d82614c15565b9150614d298285613c3b565b9150614d3482614c87565b9150614d408284613c3b565b915081905098975050505050505050565b7f227d2c7b2274726169745f74797065223a2022436f6d706c6578697479204c6560008201527f76656c222c202276616c7565223a220000000000000000000000000000000000602082015250565b6000614dad602f83613c30565b9150614db882614d51565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a2022476c6974636879222c2022766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b6000614e1f602683613c30565b9150614e2a82614dc3565b602682019050919050565b7f227d2c7b2274726169745f74797065223a20225370656369616c20547261697460008201527f222c202276616c7565223a220000000000000000000000000000000000000000602082015250565b6000614e91602c83613c30565b9150614e9c82614e35565b602c82019050919050565b6000614eb38287613c3b565b9150614ebe82614da0565b9150614eca8286613c3b565b9150614ed582614e12565b9150614ee18285613c3b565b9150614eec82614e84565b9150614ef88284613c3b565b915081905095945050505050565b6000614f11826136ee565b9150614f1c836136ee565b9250828202614f2a816136ee565b91508282048414831517614f4157614f40613af9565b5b5092915050565b7f6300000000000000000000000000000000000000000000000000000000000000600082015250565b6000614f7e600183613c30565b9150614f8982614f48565b600182019050919050565b600063ffffffff82169050919050565b60008160e01b9050919050565b6000614fbc82614fa4565b9050919050565b614fd4614fcf82614f94565b614fb1565b82525050565b7f80600e6000396000f30000000000000000000000000000000000000000000000600082015250565b6000615010600983613c30565b915061501b82614fda565b600982019050919050565b600061503182614f71565b915061503d8285614fc3565b60048201915061504c82615003565b915061505882846146b0565b91508190509392505050565b600060608201905061507960008301866136f8565b61508660208301856136f8565b61509360408301846136f8565b949350505050565b7f3c672069643d2261727422000000000000000000000000000000000000000000815250565b7f3c7265637420783d22302220793d2230222077696474683d223130302522206860008201527f65696768743d2231303025222066696c6c3d2200000000000000000000000000602082015250565b600061511d603383613c30565b9150615128826150c1565b603382019050919050565b7f222f3e0a0a3c672069643d227368617065732200000000000000000000000000815250565b60006151658287613c3b565b91506151708261509b565b600b820191506151808286613c3b565b915061518b82615110565b91506151978285613c3b565b91506151a282615133565b6013820191506151b28284613c3b565b915081905095945050505050565b7f3c672069643d22736861706547726f75705f0000000000000000000000000000815250565b7f222066696c6c3d22000000000000000000000000000000000000000000000000815250565b7f22207374726f6b653d2200000000000000000000000000000000000000000000815250565b7f22207374726f6b652d77696474683d223530223e0a0000000000000000000000815250565b7f3c2f673e0a0a0000000000000000000000000000000000000000000000000000815250565b600061528a8288613c3b565b9150615295826151c0565b6012820191506152a58287613c3b565b91506152b0826151e6565b6008820191506152c08286613c3b565b91506152cb8261520c565b600a820191506152db8285613c3b565b91506152e682615232565b6015820191506152f68284613c3b565b915061530182615258565b6006820191508190509695505050505050565b600061531f826151e6565b60088201915061532f8285613c3b565b915061533a8261520c565b600a8201915061534a8284613c3b565b91508190509392505050565b7f2c20000000000000000000000000000000000000000000000000000000000000815250565b60006153888285613c3b565b915061539382615356565b6002820191506153a38284613c3b565b91508190509392505050565b7f22207374726f6b652d77696474683d22313022207472616e73666f726d3d227460008201527f72616e736c617465280000000000000000000000000000000000000000000000602082015250565b600061540b602983613c30565b9150615416826153af565b602982019050919050565b600061542d8287613c3b565b9150615438826151c0565b6012820191506154488286613c3b565b91506154548285613c3b565b915061545f826153fe565b915061546b8284613c3b565b915081905095945050505050565b7f29207363616c6528000000000000000000000000000000000000000000000000815250565b7f2922203e0a000000000000000000000000000000000000000000000000000000815250565b60006154d18286613c3b565b91506154dc82615479565b6008820191506154ec8285613c3b565b91506154f78261549f565b6005820191506155078284613c3b565b915061551282615258565b600682019150819050949350505050565b7f0a0a3c2f7376673e000000000000000000000000000000000000000000000000815250565b60006155558288613c3b565b91506155618287613c3b565b915061556d8286613c3b565b91506155798285613c3b565b91506155858284613c3b565b915061559082615523565b6008820191508190509695505050505050565b7f697473206120676f6f6420646179000000000000000000000000000000000000815250565b7f746f2068617665206120676f6f64206461790000000000000000000000000000815250565b60006155fa826155a3565b600e8201915061560a8284613c3b565b9150615615826155c9565b60128201915081905092915050565b600061563082856143b2565b915061563b82614435565b60028201915061564b8284613c3b565b91508190509392505050565b7f7c00000000000000000000000000000000000000000000000000000000000000815250565b6000615689828c613c3b565b915061569482615657565b6001820191506156a4828b613c3b565b91506156af82615657565b6001820191506156bf828a613c3b565b91506156ca82615657565b6001820191506156da8289613c3b565b91506156e582615657565b6001820191506156f58288613c3b565b915061570082615657565b6001820191506157108287613c3b565b915061571b82615657565b60018201915061572b8286613c3b565b915061573682615657565b60018201915061574682856143b2565b915061575182615657565b6001820191506157618284613c3b565b915061576c82615657565b6001820191508190509a9950505050505050505050565b600061578f828f613c3b565b915061579b828e613c3b565b91506157a682615657565b6001820191506157b6828d613c3b565b91506157c182615657565b6001820191506157d1828c613c3b565b91506157dc82615657565b6001820191506157ec828b613c3b565b91506157f782615657565b600182019150615807828a613c3b565b915061581282615657565b6001820191506158228289613c3b565b915061582d82615657565b60018201915061583d8288613c3b565b915061584882615657565b6001820191506158588287613c3b565b915061586382615657565b6001820191506158738286613c3b565b915061587e82615657565b60018201915061588e8285613c3b565b915061589982615657565b6001820191506158a98284613c3b565b91508190509d9c50505050505050505050505050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006158f56020836137d7565b9150615900826158bf565b602082019050919050565b60006020820190508181036000830152615924816158e8565b905091905056fe77686f207361696420636972636c657320616e6420737175617265732063616e742067657420616c6f6e673f2077656c636f6d6520746f2067656e2d312077686572652074686573652074776f2073686170657320636f6d6520746f67657468657220696e2070657266656374206861726d6f6e792e20796f75206b6e6f7720746865206472696c6c2e2e2e20656e6a6f7920746865206172742c206578706c6f72652074686520636f64652c20616e6420646f6e7420666f7267657420746f20636c69636b2061726f756e6420666f7220736f6d652065787472612066756e2120f09f98894142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220ceae77a067acd3d8d80d55458e0906bf0b913bac991f18a943e1f8e1e658362864736f6c63430008130033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101005760003560e01c8063a0a93f0711610097578063d2e1e30911610066578063d2e1e3091461031d578063dd20620214610339578063e4fbf23a14610369578063f2fde38b1461038557610100565b8063a0a93f071461025d578063c379dc431461028d578063c382a04b146102bd578063c7ab2dbc146102ed57610100565b8063373e3526116100d3578063373e3526146101b157806367462265146101e15780637f4f479114610211578063952178261461024157610100565b806311b315421461010557806322b8d04414610135578063321d8bb91461016557806336e10fa014610181575b600080fd5b61011f600480360381019061011a919061354e565b6103a1565b60405161012c91906136cc565b60405180910390f35b61014f600480360381019061014a919061354e565b6107b5565b60405161015c9190613707565b60405180910390f35b61017f600480360381019061017a919061374e565b6107e8565b005b61019b600480360381019061019691906137aa565b61087b565b6040516101a89190613821565b60405180910390f35b6101cb60048036038101906101c69190613843565b6108ef565b6040516101d89190613821565b60405180910390f35b6101fb60048036038101906101f691906137aa565b610cb1565b6040516102089190613821565b60405180910390f35b61022b600480360381019061022691906137aa565b610cf9565b6040516102389190613821565b60405180910390f35b61025b60048036038101906102569190613997565b610e39565b005b610277600480360381019061027291906137aa565b610ef8565b6040516102849190613821565b60405180910390f35b6102a760048036038101906102a291906139c4565b610f29565b6040516102b49190613821565b60405180910390f35b6102d760048036038101906102d2919061374e565b6111bb565b6040516102e49190613a5e565b60405180910390f35b610307600480360381019061030291906137aa565b611261565b6040516103149190613821565b60405180910390f35b610337600480360381019061033291906137aa565b611446565b005b610353600480360381019061034e919061354e565b611475565b6040516103609190613a5e565b60405180910390f35b610383600480360381019061037e9190613a79565b61148f565b005b61039f600480360381019061039a9190613acc565b61150f565b005b6103a96132d7565b6000808390506103b76132fe565b600382516103c59190613b28565b816020018181525050806020015192505b60008311156104bc577f22000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191682848151811061043557610434613b5c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036104ab576001836104749190613b8b565b8160000181815250506001816000015182602001516104939190613b28565b61049d9190613b8b565b8160400181815250506104bc565b826104b590613bbf565b92506103d6565b602b81600001516104cd9190613b28565b816080018181525050806080015192505b60008311156105c4577f22000000000000000000000000000000000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191682848151811061053d5761053c613b5c565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036105b35760018361057c9190613b8b565b81606001818152505060018160600151826080015161059b9190613b28565b6105a59190613b8b565b8160a00181815250506105c4565b826105bd90613bbf565b92506104de565b60008160a0015167ffffffffffffffff8111156105e4576105e3613423565b5b6040519080825280601f01601f1916602001820160405280156106165781602001600182028036833780820191505090505b5090506000826040015167ffffffffffffffff81111561063957610638613423565b5b6040519080825280601f01601f19166020018201604052801561066b5781602001600182028036833780820191505090505b509050600094505b8260a0015185101561070157838584606001516106909190613b8b565b815181106106a1576106a0613b5c565b5b602001015160f81c60f81b8286815181106106bf576106be613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535084806106f990613be8565b955050610673565b600094505b826040015185101561079457838584600001516107239190613b8b565b8151811061073457610733613b5c565b5b602001015160f81c60f81b81868151811061075257610751613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350848061078c90613be8565b955050610706565b60405180604001604052808381526020018281525095505050505050919050565b6000816040516020016107c89190613c6c565b6040516020818303038152906040528051906020012060001c9050919050565b6107f061155c565b60006107fb826115e6565b90506000836020811061081157610810613b5c565b5b01600001819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b6060600060028361088c9190613cb2565b6107d06108999190613b28565b905060006108a68261168a565b6108af8361168a565b6108b88661168a565b6108c18761168a565b6040516020016108d49493929190613da1565b60405160208183030381529060405290508092505050919050565b606060006108fc8461168a565b905060008151905060008467ffffffffffffffff8111156109205761091f613423565b5b6040519080825280601f01601f1916602001820160405280156109525781602001600182028036833780820191505090505b50905081851115610b0d57600082860390505b828603811015610a0a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152506000815181106109b8576109b7613b5c565b5b602001015160f81c60f81b8282815181106109d6576109d5613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610a6f565b83838703820381518110610a2157610a20613b5c565b5b602001015160f81c60f81b828281518110610a3f57610a3e613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b8060019003905060008111610965577f300000000000000000000000000000000000000000000000000000000000000082600081518110610ab357610ab2613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081604051602001610af39190613e76565b604051602081830303815290604052945050505050610cab565b818503610b3e5782604051602001610b259190613e76565b6040516020818303038152906040529350505050610cab565b60008060008088860367ffffffffffffffff811115610b6057610b5f613423565b5b6040519080825280601f01601f191660200182016040528015610b925781602001600182028036833780820191505090505b5090505b888603821015610c0b57868281518110610bb357610bb2613b5c565b5b602001015160f81c60f81b818581518110610bd157610bd0613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350836001019350610c72565b868281518110610c1e57610c1d613b5c565b5b602001015160f81c60f81b858481518110610c3c57610c3b613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508260010192505b816001019150858210610b96578085604051602001610c92929190613eab565b6040516020818303038152906040529750505050505050505b92915050565b6060610cf26101078360048110610ccb57610cca613b5c565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611758565b9050919050565b60606000808360208110610d1057610d0f613b5c565b5b016000018054905003610d3457604051806020016040528060008152509050610e34565b600060606000808560208110610d4d57610d4c613b5c565b5b01600001805480602002602001604051908101604052809291908181526020018280548015610dd157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610d87575b505050505090505b81610dfd828581518110610df057610def613b5c565b5b6020026020010151611758565b604051602001610e0e929190613ede565b604051602081830303815290604052915082600101925080518310610dd9578193505050505b919050565b610e4161155c565b80600060028110610e5557610e54613b5c565b5b602002015161010b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160028110610eaf57610eae613b5c565b5b602002015161010c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060610f038261168a565b604051602001610f139190613f28565b6040516020818303038152906040529050919050565b6060612058841115610f67576040517f4621ae1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b09afec1866040518263ffffffff1660e01b8152600401610fc59190613707565b60a060405180830381865afa158015610fe2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110069190614081565b90506001816020015160ff16101561104a576040517fb14f83d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166307160cf5876040518263ffffffff1660e01b81526004016110a89190613707565b600060405180830381865afa1580156110c5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ee91906142ce565b905060006110fd87848461178d565b9050600061110d84848489611924565b905060006020846040015160ff166007811061112c5761112b613b5c565b5b016111368a61168a565b60405180610120016040528060e6815260200161592c60e691398a8561115f8860e00151611b7a565b60405160200161117496959493929190614565565b604051602081830303815290604052905061118e81611b7a565b60405160200161119e9190614648565b604051602081830303815290604052955050505050509392505050565b60006111c561155c565b6111ce826115e6565b61010784600481106111e3576111e2613b5c565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610107836004811061123757611236613b5c565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b606061205882111561129f576040517f4621ae1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b09afec1846040518263ffffffff1660e01b81526004016112fd9190613707565b60a060405180830381865afa15801561131a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133e9190614081565b90506001816020015160ff161015611382576040517fb14f83d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061010c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166307160cf5856040518263ffffffff1660e01b81526004016113e09190613707565b600060405180830381865afa1580156113fd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061142691906142ce565b9050600061143585848461178d565b90508060e001519350505050919050565b61144e61155c565b6000816020811061146257611461613b5c565b5b0160000160006114729190613334565b50565b600061147f61155c565b611488826115e6565b9050919050565b61149761155c565b80600084602081106114ac576114ab613b5c565b5b0160000183815481106114c2576114c1613b5c565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b61151761155c565b8061010d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61010d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f8e2aa84b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b600080611611836040516020016115fd91906146e1565b604051602081830303815290604052611cdd565b90508051602082016000f09150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611684576040517f08d4abb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50919050565b60606000600161169984611d09565b01905060008167ffffffffffffffff8111156116b8576116b7613423565b5b6040519080825280601f01601f1916602001820160405280156116ea5781602001600182028036833780820191505090505b509050600082602001820190505b60011561174d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161174157611740613c83565b5b049450600085036116f8575b819350505050919050565b60606117868260017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611e5c565b9050919050565b611795613355565b61179d613355565b60006117a88661168a565b9050600560046117d6836040516020016117c29190614775565b6040516020818303038152906040526107b5565b816117e4576117e3613c83565b5b06018260000181815250508160000151610bb88161180557611804613c83565b5b0482602001818152505060006027856060015160088760400151020160ff166038811061183557611834613b5c565b5b60040201600480602002604051908101604052809291906000905b828210156118f35783820180546118669061436c565b80601f01602080910402602001604051908101604052809291908181526020018280546118929061436c565b80156118df5780601f106118b4576101008083540402835291602001916118df565b820191906000526020600020905b8154815290600101906020018083116118c257829003601f168201915b505050505081526020019060010190611850565b505050509050808361012001819052505061191086868685611f41565b8260e0018190525081925050509392505050565b60606000611931836103a1565b90506000611951600188602001516119499190614797565b60ff1661168a565b611961886000015160ff1661168a565b8360006002811061197557611974613b5c565b5b60200201518460016002811061198e5761198d613b5c565b5b60200201516040516020016119a69493929190614994565b6040516020818303038152906040529050806020876040015160ff16600781106119d3576119d2613b5c565b5b016119e4886060015160ff1661168a565b6119f1886000015161168a565b6119fe896040015161168a565b611a0b8a6060015161168a565b611a188b6080015161168a565b604051602001611a2e9796959493929190614caa565b604051602081830303815290604052905080611a4d8660a0015161168a565b6005886020015160ff1614611a97576040518060400160405280600581526020017f46616c7365000000000000000000000000000000000000000000000000000000815250611ace565b6040518060400160405280600481526020017f54727565000000000000000000000000000000000000000000000000000000008152505b8860800151611b12576040518060400160405280600681526020017f4e6f6e65227d0000000000000000000000000000000000000000000000000000815250611b49565b6040518060400160405280600981526020017f446f20476f6f64227d00000000000000000000000000000000000000000000008152505b604051602001611b5c9493929190614ea7565b60405160208183030381529060405290508092505050949350505050565b60606000825103611b9c57604051806020016040528060008152509050611cd8565b6000604051806060016040528060408152602001615a126040913990506000600360028551611bcb9190613b8b565b611bd59190613cb2565b6004611be19190614f06565b67ffffffffffffffff811115611bfa57611bf9613423565b5b6040519080825280601f01601f191660200182016040528015611c2c5781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015611c98576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050611c3d565b5050600386510660018114611cb45760028114611cc757611ccf565b603d6001830353603d6002830353611ccf565b603d60018303535b50505080925050505b919050565b6060815182604051602001611cf3929190615026565b6040516020818303038152906040529050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611d67577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611d5d57611d5c613c83565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611da4576d04ee2d6d415b85acef81000000008381611d9a57611d99613c83565b5b0492506020810190505b662386f26fc100008310611dd357662386f26fc100008381611dc957611dc8613c83565b5b0492506010810190505b6305f5e1008310611dfc576305f5e1008381611df257611df1613c83565b5b0492506008810190505b6127108310611e21576127108381611e1757611e16613c83565b5b0492506004810190505b60648310611e445760648381611e3a57611e39613c83565b5b0492506002810190505b600a8310611e53576001810190505b80915050919050565b60606000611e6985612c69565b905060008103611e8b5760405180602001604052806000815250915050611f3a565b80841115611eab5760405180602001604052806000815250915050611f3a565b83831015611ef4578084846040517f2c4a89fa000000000000000000000000000000000000000000000000000000008152600401611eeb93929190615064565b60405180910390fd5b60008484039050600085830390506000828210611f115782611f13565b815b90506040519450601f19601f60208301011685016040528085528087602087018a3c505050505b9392505050565b6060600080600080600080611f566001610cb1565b60058a6020015160ff1614611fa0576040518060400160405280600381526020017f3e0a0a0000000000000000000000000000000000000000000000000000000000815250611fd7565b6040518060400160405280601981526020017f2066696c7465723d2275726c2823676c6974636829223e0a0a000000000000008152505b8a6080015161200357896101200151600060048110611ff957611ff8613b5c565b5b602002015161203a565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b60058c6020015160ff1614612084576040518060400160405280600381526020017f3e0a0a00000000000000000000000000000000000000000000000000000000008152506120bb565b6040518060400160405280601881526020017f2066696c7465723d2275726c28236e6f69736529223e0a0a00000000000000008152505b6040516020016120ce9493929190615159565b60405160208183030381529060405290505b60018201600d8c0102935060018860a0015111806120fe5750600582115b156121155761210e846096612c74565b9450612124565b6121218461012c612c74565b94505b8188600001510388602001510295506000850361214f57876080018051600101908181525050612bd5565b6001850361227857806121618361168a565b8a60800151801561218357506000600d87816121805761217f613c83565b5b06145b6121bd57896101200151600460018801816121a1576121a0613c83565b5b06600481106121b3576121b2613b5c565b5b60200201516121f4565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a61012001516004600289018161220e5761220d613c83565b5b06600481106122205761221f613b5c565b5b602002015161223f60028b8161223957612238613c83565b5b04610ef8565b60405160200161225395949392919061527e565b6040516020818303038152906040529050876040018051600101908181525050612bd4565b60028503612390578061228a8361168a565b8a6080015180156122ac57506000600d87816122a9576122a8613c83565b5b06145b6122e6578961012001516004600a8801816122ca576122c9613c83565b5b06600481106122dc576122db613b5c565b5b602002015161231d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a61012001516004600b89018161233757612336613c83565b5b066004811061234957612348613b5c565b5b60200201516123578a61087b565b60405160200161236b95949392919061527e565b6040516020818303038152906040529050876060018051600101908181525050612bd3565b600385036125a057610fa060648702816123ad576123ac613c83565b5b049250806123ba8361168a565b8a6080015180156123dc57506000600d87816123d9576123d8613c83565b5b06145b61241657896101200151600460038801816123fa576123f9613c83565b5b066004811061240c5761240b613b5c565b5b602002015161244d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160048089018161246657612465613c83565b5b066004811061247857612477613b5c565b5b602002015160405160200161248e929190615314565b6040516020818303038152906040526124b1866107d00262030d400360026108ef565b6124c5876107d00262030d400360026108ef565b6040516020016124d692919061537c565b6040516020818303038152906040526040516020016124f89493929190615421565b6040516020818303038152906040529050806125158460026108ef565b6125208560026108ef565b60405160200161253192919061537c565b60405160208183030381529060405261255a600c878161255457612553613c83565b5b06610cf9565b60405160200161256c939291906154c5565b60405160208183030381529060405290508760400180516001019081815250508760a0018051600101908181525050612bd2565b600485036127b057610fa060648702816125bd576125bc613c83565b5b049250806125ca8361168a565b8a6080015180156125ec57506000600d87816125e9576125e8613c83565b5b06145b612626578961012001516004600388018161260a57612609613c83565b5b066004811061261c5761261b613b5c565b5b602002015161265d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160048089018161267657612675613c83565b5b066004811061268857612687613b5c565b5b602002015160405160200161269e929190615314565b6040516020818303038152906040526126c1866107d00262030d400360026108ef565b6126d5876107d00262030d400360026108ef565b6040516020016126e692919061537c565b6040516020818303038152906040526040516020016127089493929190615421565b6040516020818303038152906040529050806127258460026108ef565b6127308560026108ef565b60405160200161274192919061537c565b60405160208183030381529060405261276a600c878161276457612763613c83565b5b06610cf9565b60405160200161277c939291906154c5565b60405160208183030381529060405290508760600180516001019081815250508760a0018051600101908181525050612bd1565b600585036129c057610fa060648702816127cd576127cc613c83565b5b049250806127da8361168a565b8a6080015180156127fc57506000600d87816127f9576127f8613c83565b5b06145b612836578961012001516004600388018161281a57612819613c83565b5b066004811061282c5761282b613b5c565b5b602002015161286d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160048089018161288657612885613c83565b5b066004811061289857612897613b5c565b5b60200201516040516020016128ae929190615314565b6040516020818303038152906040526128d1866107d00262030d400360026108ef565b6128e5876107d00262030d400360026108ef565b6040516020016128f692919061537c565b6040516020818303038152906040526040516020016129189493929190615421565b6040516020818303038152906040529050806129358460026108ef565b6129408560026108ef565b60405160200161295192919061537c565b60405160208183030381529060405261297a600c878161297457612973613c83565b5b06610cf9565b60405160200161298c939291906154c5565b60405160208183030381529060405290508760600180516001019081815250508760a0018051600101908181525050612bd0565b60068503612bcf57610fa060648702816129dd576129dc613c83565b5b049250806129ea8361168a565b8a608001518015612a0c57506000600d8781612a0957612a08613c83565b5b06145b612a465789610120015160046007880181612a2a57612a29613c83565b5b0660048110612a3c57612a3b613b5c565b5b6020020151612a7d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b8a610120015160046008890181612a9757612a96613c83565b5b0660048110612aa957612aa8613b5c565b5b6020020151604051602001612abf929190615314565b604051602081830303815290604052612ae2866107d00262030d400360026108ef565b612af6876107d00262030d400360026108ef565b604051602001612b0792919061537c565b604051602081830303815290604052604051602001612b299493929190615421565b604051602081830303815290604052905080612b468460026108ef565b612b518560026108ef565b604051602001612b6292919061537c565b604051602081830303815290604052612b8d600c808881612b8657612b85613c83565b5b0601610cf9565b604051602001612b9f939291906154c5565b60405160208183030381529060405290508760600180516001019081815250508760a00180516001019081815250505b5b5b5b5b5b5b816001019150876000015182106120e057612bf06000610cb1565b612bfc8c8c8c8c612d6f565b82612c076002610cb1565b60058d6020015160ff1614612c2b5760405180602001604052806000815250612c36565b612c356003610cb1565b5b604051602001612c4a959493929190615549565b6040516020818303038152906040529650505050505050949350505050565b6000813b9050919050565b6000806040518060e00160405280603260ff168152602001603260ff168152602001603260ff168152602001600f60ff168152602001600f60ff168152602001603c60ff168152602001603c60ff16815250905060008082600060078110612cdf57612cde613b5c565b5b602002015160ff169050600085612d1f612cfb600d8a0261168a565b604051602001612d0b91906155ef565b6040516020818303038152906040526107b5565b81612d2d57612d2c613c83565b5b0690505b808211612d6257826001019250838360078110612d5157612d50613b5c565b5b602002015160ff1682019150612d31565b8294505050505092915050565b60606020836040015160ff1660078110612d8c57612d8b613b5c565b5b01612d968661168a565b604051602001612da7929190615624565b6040516020818303038152906040528261010001819052506000612dca8661168a565b836101000151612ddd876080015161306e565b612df4886060015167ffffffffffffffff1661168a565b612e0b896040015167ffffffffffffffff1661168a565b612e1b8a6020015160ff1661168a565b612e2b8b6000015160ff1661168a565b60208b6040015160ff1660078110612e4657612e45613b5c565b5b01612e578c6060015160ff1661168a565b604051602001612e6f9998979695949392919061567d565b604051602081830303815290604052905080612e8e846000015161168a565b612e9b856040015161168a565b612ea8866060015161168a565b612eb5876080015161168a565b612ec28860a0015161168a565b60058a6020015160ff1614612f0c576040518060400160405280600581526020017f66616c7365000000000000000000000000000000000000000000000000000000815250612f43565b6040518060400160405280600481526020017f74727565000000000000000000000000000000000000000000000000000000008152505b8a60800151612f87576040518060400160405280600481526020017f4e6f6e6500000000000000000000000000000000000000000000000000000000815250612fbe565b6040518060400160405280600781526020017f446f20476f6f64000000000000000000000000000000000000000000000000008152505b8a6101200151600060048110612fd757612fd6613b5c565b5b60200201518b6101200151600160048110612ff557612ff4613b5c565b5b60200201518c610120015160026004811061301357613012613b5c565b5b60200201518d610120015160036004811061303157613030613b5c565b5b60200201516040516020016130519c9b9a99989796959493929190615783565b604051602081830303815290604052905080915050949350505050565b60606130948273ffffffffffffffffffffffffffffffffffffffff16601460ff1661309b565b9050919050565b6060600060028360026130ae9190614f06565b6130b89190613b8b565b67ffffffffffffffff8111156130d1576130d0613423565b5b6040519080825280601f01601f1916602001820160405280156131035781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061313b5761313a613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061319f5761319e613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026131df9190614f06565b6131e99190613b8b565b90505b6001811115613289577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061322b5761322a613b5c565b5b1a60f81b82828151811061324257613241613b5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061328290613bbf565b90506131ec565b50600084146132cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c49061590b565b60405180910390fd5b8091505092915050565b60405180604001604052806002905b60608152602001906001900390816132e65790505090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b508054600082559060005260206000209081019061335291906133b0565b50565b60405180610140016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160608152602001606081526020016133aa6133cd565b81525090565b5b808211156133c95760008160009055506001016133b1565b5090565b60405180608001604052806004905b60608152602001906001900390816133dc5790505090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61345b82613412565b810181811067ffffffffffffffff8211171561347a57613479613423565b5b80604052505050565b600061348d6133f4565b90506134998282613452565b919050565b600067ffffffffffffffff8211156134b9576134b8613423565b5b6134c282613412565b9050602081019050919050565b82818337600083830152505050565b60006134f16134ec8461349e565b613483565b90508281526020810184848401111561350d5761350c61340d565b5b6135188482856134cf565b509392505050565b600082601f83011261353557613534613408565b5b81356135458482602086016134de565b91505092915050565b600060208284031215613564576135636133fe565b5b600082013567ffffffffffffffff81111561358257613581613403565b5b61358e84828501613520565b91505092915050565b600060029050919050565b600081905092915050565b6000819050919050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135f15780820151818401526020810190506135d6565b60008484015250505050565b6000613608826135b7565b61361281856135c2565b93506136228185602086016135d3565b61362b81613412565b840191505092915050565b600061364283836135fd565b905092915050565b6000602082019050919050565b600061366282613597565b61366c81856135a2565b93508360208202850161367e856135ad565b8060005b858110156136ba578484038952815161369b8582613636565b94506136a68361364a565b925060208a01995050600181019050613682565b50829750879550505050505092915050565b600060208201905081810360008301526136e68184613657565b905092915050565b6000819050919050565b613701816136ee565b82525050565b600060208201905061371c60008301846136f8565b92915050565b61372b816136ee565b811461373657600080fd5b50565b60008135905061374881613722565b92915050565b60008060408385031215613765576137646133fe565b5b600061377385828601613739565b925050602083013567ffffffffffffffff81111561379457613793613403565b5b6137a085828601613520565b9150509250929050565b6000602082840312156137c0576137bf6133fe565b5b60006137ce84828501613739565b91505092915050565b600082825260208201905092915050565b60006137f3826135b7565b6137fd81856137d7565b935061380d8185602086016135d3565b61381681613412565b840191505092915050565b6000602082019050818103600083015261383b81846137e8565b905092915050565b6000806040838503121561385a576138596133fe565b5b600061386885828601613739565b925050602061387985828601613739565b9150509250929050565b600067ffffffffffffffff82111561389e5761389d613423565b5b602082029050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138d9826138ae565b9050919050565b6138e9816138ce565b81146138f457600080fd5b50565b600081359050613906816138e0565b92915050565b600061391f61391a84613883565b613483565b90508060208402830185811115613939576139386138a9565b5b835b81811015613962578061394e88826138f7565b84526020840193505060208101905061393b565b5050509392505050565b600082601f83011261398157613980613408565b5b600261398e84828561390c565b91505092915050565b6000604082840312156139ad576139ac6133fe565b5b60006139bb8482850161396c565b91505092915050565b6000806000606084860312156139dd576139dc6133fe565b5b60006139eb86828701613739565b935050602084013567ffffffffffffffff811115613a0c57613a0b613403565b5b613a1886828701613520565b925050604084013567ffffffffffffffff811115613a3957613a38613403565b5b613a4586828701613520565b9150509250925092565b613a58816138ce565b82525050565b6000602082019050613a736000830184613a4f565b92915050565b600080600060608486031215613a9257613a916133fe565b5b6000613aa086828701613739565b9350506020613ab186828701613739565b9250506040613ac2868287016138f7565b9150509250925092565b600060208284031215613ae257613ae16133fe565b5b6000613af0848285016138f7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b33826136ee565b9150613b3e836136ee565b9250828203905081811115613b5657613b55613af9565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613b96826136ee565b9150613ba1836136ee565b9250828201905080821115613bb957613bb8613af9565b5b92915050565b6000613bca826136ee565b915060008203613bdd57613bdc613af9565b5b600182039050919050565b6000613bf3826136ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c2557613c24613af9565b5b600182019050919050565b600081905092915050565b6000613c46826135b7565b613c508185613c30565b9350613c608185602086016135d3565b80840191505092915050565b6000613c788284613c3b565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613cbd826136ee565b9150613cc8836136ee565b925082613cd857613cd7613c83565b5b828204905092915050565b7f3c7265637420783d220000000000000000000000000000000000000000000000815250565b7f2220793d22000000000000000000000000000000000000000000000000000000815250565b7f222077696474683d220000000000000000000000000000000000000000000000815250565b7f22206865696768743d2200000000000000000000000000000000000000000000815250565b7f222f3e0a00000000000000000000000000000000000000000000000000000000815250565b6000613dac82613ce3565b600982019150613dbc8287613c3b565b9150613dc782613d09565b600582019150613dd78286613c3b565b9150613de282613d2f565b600982019150613df28285613c3b565b9150613dfd82613d55565b600a82019150613e0d8284613c3b565b9150613e1882613d7b565b60048201915081905095945050505050565b7f3000000000000000000000000000000000000000000000000000000000000000815250565b7f2e00000000000000000000000000000000000000000000000000000000000000815250565b6000613e8182613e2a565b600182019150613e9082613e50565b600182019150613ea08284613c3b565b915081905092915050565b6000613eb78285613c3b565b9150613ec282613e50565b600182019150613ed28284613c3b565b91508190509392505050565b6000613eea8285613c3b565b9150613ef68284613c3b565b91508190509392505050565b7f3c636972636c652063783d2232303030222063793d22323030302220723d2200815250565b6000613f3382613f02565b601f82019150613f438284613c3b565b9150613f4e82613d7b565b60048201915081905092915050565b600080fd5b600080fd5b600060ff82169050919050565b613f7d81613f67565b8114613f8857600080fd5b50565b600081519050613f9a81613f74565b92915050565b600067ffffffffffffffff82169050919050565b613fbd81613fa0565b8114613fc857600080fd5b50565b600081519050613fda81613fb4565b92915050565b600081519050613fef816138e0565b92915050565b600060a0828403121561400b5761400a613f5d565b5b61401560a0613483565b9050600061402584828501613f8b565b600083015250602061403984828501613f8b565b602083015250604061404d84828501613fcb565b604083015250606061406184828501613fcb565b606083015250608061407584828501613fe0565b60808301525092915050565b600060a08284031215614097576140966133fe565b5b60006140a584828501613ff5565b91505092915050565b60008115159050919050565b6140c3816140ae565b81146140ce57600080fd5b50565b6000815190506140e0816140ba565b92915050565b600061ffff82169050919050565b6140fd816140e6565b811461410857600080fd5b50565b60008151905061411a816140f4565b92915050565b60007fffffff000000000000000000000000000000000000000000000000000000000082169050919050565b61415581614120565b811461416057600080fd5b50565b6000815190506141728161414c565b92915050565b600061418b6141868461349e565b613483565b9050828152602081018484840111156141a7576141a661340d565b5b6141b28482856135d3565b509392505050565b600082601f8301126141cf576141ce613408565b5b81516141df848260208601614178565b91505092915050565b600061010082840312156141ff576141fe613f5d565b5b61420a610100613483565b9050600061421a84828501613f8b565b600083015250602061422e84828501613f8b565b602083015250604061424284828501613f8b565b604083015250606061425684828501613f8b565b606083015250608061426a848285016140d1565b60808301525060a061427e8482850161410b565b60a08301525060c061429284828501614163565b60c08301525060e082015167ffffffffffffffff8111156142b6576142b5613f62565b5b6142c2848285016141ba565b60e08301525092915050565b6000602082840312156142e4576142e36133fe565b5b600082015167ffffffffffffffff81111561430257614301613403565b5b61430e848285016141e8565b91505092915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000815250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061438457607f821691505b6020821081036143975761439661433d565b5b50919050565b60008190508160005260206000209050919050565b600081546143bf8161436c565b6143c98186613c30565b945060018216600081146143e457600181146143f95761442c565b60ff198316865281151582028601935061442c565b6144028561439d565b60005b8381101561442457815481890152600182019150602081019050614405565b838801955050505b50505092915050565b7f2023000000000000000000000000000000000000000000000000000000000000815250565b7f222c226465736372697074696f6e223a22000000000000000000000000000000815250565b7f222c000000000000000000000000000000000000000000000000000000000000815250565b7f2261747472696275746573223a5b000000000000000000000000000000000000815250565b7f5d2c22696d616765223a22646174613a696d6167652f7376672b786d6c3b626160008201527f736536342c000000000000000000000000000000000000000000000000000000602082015250565b6000614529602583613c30565b9150614534826144cd565b602582019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000815250565b600061457082614317565b60098201915061458082896143b2565b915061458b82614435565b60028201915061459b8288613c3b565b91506145a68261445b565b6011820191506145b68287613c3b565b91506145c182614481565b6002820191506145d18286613c3b565b91506145dc826144a7565b600e820191506145ec8285613c3b565b91506145f78261451c565b91506146038284613c3b565b915061460e8261453f565b600282019150819050979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250565b600061465382614622565b601d820191506146638284613c3b565b915081905092915050565b60008082015250565b6000614684600183613c30565b915061468f8261466e565b600182019050919050565b600081519050919050565b600081905092915050565b60006146bb8261469a565b6146c581856146a5565b93506146d58185602086016135d3565b80840191505092915050565b60006146ec82614677565b91506146f882846146b0565b915081905092915050565b7f637265617465207820696e6e6f76617465207820696d70616374207820646f2060008201527f676f6f6400000000000000000000000000000000000000000000000000000000602082015250565b600061475f602483613c30565b915061476a82614703565b602482019050919050565b60006147818284613c3b565b915061478c82614752565b915081905092915050565b60006147a282613f67565b91506147ad83613f67565b9250828201905060ff8111156147c6576147c5613af9565b5b92915050565b7f7b2274726169745f74797065223a202247656e65726174696f6e7320556e6c6f60008201527f636b6564222c202276616c7565223a0000000000000000000000000000000000602082015250565b6000614828602f83613c30565b9150614833826147cc565b602f82019050919050565b7f7d2c7b2274726169745f74797065223a20224163746976652047656e6572617460008201527f696f6e222c202276616c7565223a000000000000000000000000000000000000602082015250565b600061489a602e83613c30565b91506148a58261483e565b602e82019050919050565b7f7d2c7b2274726169745f74797065223a202254696d6573205472616e7366657260008201527f726564222c202276616c7565223a220000000000000000000000000000000000602082015250565b600061490c602f83613c30565b9150614917826148b0565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a20224f776e65642053696e6365222c60008201527f202276616c7565223a2200000000000000000000000000000000000000000000602082015250565b600061497e602a83613c30565b915061498982614922565b602a82019050919050565b600061499f8261481b565b91506149ab8287613c3b565b91506149b68261488d565b91506149c28286613c3b565b91506149cd826148ff565b91506149d98285613c3b565b91506149e482614971565b91506149f08284613c3b565b915081905095945050505050565b7f227d2c7b2274726169745f74797065223a2022436f6c6f722047726f7570222c60008201527f202276616c7565223a2200000000000000000000000000000000000000000000602082015250565b6000614a5a602a83613c30565b9150614a65826149fe565b602a82019050919050565b7f227d2c7b2274726169745f74797065223a202250616c6574746520496e64657860008201527f222c202276616c7565223a220000000000000000000000000000000000000000602082015250565b6000614acc602c83613c30565b9150614ad782614a70565b602c82019050919050565b7f7b2274726169745f74797065223a2022536861706520436f756e74222c20227660008201527f616c7565223a2200000000000000000000000000000000000000000000000000602082015250565b6000614b3e602783613c30565b9150614b4982614ae2565b602782019050919050565b7f227d2c7b2274726169745f74797065223a2022436972636c6520436f756e742260008201527f2c202276616c7565223a22000000000000000000000000000000000000000000602082015250565b6000614bb0602b83613c30565b9150614bbb82614b54565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202253717561726520436f756e742260008201527f2c202276616c7565223a22000000000000000000000000000000000000000000602082015250565b6000614c22602b83613c30565b9150614c2d82614bc6565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a20224e6f6e6520436f756e74222c2060008201527f2276616c7565223a220000000000000000000000000000000000000000000000602082015250565b6000614c94602983613c30565b9150614c9f82614c38565b602982019050919050565b6000614cb6828a613c3b565b9150614cc182614a4d565b9150614ccd82896143b2565b9150614cd882614abf565b9150614ce48288613c3b565b9150614cef82614b31565b9150614cfb8287613c3b565b9150614d0682614ba3565b9150614d128286613c3b565b9150614d1d82614c15565b9150614d298285613c3b565b9150614d3482614c87565b9150614d408284613c3b565b915081905098975050505050505050565b7f227d2c7b2274726169745f74797065223a2022436f6d706c6578697479204c6560008201527f76656c222c202276616c7565223a220000000000000000000000000000000000602082015250565b6000614dad602f83613c30565b9150614db882614d51565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a2022476c6974636879222c2022766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b6000614e1f602683613c30565b9150614e2a82614dc3565b602682019050919050565b7f227d2c7b2274726169745f74797065223a20225370656369616c20547261697460008201527f222c202276616c7565223a220000000000000000000000000000000000000000602082015250565b6000614e91602c83613c30565b9150614e9c82614e35565b602c82019050919050565b6000614eb38287613c3b565b9150614ebe82614da0565b9150614eca8286613c3b565b9150614ed582614e12565b9150614ee18285613c3b565b9150614eec82614e84565b9150614ef88284613c3b565b915081905095945050505050565b6000614f11826136ee565b9150614f1c836136ee565b9250828202614f2a816136ee565b91508282048414831517614f4157614f40613af9565b5b5092915050565b7f6300000000000000000000000000000000000000000000000000000000000000600082015250565b6000614f7e600183613c30565b9150614f8982614f48565b600182019050919050565b600063ffffffff82169050919050565b60008160e01b9050919050565b6000614fbc82614fa4565b9050919050565b614fd4614fcf82614f94565b614fb1565b82525050565b7f80600e6000396000f30000000000000000000000000000000000000000000000600082015250565b6000615010600983613c30565b915061501b82614fda565b600982019050919050565b600061503182614f71565b915061503d8285614fc3565b60048201915061504c82615003565b915061505882846146b0565b91508190509392505050565b600060608201905061507960008301866136f8565b61508660208301856136f8565b61509360408301846136f8565b949350505050565b7f3c672069643d2261727422000000000000000000000000000000000000000000815250565b7f3c7265637420783d22302220793d2230222077696474683d223130302522206860008201527f65696768743d2231303025222066696c6c3d2200000000000000000000000000602082015250565b600061511d603383613c30565b9150615128826150c1565b603382019050919050565b7f222f3e0a0a3c672069643d227368617065732200000000000000000000000000815250565b60006151658287613c3b565b91506151708261509b565b600b820191506151808286613c3b565b915061518b82615110565b91506151978285613c3b565b91506151a282615133565b6013820191506151b28284613c3b565b915081905095945050505050565b7f3c672069643d22736861706547726f75705f0000000000000000000000000000815250565b7f222066696c6c3d22000000000000000000000000000000000000000000000000815250565b7f22207374726f6b653d2200000000000000000000000000000000000000000000815250565b7f22207374726f6b652d77696474683d223530223e0a0000000000000000000000815250565b7f3c2f673e0a0a0000000000000000000000000000000000000000000000000000815250565b600061528a8288613c3b565b9150615295826151c0565b6012820191506152a58287613c3b565b91506152b0826151e6565b6008820191506152c08286613c3b565b91506152cb8261520c565b600a820191506152db8285613c3b565b91506152e682615232565b6015820191506152f68284613c3b565b915061530182615258565b6006820191508190509695505050505050565b600061531f826151e6565b60088201915061532f8285613c3b565b915061533a8261520c565b600a8201915061534a8284613c3b565b91508190509392505050565b7f2c20000000000000000000000000000000000000000000000000000000000000815250565b60006153888285613c3b565b915061539382615356565b6002820191506153a38284613c3b565b91508190509392505050565b7f22207374726f6b652d77696474683d22313022207472616e73666f726d3d227460008201527f72616e736c617465280000000000000000000000000000000000000000000000602082015250565b600061540b602983613c30565b9150615416826153af565b602982019050919050565b600061542d8287613c3b565b9150615438826151c0565b6012820191506154488286613c3b565b91506154548285613c3b565b915061545f826153fe565b915061546b8284613c3b565b915081905095945050505050565b7f29207363616c6528000000000000000000000000000000000000000000000000815250565b7f2922203e0a000000000000000000000000000000000000000000000000000000815250565b60006154d18286613c3b565b91506154dc82615479565b6008820191506154ec8285613c3b565b91506154f78261549f565b6005820191506155078284613c3b565b915061551282615258565b600682019150819050949350505050565b7f0a0a3c2f7376673e000000000000000000000000000000000000000000000000815250565b60006155558288613c3b565b91506155618287613c3b565b915061556d8286613c3b565b91506155798285613c3b565b91506155858284613c3b565b915061559082615523565b6008820191508190509695505050505050565b7f697473206120676f6f6420646179000000000000000000000000000000000000815250565b7f746f2068617665206120676f6f64206461790000000000000000000000000000815250565b60006155fa826155a3565b600e8201915061560a8284613c3b565b9150615615826155c9565b60128201915081905092915050565b600061563082856143b2565b915061563b82614435565b60028201915061564b8284613c3b565b91508190509392505050565b7f7c00000000000000000000000000000000000000000000000000000000000000815250565b6000615689828c613c3b565b915061569482615657565b6001820191506156a4828b613c3b565b91506156af82615657565b6001820191506156bf828a613c3b565b91506156ca82615657565b6001820191506156da8289613c3b565b91506156e582615657565b6001820191506156f58288613c3b565b915061570082615657565b6001820191506157108287613c3b565b915061571b82615657565b60018201915061572b8286613c3b565b915061573682615657565b60018201915061574682856143b2565b915061575182615657565b6001820191506157618284613c3b565b915061576c82615657565b6001820191508190509a9950505050505050505050565b600061578f828f613c3b565b915061579b828e613c3b565b91506157a682615657565b6001820191506157b6828d613c3b565b91506157c182615657565b6001820191506157d1828c613c3b565b91506157dc82615657565b6001820191506157ec828b613c3b565b91506157f782615657565b600182019150615807828a613c3b565b915061581282615657565b6001820191506158228289613c3b565b915061582d82615657565b60018201915061583d8288613c3b565b915061584882615657565b6001820191506158588287613c3b565b915061586382615657565b6001820191506158738286613c3b565b915061587e82615657565b60018201915061588e8285613c3b565b915061589982615657565b6001820191506158a98284613c3b565b91508190509d9c50505050505050505050505050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006158f56020836137d7565b9150615900826158bf565b602082019050919050565b60006020820190508181036000830152615924816158e8565b905091905056fe77686f207361696420636972636c657320616e6420737175617265732063616e742067657420616c6f6e673f2077656c636f6d6520746f2067656e2d312077686572652074686573652074776f2073686170657320636f6d6520746f67657468657220696e2070657266656374206861726d6f6e792e20796f75206b6e6f7720746865206472696c6c2e2e2e20656e6a6f7920746865206172742c206578706c6f72652074686520636f64652c20616e6420646f6e7420666f7267657420746f20636c69636b2061726f756e6420666f7220736f6d652065787472612066756e2120f09f98894142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220ceae77a067acd3d8d80d55458e0906bf0b913bac991f18a943e1f8e1e658362864736f6c63430008130033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.