{
  "fileName": "App.sol",
  "contractName": "App",
  "source": "pragma solidity ^0.6.0;\n// SPDX-License-Identifier: MIT\n// SPDX-License-Identifier: MIT\n\nimport \"./ImplementationProvider.sol\";\nimport \"./Package.sol\";\nimport \"../upgradeability/AdminUpgradeabilityProxy.sol\";\nimport \"../ownership/Ownable.sol\";\n\n/**\n * @title App\n * @dev Contract for upgradeable applications.\n * It handles the creation of proxies.\n */\ncontract App is OpenZeppelinUpgradesOwnable {\n  /**\n   * @dev Emitted when a new proxy is created.\n   * @param proxy Address of the created proxy.\n   */\n  event ProxyCreated(address proxy);\n\n  /**\n   * @dev Emitted when a package dependency is changed in the application.\n   * @param providerName Name of the package that changed.\n   * @param package Address of the package associated to the name.\n   * @param version Version of the package in use.\n   */\n  event PackageChanged(string providerName, address package, uint64[3] version);\n\n  /**\n   * @dev Tracks a package in a particular version, used for retrieving implementations\n   */\n  struct ProviderInfo {\n    Package package;\n    uint64[3] version;\n  }\n\n  /**\n   * @dev Maps from dependency name to a tuple of package and version\n   */\n  mapping(string => ProviderInfo) internal providers;\n\n  /**\n   * @dev Constructor function.\n   */\n  constructor() public { }\n\n  /**\n   * @dev Returns the provider for a given package name, or zero if not set.\n   * @param packageName Name of the package to be retrieved.\n   * @return provider The provider.\n   */\n  function getProvider(string memory packageName) public view returns (ImplementationProvider provider) {\n    ProviderInfo storage info = providers[packageName];\n    if (address(info.package) == address(0)) return ImplementationProvider(0);\n    return ImplementationProvider(info.package.getContract(info.version));\n  }\n\n  /**\n   * @dev Returns information on a package given its name.\n   * @param packageName Name of the package to be queried.\n   * @return A tuple with the package address and pinned version given a package name, or zero if not set\n   */\n  function getPackage(string memory packageName) public view returns (Package, uint64[3] memory) {\n    ProviderInfo storage info = providers[packageName];\n    return (info.package, info.version);\n  }\n\n  /**\n   * @dev Sets a package in a specific version as a dependency for this application.\n   * Requires the version to be present in the package.\n   * @param packageName Name of the package to set or overwrite.\n   * @param package Address of the package to register.\n   * @param version Version of the package to use in this application.\n   */\n  function setPackage(string memory packageName, Package package, uint64[3] memory version) public onlyOwner {\n    require(package.hasVersion(version), \"The requested version must be registered in the given package\");\n    providers[packageName] = ProviderInfo(package, version);\n    emit PackageChanged(packageName, address(package), version);\n  }\n\n  /**\n   * @dev Unsets a package given its name.\n   * Reverts if the package is not set in the application.\n   * @param packageName Name of the package to remove.\n   */\n  function unsetPackage(string memory packageName) public onlyOwner {\n    require(address(providers[packageName].package) != address(0), \"Package to unset not found\");\n    delete providers[packageName];\n    emit PackageChanged(packageName, address(0), [uint64(0), uint64(0), uint64(0)]);\n  }\n\n  /**\n   * @dev Returns the implementation address for a given contract name, provided by the `ImplementationProvider`.\n   * @param packageName Name of the package where the contract is contained.\n   * @param contractName Name of the contract.\n   * @return Address where the contract is implemented.\n   */\n  function getImplementation(string memory packageName, string memory contractName) public view returns (address) {\n    ImplementationProvider provider = getProvider(packageName);\n    if (address(provider) == address(0)) return address(0);\n    return provider.getImplementation(contractName);\n  }\n\n  /**\n   * @dev Creates a new proxy for the given contract and forwards a function call to it.\n   * This is useful to initialize the proxied contract.\n   * @param packageName Name of the package where the contract is contained.\n   * @param contractName Name of the contract.\n   * @param admin Address of the proxy administrator.\n   * @param data Data to send as msg.data to the corresponding implementation to initialize the proxied contract.\n   * It should include the signature and the parameters of the function to be called, as described in\n   * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.\n   * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped.\n   * @return Address of the new proxy.\n   */\n   function create(string memory packageName, string memory contractName, address admin, bytes memory data) payable public returns (AdminUpgradeabilityProxy) {\n     address implementation = getImplementation(packageName, contractName);\n     AdminUpgradeabilityProxy proxy = (new AdminUpgradeabilityProxy){value:msg.value}(implementation, admin, data);\n     emit ProxyCreated(address(proxy));\n     return proxy;\n  }\n}\n",
  "sourcePath": "contracts/application/App.sol",
  "sourceMap": "353:4846:1:-:0;;;1246:24;;;;;;;;;;;978:115:33;1021:10;1012:6;;:19;;;;;;;;;;;;;;;;;;1079:6;;;;;;;;;;;1046:40;;1075:1;1046:40;;;;;;;;;;;;978:115;1246:24:1;353:4846;;;;;;;;;",
  "deployedSourceMap": "353:4846:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3680:294;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1460:317;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1844:137:33;;;;;;;;;;;;;:::i;:::-;;2563:345:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2017:197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1156:77:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1476:90;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3081:289:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4786:411;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2152:107:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3680:294:1;3783:7;3798:31;3832:24;3844:11;3832;:24;;:::i;:::-;3798:58;;3895:1;3866:31;;3874:8;3866:31;;;3862:54;;;3914:1;3899:17;;;;;3862:54;3929:8;:26;;;3956:12;3929:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3922:47;;;;;3680:294;;;;;;:::o;1460:317::-;1529:31;1568:25;1596:9;;;1606:11;1596:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1568:50;;1661:1;1628:35;;1636:4;:12;;;;;;;;;;;;1628:35;;;1624:73;;;1695:1;1665:32;;;;;1624:73;1733:4;:12;;;;;;;;;;;;:24;;;1758:4;:12;;;;1733:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1703:69;;;;;1460:317;;;;;:::o;1844:137:33:-;1360:9;:7;:9;;:::i;:::-;1352:18;;;;;;;;1942:1:::1;1905:40;;1926:6;;;;;;;;;;;1905:40;;;;;;;;;;;;1972:1;1955:6;;:19;;;;;;;;;;;;;;;;;;1380:1;1844:137:::0;:::o;2563:345:1:-;1360:9:33;:7;:9;;:::i;:::-;1352:18;;;;;;;;2684:7:1::1;:18;;;2703:7;2684:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2676:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2808:30;;;;;;;;2821:7;2808:30;;;;;;2830:7;2808:30;;;;;2783:9;;;2793:11;2783:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;2849:54;2864:11;2885:7;2895;2849:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1380:1:33;2563:345:1::0;;;;:::o;2017:197::-;2085:7;2094:16;;:::i;:::-;2118:25;2146:9;;;2156:11;2146:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2118:50;;2182:4;:12;;;;;;;;;;;;2196:4;:12;;;;2174:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2017:197;;;;;:::o;1156:77:33:-;1194:7;1220:6;;;;;;;;;;;1213:13;;;;1156:77;;:::o;1476:90::-;1516:4;1553:6;;;;;;;;;;;1539:20;;:10;:20;;;1532:27;;;;1476:90;;:::o;3081:289:1:-;1360:9:33;:7;:9;;:::i;:::-;1352:18;;;;;;;;3212:1:1::1;3161:53;;3169:9;;;3179:11;3169:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;3161:53;;;;3153:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3258:9;;;3268:11;3258:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3251:29;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3291:74;3306:11;3327:1;3291:74;;;;;;;;3339:1;3291:74;;;;;;;;3350:1;3291:74;;;;;;;;3361:1;3291:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1380:1:33;3081:289:1::0;;:::o;4786:411::-;4915:24;4948:22;4973:44;4991:11;5004:12;4973:17;:44;;:::i;:::-;4948:69;;5024:30;5094:9;5105:14;5121:5;5128:4;5057:76;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5024:109;;5145:28;5166:5;5145:28;;;;;;;;;;;;;;;;;;;;;;5187:5;5180:12;;;;;;4786:411;;;;;;;;;:::o;2152:107:33:-;1360:9;:7;:9;;:::i;:::-;1352:18;;;;;;;;2224:28:::1;2243:8;2224:18;:28;;:::i;:::-;1380:1;2152:107:::0;;:::o;2403:183::-;2496:1;2476:22;;:8;:22;;;;2468:31;;;;;;;;2543:8;2514:38;;2535:6;;;;;;;;;;;2514:38;;;;;;;;;;;;2571:8;2562:6;;:17;;;;;;;;;;;;;;;;;;2403:183;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "string",
          "name": "providerName",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "package",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint64[3]",
          "name": "version",
          "type": "uint64[3]"
        }
      ],
      "name": "PackageChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "proxy",
          "type": "address"
        }
      ],
      "name": "ProxyCreated",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "packageName",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "contractName",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "admin",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "create",
      "outputs": [
        {
          "internalType": "contract AdminUpgradeabilityProxy",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "packageName",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "contractName",
          "type": "string"
        }
      ],
      "name": "getImplementation",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "packageName",
          "type": "string"
        }
      ],
      "name": "getPackage",
      "outputs": [
        {
          "internalType": "contract Package",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint64[3]",
          "name": "",
          "type": "uint64[3]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "packageName",
          "type": "string"
        }
      ],
      "name": "getProvider",
      "outputs": [
        {
          "internalType": "contract ImplementationProvider",
          "name": "provider",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isOwner",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "packageName",
          "type": "string"
        },
        {
          "internalType": "contract Package",
          "name": "package",
          "type": "address"
        },
        {
          "internalType": "uint64[3]",
          "name": "version",
          "type": "uint64[3]"
        }
      ],
      "name": "setPackage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "packageName",
          "type": "string"
        }
      ],
      "name": "unsetPackage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "ast": {
    "absolutePath": "contracts/application/App.sol",
    "exportedSymbols": {
      "App": [
        354
      ]
    },
    "id": 355,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 76,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:1"
      },
      {
        "absolutePath": "contracts/application/ImplementationProvider.sol",
        "file": "./ImplementationProvider.sol",
        "id": 77,
        "nodeType": "ImportDirective",
        "scope": 355,
        "sourceUnit": 497,
        "src": "89:38:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/application/Package.sol",
        "file": "./Package.sol",
        "id": 78,
        "nodeType": "ImportDirective",
        "scope": 355,
        "sourceUnit": 850,
        "src": "128:23:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/upgradeability/AdminUpgradeabilityProxy.sol",
        "file": "../upgradeability/AdminUpgradeabilityProxy.sol",
        "id": 79,
        "nodeType": "ImportDirective",
        "scope": 355,
        "sourceUnit": 5850,
        "src": "152:56:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/ownership/Ownable.sol",
        "file": "../ownership/Ownable.sol",
        "id": 80,
        "nodeType": "ImportDirective",
        "scope": 355,
        "sourceUnit": 5785,
        "src": "209:34:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 82,
              "name": "OpenZeppelinUpgradesOwnable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 5784,
              "src": "369:27:1",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OpenZeppelinUpgradesOwnable_$5784",
                "typeString": "contract OpenZeppelinUpgradesOwnable"
              }
            },
            "id": 83,
            "nodeType": "InheritanceSpecifier",
            "src": "369:27:1"
          }
        ],
        "contractDependencies": [
          5784,
          5849
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 81,
          "nodeType": "StructuredDocumentation",
          "src": "245:107:1",
          "text": " @title App\n @dev Contract for upgradeable applications.\n It handles the creation of proxies."
        },
        "fullyImplemented": true,
        "id": 354,
        "linearizedBaseContracts": [
          354,
          5784
        ],
        "name": "App",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "documentation": {
              "id": 84,
              "nodeType": "StructuredDocumentation",
              "src": "401:104:1",
              "text": " @dev Emitted when a new proxy is created.\n @param proxy Address of the created proxy."
            },
            "id": 88,
            "name": "ProxyCreated",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 87,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 86,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "proxy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 88,
                  "src": "527:13:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 85,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "527:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "526:15:1"
            },
            "src": "508:34:1"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 89,
              "nodeType": "StructuredDocumentation",
              "src": "546:261:1",
              "text": " @dev Emitted when a package dependency is changed in the application.\n @param providerName Name of the package that changed.\n @param package Address of the package associated to the name.\n @param version Version of the package in use."
            },
            "id": 99,
            "name": "PackageChanged",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 98,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 91,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "providerName",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 99,
                  "src": "831:19:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 90,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "831:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 93,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "package",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 99,
                  "src": "852:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 92,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "852:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 97,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "version",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 99,
                  "src": "869:17:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                    "typeString": "uint64[3]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 94,
                      "name": "uint64",
                      "nodeType": "ElementaryTypeName",
                      "src": "869:6:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "id": 96,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "33",
                      "id": 95,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "876:1:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_3_by_1",
                        "typeString": "int_const 3"
                      },
                      "value": "3"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "869:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                      "typeString": "uint64[3]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "830:57:1"
            },
            "src": "810:78:1"
          },
          {
            "canonicalName": "App.ProviderInfo",
            "id": 106,
            "members": [
              {
                "constant": false,
                "id": 101,
                "mutability": "mutable",
                "name": "package",
                "nodeType": "VariableDeclaration",
                "overrides": null,
                "scope": 106,
                "src": "1018:15:1",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_contract$_Package_$849",
                  "typeString": "contract Package"
                },
                "typeName": {
                  "contractScope": null,
                  "id": 100,
                  "name": "Package",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 849,
                  "src": "1018:7:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Package_$849",
                    "typeString": "contract Package"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 105,
                "mutability": "mutable",
                "name": "version",
                "nodeType": "VariableDeclaration",
                "overrides": null,
                "scope": 106,
                "src": "1039:17:1",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                  "typeString": "uint64[3]"
                },
                "typeName": {
                  "baseType": {
                    "id": 102,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "1039:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "id": 104,
                  "length": {
                    "argumentTypes": null,
                    "hexValue": "33",
                    "id": 103,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1046:1:1",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_3_by_1",
                      "typeString": "int_const 3"
                    },
                    "value": "3"
                  },
                  "nodeType": "ArrayTypeName",
                  "src": "1039:9:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                    "typeString": "uint64[3]"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "ProviderInfo",
            "nodeType": "StructDefinition",
            "scope": 354,
            "src": "992:69:1",
            "visibility": "public"
          },
          {
            "constant": false,
            "documentation": {
              "id": 107,
              "nodeType": "StructuredDocumentation",
              "src": "1065:79:1",
              "text": " @dev Maps from dependency name to a tuple of package and version"
            },
            "id": 111,
            "mutability": "mutable",
            "name": "providers",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 354,
            "src": "1147:50:1",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_ProviderInfo_$106_storage_$",
              "typeString": "mapping(string => struct App.ProviderInfo)"
            },
            "typeName": {
              "id": 110,
              "keyType": {
                "id": 108,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "1155:6:1",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "nodeType": "Mapping",
              "src": "1147:31:1",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_ProviderInfo_$106_storage_$",
                "typeString": "mapping(string => struct App.ProviderInfo)"
              },
              "valueType": {
                "contractScope": null,
                "id": 109,
                "name": "ProviderInfo",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 106,
                "src": "1165:12:1",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_ProviderInfo_$106_storage_ptr",
                  "typeString": "struct App.ProviderInfo"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 115,
              "nodeType": "Block",
              "src": "1267:3:1",
              "statements": []
            },
            "documentation": {
              "id": 112,
              "nodeType": "StructuredDocumentation",
              "src": "1202:41:1",
              "text": " @dev Constructor function."
            },
            "id": 116,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 113,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1257:2:1"
            },
            "returnParameters": {
              "id": 114,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1267:0:1"
            },
            "scope": 354,
            "src": "1246:24:1",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 154,
              "nodeType": "Block",
              "src": "1562:215:1",
              "statements": [
                {
                  "assignments": [
                    125
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 125,
                      "mutability": "mutable",
                      "name": "info",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 154,
                      "src": "1568:25:1",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$106_storage_ptr",
                        "typeString": "struct App.ProviderInfo"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 124,
                        "name": "ProviderInfo",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 106,
                        "src": "1568:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_ProviderInfo_$106_storage_ptr",
                          "typeString": "struct App.ProviderInfo"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 129,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 126,
                      "name": "providers",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 111,
                      "src": "1596:9:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_ProviderInfo_$106_storage_$",
                        "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                      }
                    },
                    "id": 128,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 127,
                      "name": "packageName",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 119,
                      "src": "1606:11:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "1596:22:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_ProviderInfo_$106_storage",
                      "typeString": "struct App.ProviderInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1568:50:1"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 139,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 132,
                            "name": "info",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 125,
                            "src": "1636:4:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_ProviderInfo_$106_storage_ptr",
                              "typeString": "struct App.ProviderInfo storage pointer"
                            }
                          },
                          "id": 133,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "package",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 101,
                          "src": "1636:12:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Package_$849",
                            "typeString": "contract Package"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_Package_$849",
                            "typeString": "contract Package"
                          }
                        ],
                        "id": 131,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1628:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 130,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1628:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": null,
                            "typeString": null
                          }
                        }
                      },
                      "id": 134,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1628:21:1",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 137,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1661:1:1",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 136,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1653:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 135,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1653:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": null,
                            "typeString": null
                          }
                        }
                      },
                      "id": 138,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1653:10:1",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "1628:35:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 144,
                  "nodeType": "IfStatement",
                  "src": "1624:73:1",
                  "trueBody": {
                    "expression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 141,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1695:1:1",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 140,
                        "name": "ImplementationProvider",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 496,
                        "src": "1672:22:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_ImplementationProvider_$496_$",
                          "typeString": "type(contract ImplementationProvider)"
                        }
                      },
                      "id": 142,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1672:25:1",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ImplementationProvider_$496",
                        "typeString": "contract ImplementationProvider"
                      }
                    },
                    "functionReturnParameters": 123,
                    "id": 143,
                    "nodeType": "Return",
                    "src": "1665:32:1"
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 149,
                              "name": "info",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 125,
                              "src": "1758:4:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_ProviderInfo_$106_storage_ptr",
                                "typeString": "struct App.ProviderInfo storage pointer"
                              }
                            },
                            "id": 150,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "version",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 105,
                            "src": "1758:12:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint64_$3_storage",
                              "typeString": "uint64[3] storage ref"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_array$_t_uint64_$3_storage",
                              "typeString": "uint64[3] storage ref"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 146,
                              "name": "info",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 125,
                              "src": "1733:4:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_ProviderInfo_$106_storage_ptr",
                                "typeString": "struct App.ProviderInfo storage pointer"
                              }
                            },
                            "id": 147,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "package",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 101,
                            "src": "1733:12:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Package_$849",
                              "typeString": "contract Package"
                            }
                          },
                          "id": 148,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "getContract",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 581,
                          "src": "1733:24:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_array$_t_uint64_$3_memory_ptr_$returns$_t_address_$",
                            "typeString": "function (uint64[3] memory) view external returns (address)"
                          }
                        },
                        "id": 151,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1733:38:1",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 145,
                      "name": "ImplementationProvider",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 496,
                      "src": "1710:22:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_contract$_ImplementationProvider_$496_$",
                        "typeString": "type(contract ImplementationProvider)"
                      }
                    },
                    "id": 152,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1710:62:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ImplementationProvider_$496",
                      "typeString": "contract ImplementationProvider"
                    }
                  },
                  "functionReturnParameters": 123,
                  "id": 153,
                  "nodeType": "Return",
                  "src": "1703:69:1"
                }
              ]
            },
            "documentation": {
              "id": 117,
              "nodeType": "StructuredDocumentation",
              "src": "1274:183:1",
              "text": " @dev Returns the provider for a given package name, or zero if not set.\n @param packageName Name of the package to be retrieved.\n @return provider The provider."
            },
            "functionSelector": "50cadc85",
            "id": 155,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getProvider",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 120,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 119,
                  "mutability": "mutable",
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 155,
                  "src": "1481:25:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 118,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1481:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1480:27:1"
            },
            "returnParameters": {
              "id": 123,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 122,
                  "mutability": "mutable",
                  "name": "provider",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 155,
                  "src": "1529:31:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ImplementationProvider_$496",
                    "typeString": "contract ImplementationProvider"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 121,
                    "name": "ImplementationProvider",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 496,
                    "src": "1529:22:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ImplementationProvider_$496",
                      "typeString": "contract ImplementationProvider"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1528:33:1"
            },
            "scope": 354,
            "src": "1460:317:1",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 179,
              "nodeType": "Block",
              "src": "2112:102:1",
              "statements": [
                {
                  "assignments": [
                    168
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 168,
                      "mutability": "mutable",
                      "name": "info",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 179,
                      "src": "2118:25:1",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$106_storage_ptr",
                        "typeString": "struct App.ProviderInfo"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 167,
                        "name": "ProviderInfo",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 106,
                        "src": "2118:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_ProviderInfo_$106_storage_ptr",
                          "typeString": "struct App.ProviderInfo"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 172,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 169,
                      "name": "providers",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 111,
                      "src": "2146:9:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_ProviderInfo_$106_storage_$",
                        "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                      }
                    },
                    "id": 171,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 170,
                      "name": "packageName",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 158,
                      "src": "2156:11:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2146:22:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_ProviderInfo_$106_storage",
                      "typeString": "struct App.ProviderInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2118:50:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 173,
                          "name": "info",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 168,
                          "src": "2182:4:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_ProviderInfo_$106_storage_ptr",
                            "typeString": "struct App.ProviderInfo storage pointer"
                          }
                        },
                        "id": 174,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "package",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 101,
                        "src": "2182:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Package_$849",
                          "typeString": "contract Package"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 175,
                          "name": "info",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 168,
                          "src": "2196:4:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_ProviderInfo_$106_storage_ptr",
                            "typeString": "struct App.ProviderInfo storage pointer"
                          }
                        },
                        "id": 176,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "version",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 105,
                        "src": "2196:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint64_$3_storage",
                          "typeString": "uint64[3] storage ref"
                        }
                      }
                    ],
                    "id": 177,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "2181:28:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_contract$_Package_$849_$_t_array$_t_uint64_$3_storage_$",
                      "typeString": "tuple(contract Package,uint64[3] storage ref)"
                    }
                  },
                  "functionReturnParameters": 166,
                  "id": 178,
                  "nodeType": "Return",
                  "src": "2174:35:1"
                }
              ]
            },
            "documentation": {
              "id": 156,
              "nodeType": "StructuredDocumentation",
              "src": "1781:233:1",
              "text": " @dev Returns information on a package given its name.\n @param packageName Name of the package to be queried.\n @return A tuple with the package address and pinned version given a package name, or zero if not set"
            },
            "functionSelector": "87c60483",
            "id": 180,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getPackage",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 159,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 158,
                  "mutability": "mutable",
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 180,
                  "src": "2037:25:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 157,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2037:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2036:27:1"
            },
            "returnParameters": {
              "id": 166,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 161,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 180,
                  "src": "2085:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Package_$849",
                    "typeString": "contract Package"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 160,
                    "name": "Package",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 849,
                    "src": "2085:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Package_$849",
                      "typeString": "contract Package"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 165,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 180,
                  "src": "2094:16:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                    "typeString": "uint64[3]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 162,
                      "name": "uint64",
                      "nodeType": "ElementaryTypeName",
                      "src": "2094:6:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "id": 164,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "33",
                      "id": 163,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2101:1:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_3_by_1",
                        "typeString": "int_const 3"
                      },
                      "value": "3"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "2094:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                      "typeString": "uint64[3]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2084:27:1"
            },
            "scope": 354,
            "src": "2017:197:1",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 220,
              "nodeType": "Block",
              "src": "2670:238:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 197,
                            "name": "version",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 189,
                            "src": "2703:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                              "typeString": "uint64[3] memory"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                              "typeString": "uint64[3] memory"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 195,
                            "name": "package",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 185,
                            "src": "2684:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Package_$849",
                              "typeString": "contract Package"
                            }
                          },
                          "id": 196,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "hasVersion",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 747,
                          "src": "2684:18:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_array$_t_uint64_$3_memory_ptr_$returns$_t_bool_$",
                            "typeString": "function (uint64[3] memory) view external returns (bool)"
                          }
                        },
                        "id": 198,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2684:27:1",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546865207265717565737465642076657273696f6e206d757374206265207265676973746572656420696e2074686520676976656e207061636b616765",
                        "id": 199,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2713:63:1",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_6e9b26c5b88c1d0d268a79a49255a96dbe9152f3c69df83cee9951ea1c032fdb",
                          "typeString": "literal_string \"The requested version must be registered in the given package\""
                        },
                        "value": "The requested version must be registered in the given package"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_6e9b26c5b88c1d0d268a79a49255a96dbe9152f3c69df83cee9951ea1c032fdb",
                          "typeString": "literal_string \"The requested version must be registered in the given package\""
                        }
                      ],
                      "id": 194,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2676:7:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 200,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2676:101:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 201,
                  "nodeType": "ExpressionStatement",
                  "src": "2676:101:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 209,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 202,
                        "name": "providers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 111,
                        "src": "2783:9:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_ProviderInfo_$106_storage_$",
                          "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                        }
                      },
                      "id": 204,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 203,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 183,
                        "src": "2793:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2783:22:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$106_storage",
                        "typeString": "struct App.ProviderInfo storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 206,
                          "name": "package",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 185,
                          "src": "2821:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Package_$849",
                            "typeString": "contract Package"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 207,
                          "name": "version",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 189,
                          "src": "2830:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                            "typeString": "uint64[3] memory"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_Package_$849",
                            "typeString": "contract Package"
                          },
                          {
                            "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                            "typeString": "uint64[3] memory"
                          }
                        ],
                        "id": 205,
                        "name": "ProviderInfo",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 106,
                        "src": "2808:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_struct$_ProviderInfo_$106_storage_ptr_$",
                          "typeString": "type(struct App.ProviderInfo storage pointer)"
                        }
                      },
                      "id": 208,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "structConstructorCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2808:30:1",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$106_memory_ptr",
                        "typeString": "struct App.ProviderInfo memory"
                      }
                    },
                    "src": "2783:55:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_ProviderInfo_$106_storage",
                      "typeString": "struct App.ProviderInfo storage ref"
                    }
                  },
                  "id": 210,
                  "nodeType": "ExpressionStatement",
                  "src": "2783:55:1"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 212,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 183,
                        "src": "2864:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 215,
                            "name": "package",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 185,
                            "src": "2885:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Package_$849",
                              "typeString": "contract Package"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_Package_$849",
                              "typeString": "contract Package"
                            }
                          ],
                          "id": 214,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "2877:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 213,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "2877:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 216,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2877:16:1",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 217,
                        "name": "version",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 189,
                        "src": "2895:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                          "typeString": "uint64[3] memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                          "typeString": "uint64[3] memory"
                        }
                      ],
                      "id": 211,
                      "name": "PackageChanged",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 99,
                      "src": "2849:14:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_string_memory_ptr_$_t_address_$_t_array$_t_uint64_$3_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,address,uint64[3] memory)"
                      }
                    },
                    "id": 218,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2849:54:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 219,
                  "nodeType": "EmitStatement",
                  "src": "2844:59:1"
                }
              ]
            },
            "documentation": {
              "id": 181,
              "nodeType": "StructuredDocumentation",
              "src": "2218:342:1",
              "text": " @dev Sets a package in a specific version as a dependency for this application.\n Requires the version to be present in the package.\n @param packageName Name of the package to set or overwrite.\n @param package Address of the package to register.\n @param version Version of the package to use in this application."
            },
            "functionSelector": "71eb64cc",
            "id": 221,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 192,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 191,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 5711,
                  "src": "2660:9:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2660:9:1"
              }
            ],
            "name": "setPackage",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 190,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 183,
                  "mutability": "mutable",
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 221,
                  "src": "2583:25:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 182,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2583:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 185,
                  "mutability": "mutable",
                  "name": "package",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 221,
                  "src": "2610:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Package_$849",
                    "typeString": "contract Package"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 184,
                    "name": "Package",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 849,
                    "src": "2610:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Package_$849",
                      "typeString": "contract Package"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 189,
                  "mutability": "mutable",
                  "name": "version",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 221,
                  "src": "2627:24:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                    "typeString": "uint64[3]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 186,
                      "name": "uint64",
                      "nodeType": "ElementaryTypeName",
                      "src": "2627:6:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "id": 188,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "33",
                      "id": 187,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2634:1:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_3_by_1",
                        "typeString": "int_const 3"
                      },
                      "value": "3"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "2627:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                      "typeString": "uint64[3]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2582:70:1"
            },
            "returnParameters": {
              "id": 193,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2670:0:1"
            },
            "scope": 354,
            "src": "2563:345:1",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 271,
              "nodeType": "Block",
              "src": "3147:223:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 241,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 232,
                                  "name": "providers",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 111,
                                  "src": "3169:9:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_ProviderInfo_$106_storage_$",
                                    "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                                  }
                                },
                                "id": 234,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 233,
                                  "name": "packageName",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 224,
                                  "src": "3179:11:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "3169:22:1",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_ProviderInfo_$106_storage",
                                  "typeString": "struct App.ProviderInfo storage ref"
                                }
                              },
                              "id": 235,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "package",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 101,
                              "src": "3169:30:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_Package_$849",
                                "typeString": "contract Package"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_Package_$849",
                                "typeString": "contract Package"
                              }
                            ],
                            "id": 231,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3161:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 230,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "3161:7:1",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 236,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3161:39:1",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 239,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3212:1:1",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 238,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3204:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 237,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "3204:7:1",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 240,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3204:10:1",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "3161:53:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5061636b61676520746f20756e736574206e6f7420666f756e64",
                        "id": 242,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3216:28:1",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_3ae493df729b5cccebf4261a82c4432beb82c364d1afb7d58bdfea7fd27d9332",
                          "typeString": "literal_string \"Package to unset not found\""
                        },
                        "value": "Package to unset not found"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_3ae493df729b5cccebf4261a82c4432beb82c364d1afb7d58bdfea7fd27d9332",
                          "typeString": "literal_string \"Package to unset not found\""
                        }
                      ],
                      "id": 229,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "3153:7:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 243,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3153:92:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 244,
                  "nodeType": "ExpressionStatement",
                  "src": "3153:92:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 248,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "delete",
                    "prefix": true,
                    "src": "3251:29:1",
                    "subExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 245,
                        "name": "providers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 111,
                        "src": "3258:9:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_string_memory_ptr_$_t_struct$_ProviderInfo_$106_storage_$",
                          "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                        }
                      },
                      "id": 247,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 246,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 224,
                        "src": "3268:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "3258:22:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$106_storage",
                        "typeString": "struct App.ProviderInfo storage ref"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 249,
                  "nodeType": "ExpressionStatement",
                  "src": "3251:29:1"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 251,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 224,
                        "src": "3306:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 254,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3327:1:1",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            }
                          ],
                          "id": 253,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "3319:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 252,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "3319:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 255,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3319:10:1",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "components": [
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 258,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3339:1:1",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 257,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3332:6:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": {
                                "id": 256,
                                "name": "uint64",
                                "nodeType": "ElementaryTypeName",
                                "src": "3332:6:1",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 259,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3332:9:1",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 262,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3350:1:1",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 261,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3343:6:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": {
                                "id": 260,
                                "name": "uint64",
                                "nodeType": "ElementaryTypeName",
                                "src": "3343:6:1",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 263,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3343:9:1",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 266,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3361:1:1",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 265,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3354:6:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": {
                                "id": 264,
                                "name": "uint64",
                                "nodeType": "ElementaryTypeName",
                                "src": "3354:6:1",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 267,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3354:9:1",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          }
                        ],
                        "id": 268,
                        "isConstant": false,
                        "isInlineArray": true,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "3331:33:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                          "typeString": "uint64[3] memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                          "typeString": "uint64[3] memory"
                        }
                      ],
                      "id": 250,
                      "name": "PackageChanged",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 99,
                      "src": "3291:14:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_string_memory_ptr_$_t_address_$_t_array$_t_uint64_$3_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,address,uint64[3] memory)"
                      }
                    },
                    "id": 269,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3291:74:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 270,
                  "nodeType": "EmitStatement",
                  "src": "3286:79:1"
                }
              ]
            },
            "documentation": {
              "id": 222,
              "nodeType": "StructuredDocumentation",
              "src": "2912:166:1",
              "text": " @dev Unsets a package given its name.\n Reverts if the package is not set in the application.\n @param packageName Name of the package to remove."
            },
            "functionSelector": "ad358d99",
            "id": 272,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 227,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 226,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 5711,
                  "src": "3137:9:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "3137:9:1"
              }
            ],
            "name": "unsetPackage",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 225,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 224,
                  "mutability": "mutable",
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 272,
                  "src": "3103:25:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 223,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3103:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3102:27:1"
            },
            "returnParameters": {
              "id": 228,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3147:0:1"
            },
            "scope": 354,
            "src": "3081:289:1",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 308,
              "nodeType": "Block",
              "src": "3792:182:1",
              "statements": [
                {
                  "assignments": [
                    283
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 283,
                      "mutability": "mutable",
                      "name": "provider",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 308,
                      "src": "3798:31:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ImplementationProvider_$496",
                        "typeString": "contract ImplementationProvider"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 282,
                        "name": "ImplementationProvider",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 496,
                        "src": "3798:22:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ImplementationProvider_$496",
                          "typeString": "contract ImplementationProvider"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 287,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 285,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 275,
                        "src": "3844:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 284,
                      "name": "getProvider",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 155,
                      "src": "3832:11:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$returns$_t_contract$_ImplementationProvider_$496_$",
                        "typeString": "function (string memory) view returns (contract ImplementationProvider)"
                      }
                    },
                    "id": 286,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3832:24:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ImplementationProvider_$496",
                      "typeString": "contract ImplementationProvider"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3798:58:1"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 296,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 290,
                          "name": "provider",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 283,
                          "src": "3874:8:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ImplementationProvider_$496",
                            "typeString": "contract ImplementationProvider"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_ImplementationProvider_$496",
                            "typeString": "contract ImplementationProvider"
                          }
                        ],
                        "id": 289,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3866:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 288,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3866:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": null,
                            "typeString": null
                          }
                        }
                      },
                      "id": 291,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3866:17:1",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 294,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3895:1:1",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 293,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3887:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 292,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3887:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": null,
                            "typeString": null
                          }
                        }
                      },
                      "id": 295,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3887:10:1",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "src": "3866:31:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 302,
                  "nodeType": "IfStatement",
                  "src": "3862:54:1",
                  "trueBody": {
                    "expression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 299,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3914:1:1",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 298,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3906:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 297,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3906:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": null,
                            "typeString": null
                          }
                        }
                      },
                      "id": 300,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3906:10:1",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address_payable",
                        "typeString": "address payable"
                      }
                    },
                    "functionReturnParameters": 281,
                    "id": 301,
                    "nodeType": "Return",
                    "src": "3899:17:1"
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 305,
                        "name": "contractName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 277,
                        "src": "3956:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 303,
                        "name": "provider",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 283,
                        "src": "3929:8:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ImplementationProvider_$496",
                          "typeString": "contract ImplementationProvider"
                        }
                      },
                      "id": 304,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "getImplementation",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 495,
                      "src": "3929:26:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_string_memory_ptr_$returns$_t_address_$",
                        "typeString": "function (string memory) view external returns (address)"
                      }
                    },
                    "id": 306,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3929:40:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 281,
                  "id": 307,
                  "nodeType": "Return",
                  "src": "3922:47:1"
                }
              ]
            },
            "documentation": {
              "id": 273,
              "nodeType": "StructuredDocumentation",
              "src": "3374:303:1",
              "text": " @dev Returns the implementation address for a given contract name, provided by the `ImplementationProvider`.\n @param packageName Name of the package where the contract is contained.\n @param contractName Name of the contract.\n @return Address where the contract is implemented."
            },
            "functionSelector": "27a0d669",
            "id": 309,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getImplementation",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 278,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 275,
                  "mutability": "mutable",
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 309,
                  "src": "3707:25:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 274,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3707:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 277,
                  "mutability": "mutable",
                  "name": "contractName",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 309,
                  "src": "3734:26:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 276,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3734:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3706:55:1"
            },
            "returnParameters": {
              "id": 281,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 280,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 309,
                  "src": "3783:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 279,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3783:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3782:9:1"
            },
            "scope": 354,
            "src": "3680:294:1",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 352,
              "nodeType": "Block",
              "src": "4941:256:1",
              "statements": [
                {
                  "assignments": [
                    324
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 324,
                      "mutability": "mutable",
                      "name": "implementation",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 352,
                      "src": "4948:22:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 323,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "4948:7:1",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 329,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 326,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 312,
                        "src": "4991:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 327,
                        "name": "contractName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 314,
                        "src": "5004:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 325,
                      "name": "getImplementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 309,
                      "src": "4973:17:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$_t_address_$",
                        "typeString": "function (string memory,string memory) view returns (address)"
                      }
                    },
                    "id": 328,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4973:44:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4948:69:1"
                },
                {
                  "assignments": [
                    331
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 331,
                      "mutability": "mutable",
                      "name": "proxy",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 352,
                      "src": "5024:30:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5849",
                        "typeString": "contract AdminUpgradeabilityProxy"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 330,
                        "name": "AdminUpgradeabilityProxy",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 5849,
                        "src": "5024:24:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5849",
                          "typeString": "contract AdminUpgradeabilityProxy"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 342,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 338,
                        "name": "implementation",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 324,
                        "src": "5105:14:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 339,
                        "name": "admin",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 316,
                        "src": "5121:5:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 340,
                        "name": "data",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 318,
                        "src": "5128:4:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "components": [
                          {
                            "argumentTypes": null,
                            "id": 333,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "NewExpression",
                            "src": "5058:28:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$5849_$",
                              "typeString": "function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy)"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 332,
                              "name": "AdminUpgradeabilityProxy",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 5849,
                              "src": "5062:24:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5849",
                                "typeString": "contract AdminUpgradeabilityProxy"
                              }
                            }
                          }
                        ],
                        "id": 334,
                        "isConstant": false,
                        "isInlineArray": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "5057:30:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$5849_$",
                          "typeString": "function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy)"
                        }
                      },
                      "id": 337,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "names": [
                        "value"
                      ],
                      "nodeType": "FunctionCallOptions",
                      "options": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 335,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "5094:3:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 336,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "value",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "5094:9:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "src": "5057:47:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$5849_$value",
                        "typeString": "function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy)"
                      }
                    },
                    "id": 341,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5057:76:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5849",
                      "typeString": "contract AdminUpgradeabilityProxy"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5024:109:1"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 346,
                            "name": "proxy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 331,
                            "src": "5166:5:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5849",
                              "typeString": "contract AdminUpgradeabilityProxy"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5849",
                              "typeString": "contract AdminUpgradeabilityProxy"
                            }
                          ],
                          "id": 345,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "5158:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 344,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "5158:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 347,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "5158:14:1",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 343,
                      "name": "ProxyCreated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 88,
                      "src": "5145:12:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 348,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5145:28:1",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 349,
                  "nodeType": "EmitStatement",
                  "src": "5140:33:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 350,
                    "name": "proxy",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 331,
                    "src": "5187:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5849",
                      "typeString": "contract AdminUpgradeabilityProxy"
                    }
                  },
                  "functionReturnParameters": 322,
                  "id": 351,
                  "nodeType": "Return",
                  "src": "5180:12:1"
                }
              ]
            },
            "documentation": {
              "id": 310,
              "nodeType": "StructuredDocumentation",
              "src": "3978:804:1",
              "text": " @dev Creates a new proxy for the given contract and forwards a function call to it.\n This is useful to initialize the proxied contract.\n @param packageName Name of the package where the contract is contained.\n @param contractName Name of the contract.\n @param admin Address of the proxy administrator.\n @param data Data to send as msg.data to the corresponding implementation to initialize the proxied contract.\n It should include the signature and the parameters of the function to be called, as described in\n https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.\n This parameter is optional, if no data is given the initialization call to proxied contract will be skipped.\n @return Address of the new proxy."
            },
            "functionSelector": "cd3e318a",
            "id": 353,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "create",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 319,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 312,
                  "mutability": "mutable",
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 353,
                  "src": "4802:25:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 311,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "4802:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 314,
                  "mutability": "mutable",
                  "name": "contractName",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 353,
                  "src": "4829:26:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 313,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "4829:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 316,
                  "mutability": "mutable",
                  "name": "admin",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 353,
                  "src": "4857:13:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 315,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4857:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 318,
                  "mutability": "mutable",
                  "name": "data",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 353,
                  "src": "4872:17:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 317,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4872:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4801:89:1"
            },
            "returnParameters": {
              "id": 322,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 321,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 353,
                  "src": "4915:24:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5849",
                    "typeString": "contract AdminUpgradeabilityProxy"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 320,
                    "name": "AdminUpgradeabilityProxy",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5849,
                    "src": "4915:24:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$5849",
                      "typeString": "contract AdminUpgradeabilityProxy"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4914:26:1"
            },
            "scope": 354,
            "src": "4786:411:1",
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 355,
        "src": "353:4846:1"
      }
    ],
    "src": "0:5200:1"
  },
  "bytecode": "0x60806040523480156100115760006000fd5b505b5b33600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35b5b6100d9565b612947806100e86000396000f3fe608060405260043610620000a35760003560e01c80638da5cb5b11620000615780638da5cb5b146200061c5780638f32d59b1462000677578063ad358d9914620006aa578063cd3e318a1462000782578063f2fde38b14620009ed57620000a3565b806327a0d66914620000a957806350cadc851462000262578063715018a6146200037a57806371eb64cc146200039557806387c6048314620004d257620000a3565b60006000fd5b348015620000b75760006000fd5b506200022060048036036040811015620000d15760006000fd5b8101908080359060200190640100000000811115620000f05760006000fd5b820183602082011115620001045760006000fd5b80359060200191846001830284011164010000000083111715620001285760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090909192909091929080359060200190640100000000811115620001915760006000fd5b820183602082011115620001a55760006000fd5b80359060200191846001830284011164010000000083111715620001c95760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090909192909091929050505062000a44565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620002705760006000fd5b5062000338600480360360208110156200028a5760006000fd5b8101908080359060200190640100000000811115620002a95760006000fd5b820183602082011115620002bd5760006000fd5b80359060200191846001830284011164010000000083111715620002e15760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090909192909091929050505062000ba7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620003885760006000fd5b506200039362000da7565b005b348015620003a35760006000fd5b50620004d0600480360360a0811015620003bd5760006000fd5b8101908080359060200190640100000000811115620003dc5760006000fd5b820183602082011115620003f05760006000fd5b80359060200191846001830284011164010000000083111715620004145760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050909091929090919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080606001906003806020026040519081016040528092919082600360200280828437600081840152601f19601f82011690508083019250505050505090909192909091929050505062000e87565b005b348015620004e05760006000fd5b50620005a860048036036020811015620004fa5760006000fd5b8101908080359060200190640100000000811115620005195760006000fd5b8201836020820111156200052d5760006000fd5b80359060200191846001830284011164010000000083111715620005515760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050909091929090919290505050620011d1565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600360200280838360005b83811015620006085780820151818401525b602081019050620005ea565b505050509050019250505060405180910390f35b3480156200062a5760006000fd5b506200063562001307565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620006855760006000fd5b506200069062001337565b604051808215151515815260200191505060405180910390f35b348015620006b85760006000fd5b506200078060048036036020811015620006d25760006000fd5b8101908080359060200190640100000000811115620006f15760006000fd5b820183602082011115620007055760006000fd5b80359060200191846001830284011164010000000083111715620007295760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090909192909091929050505062001395565b005b620009ab600480360360808110156200079b5760006000fd5b8101908080359060200190640100000000811115620007ba5760006000fd5b820183602082011115620007ce5760006000fd5b80359060200191846001830284011164010000000083111715620007f25760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050909091929090919290803590602001906401000000008111156200085b5760006000fd5b8201836020820111156200086f5760006000fd5b80359060200191846001830284011164010000000083111715620008935760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050909091929090919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156200091c5760006000fd5b820183602082011115620009305760006000fd5b80359060200191846001830284011164010000000083111715620009545760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090909192909091929050505062001709565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620009fb5760006000fd5b5062000a426004803603602081101562000a155760006000fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620018a7565b005b6000600062000a598462000ba763ffffffff16565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000a9c57600091505062000ba1565b8073ffffffffffffffffffffffffffffffffffffffff16636b683896846040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000b0b5780820151818401525b60208101905062000aed565b50505050905090810190601f16801562000b395780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801562000b585760006000fd5b505afa15801562000b6e573d600060003e3d6000fd5b505050506040513d602081101562000b865760006000fd5b810190808051906020019092919050505091505062000ba156505b92915050565b600060006001600050836040518082805190602001908083835b60208310151562000be957805182525b60208201915060208101905060208303925062000bc1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000509050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141562000c8657600091505062000da2565b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631df40eaa826001016000506040518263ffffffff1660e01b815260040180826003801562000d3a576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff168152602001906008019060208260070104928301926001038202915080841162000cf45790505b505091505060206040518083038186803b15801562000d595760006000fd5b505afa15801562000d6f573d600060003e3d6000fd5b505050506040513d602081101562000d875760006000fd5b810190808051906020019092919050505091505062000da256505b919050565b62000db76200133763ffffffff16565b151562000dc45760006000fd5b600073ffffffffffffffffffffffffffffffffffffffff16600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b565b62000e976200133763ffffffff16565b151562000ea45760006000fd5b8173ffffffffffffffffffffffffffffffffffffffff166335ce4016826040518263ffffffff1660e01b81526004018082600360200280838360005b8381101562000efe5780820151818401525b60208101905062000ee0565b5050505090500191505060206040518083038186803b15801562000f225760006000fd5b505afa15801562000f38573d600060003e3d6000fd5b505050506040513d602081101562000f505760006000fd5b8101908080519060200190929190505050151562000fba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180620028d5603d913960400191505060405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001506001600050846040518082805190602001908083835b6020831015156200102657805182525b60208201915060208101905060208303925062000ffe565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060005060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101600050906003620010bf929190620019d9565b509050507f4ca1964bc3cd347906bc558f77fdd636486951cf12238150178be72a4fbb6fab83838360405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600360200280838360005b838110156200114b5780820151818401525b6020810190506200112d565b50505050905001828103825285818151815260200191508051906020019080838360005b838110156200118d5780820151818401525b6020810190506200116f565b50505050905090810190601f168015620011bb5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a15b5b505050565b6000620011dd62001a91565b60006001600050846040518082805190602001908083835b6020831015156200121d57805182525b602082019150602081019050602083039250620011f5565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060005090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160005080600380602002604051908101604052809291908260038015620012ef576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020019060080190602082600701049283019260010382029150808411620012a95790505b5050505050905092509250506200130256505b915091565b6000600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905062001334565b90565b6000600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905062001392565b90565b620013a56200133763ffffffff16565b1515620013b25760006000fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600050826040518082805190602001908083835b6020831015156200140857805182525b602082019150602081019050602083039250620013e0565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060005060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515620014f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5061636b61676520746f20756e736574206e6f7420666f756e6400000000000081526020015060200191505060405180910390fd5b6001600050816040518082805190602001908083835b6020831015156200153057805182525b60208201915060208101905060208303925062001508565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006000820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006200159e919062001ab3565b50507f4ca1964bc3cd347906bc558f77fdd636486951cf12238150178be72a4fbb6fab8160006040518060600160405280600067ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff1667ffffffffffffffff1681526020015060405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600360200280838360005b83811015620016855780820151818401525b60208101905062001667565b50505050905001828103825285818151815260200191508051906020019080838360005b83811015620016c75780820151818401525b602081019050620016a9565b50505050905090810190601f168015620016f55780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a15b5b50565b600060006200171f868662000a4463ffffffff16565b9050600034828686604051620017359062001aba565b808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015620017d95780820151818401525b602081019050620017bb565b50505050905090810190601f168015620018075780820380516001836020036101000a031916815260200191505b509450505050506040518091039082f09050801580156200182d573d600060003e3d6000fd5b5090507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e734981604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a180925050506200189f5650505b949350505050565b620018b76200133763ffffffff16565b1515620018c45760006000fd5b620018d581620018da63ffffffff16565b5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515620019185760006000fd5b8073ffffffffffffffffffffffffffffffffffffffff16600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b826003909060030160049004810192821562001a7e5791602002820160005b8382111562001a4657835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509260200192600801602081600701049283019260010302620019f8565b801562001a7c5782816101000a81549067ffffffffffffffff021916905560080160208160070104928301926001030262001a46565b505b50905062001a8d919062001ac8565b5090565b6040518060600160405280600390602082028036833780820191505090505090565b5060009055565b610dcd8062001b0883390190565b62001b04919062001ad4565b8082111562001b0057600081816101000a81549067ffffffffffffffff02191690555060010162001ad4565b5090565b9056fe6080604052604051610dcd380380610dcd833981810160405260608110156100275760006000fd5b8101908080519060200190929190805190602001909291908051604051939291908464010000000082111561005c5760006000fd5b838201915060208201858111156100735760006000fd5b82518660018202830111640100000000821117156100915760006000fd5b8083526020830192505050908051906020019080838360005b838110156100c65780820151818401525b6020810190506100aa565b50505050905090810190601f1680156100f35780820380516001836020036101000a031916815260200191505b506040526020015050505b82815b600160405180807f656970313936372e70726f78792e696d706c656d656e746174696f6e00000000815260200150601c019050604051809103902060001c0360001b600019167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6000191614151561017857fe5b610187826102eb60201b60201c565b6000815111156102595760008273ffffffffffffffffffffffffffffffffffffffff16826040518082805190602001908083835b6020831015156101e157805182525b6020820191506020810190506020830392506101bb565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610241576040519150601f19603f3d011682016040523d82523d6000602084013e610246565b606091505b505090508015156102575760006000fd5b505b5b5050600160405180807f656970313936372e70726f78792e61646d696e000000000000000000000000008152602001506013019050604051809103902060001c0360001b600019167fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b600019161415156102d357fe5b6102e28261038560201b60201c565b5b5050506103cf565b6102fe816103b560201b6106641760201c565b1515610355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180610d92603b913960400191505060405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b9050818155505b50565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b9050818155505b50565b60006000823b9050600081119150506103ca56505b919050565b6109b4806103de6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100775780634f1ef286146100ca5780635c60da1b146101695780638f283970146101c1578063f851a4401461021457610065565b36610065575b61006261026c63ffffffff16565b5b005b5b61007461026c63ffffffff16565b5b005b3480156100845760006000fd5b506100c86004803603602081101561009c5760006000fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610299565b005b610167600480360360408110156100e15760006000fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561011f5760006000fd5b8201836020820111156101325760006000fd5b803590602001918460018302840111640100000000831117156101555760006000fd5b90919293909091929390505050610302565b005b3480156101765760006000fd5b5061017f6103ef565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101ce5760006000fd5b50610212600480360360208110156101e65760006000fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061045f565b005b3480156102215760006000fd5b5061022a6105f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61027a61067e63ffffffff16565b61029661028b61072363ffffffff16565b61075663ffffffff16565b5b565b6102a761078963ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ef576102e9816107bc63ffffffff16565b5b6102fe565b6102fd61026c63ffffffff16565b5b5b50565b61031061078963ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156103da57610352836107bc63ffffffff16565b60008373ffffffffffffffffffffffffffffffffffffffff168383604051808383808284378083019250505092505050600060405180830381855af49150503d80600081146103bd576040519150601f19603f3d011682016040523d82523d6000602084013e6103c2565b606091505b505090508015156103d35760006000fd5b505b6103e9565b6103e861026c63ffffffff16565b5b5b505050565b60006103ff61078963ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561044c5761044061072363ffffffff16565b9050610447565b61045b565b61045a61026c63ffffffff16565b5b5b90565b61046d61078963ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156105e157600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061090e6036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61055761078963ffffffff16565b82604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a16105db8161081263ffffffff16565b5b6105f0565b6105ef61026c63ffffffff16565b5b5b50565b600061060461078963ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156106515761064561078963ffffffff16565b905061064c565b610660565b61065f61026c63ffffffff16565b5b5b90565b60006000823b90506000811191505061067956505b919050565b61068c61078963ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515610712576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806108dc6032913960400191505060405180910390fd5b61072061084263ffffffff16565b5b565b600060007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150505b90565b36600060003760006000366000845af43d600060003e806000811461077e573d6000f3610783565b3d6000fd5b50505b50565b600060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150505b90565b6107cb8161084563ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25b50565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b9050818155505b50565b5b565b6108548161066463ffffffff16565b15156108ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180610944603b913960400191505060405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b9050818155505b5056fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212205163c04f5fd29ab697db22134a7a0dfba2cefcf29a379cac0333f8fe1a07c17364736f6c634300060a003343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373546865207265717565737465642076657273696f6e206d757374206265207265676973746572656420696e2074686520676976656e207061636b616765a2646970667358221220b321e530488cda1ca87126c32fae25ea7ba8748b01ebfc01e6c990acbeb1063264736f6c634300060a0033",
  "deployedBytecode": "0x608060405260043610620000a35760003560e01c80638da5cb5b11620000615780638da5cb5b146200061c5780638f32d59b1462000677578063ad358d9914620006aa578063cd3e318a1462000782578063f2fde38b14620009ed57620000a3565b806327a0d66914620000a957806350cadc851462000262578063715018a6146200037a57806371eb64cc146200039557806387c6048314620004d257620000a3565b60006000fd5b348015620000b75760006000fd5b506200022060048036036040811015620000d15760006000fd5b8101908080359060200190640100000000811115620000f05760006000fd5b820183602082011115620001045760006000fd5b80359060200191846001830284011164010000000083111715620001285760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090909192909091929080359060200190640100000000811115620001915760006000fd5b820183602082011115620001a55760006000fd5b80359060200191846001830284011164010000000083111715620001c95760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090909192909091929050505062000a44565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620002705760006000fd5b5062000338600480360360208110156200028a5760006000fd5b8101908080359060200190640100000000811115620002a95760006000fd5b820183602082011115620002bd5760006000fd5b80359060200191846001830284011164010000000083111715620002e15760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090909192909091929050505062000ba7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620003885760006000fd5b506200039362000da7565b005b348015620003a35760006000fd5b50620004d0600480360360a0811015620003bd5760006000fd5b8101908080359060200190640100000000811115620003dc5760006000fd5b820183602082011115620003f05760006000fd5b80359060200191846001830284011164010000000083111715620004145760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050909091929090919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080606001906003806020026040519081016040528092919082600360200280828437600081840152601f19601f82011690508083019250505050505090909192909091929050505062000e87565b005b348015620004e05760006000fd5b50620005a860048036036020811015620004fa5760006000fd5b8101908080359060200190640100000000811115620005195760006000fd5b8201836020820111156200052d5760006000fd5b80359060200191846001830284011164010000000083111715620005515760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050909091929090919290505050620011d1565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600360200280838360005b83811015620006085780820151818401525b602081019050620005ea565b505050509050019250505060405180910390f35b3480156200062a5760006000fd5b506200063562001307565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620006855760006000fd5b506200069062001337565b604051808215151515815260200191505060405180910390f35b348015620006b85760006000fd5b506200078060048036036020811015620006d25760006000fd5b8101908080359060200190640100000000811115620006f15760006000fd5b820183602082011115620007055760006000fd5b80359060200191846001830284011164010000000083111715620007295760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090909192909091929050505062001395565b005b620009ab600480360360808110156200079b5760006000fd5b8101908080359060200190640100000000811115620007ba5760006000fd5b820183602082011115620007ce5760006000fd5b80359060200191846001830284011164010000000083111715620007f25760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050909091929090919290803590602001906401000000008111156200085b5760006000fd5b8201836020820111156200086f5760006000fd5b80359060200191846001830284011164010000000083111715620008935760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050909091929090919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156200091c5760006000fd5b820183602082011115620009305760006000fd5b80359060200191846001830284011164010000000083111715620009545760006000fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090909192909091929050505062001709565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620009fb5760006000fd5b5062000a426004803603602081101562000a155760006000fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620018a7565b005b6000600062000a598462000ba763ffffffff16565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000a9c57600091505062000ba1565b8073ffffffffffffffffffffffffffffffffffffffff16636b683896846040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000b0b5780820151818401525b60208101905062000aed565b50505050905090810190601f16801562000b395780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801562000b585760006000fd5b505afa15801562000b6e573d600060003e3d6000fd5b505050506040513d602081101562000b865760006000fd5b810190808051906020019092919050505091505062000ba156505b92915050565b600060006001600050836040518082805190602001908083835b60208310151562000be957805182525b60208201915060208101905060208303925062000bc1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000509050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141562000c8657600091505062000da2565b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631df40eaa826001016000506040518263ffffffff1660e01b815260040180826003801562000d3a576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff168152602001906008019060208260070104928301926001038202915080841162000cf45790505b505091505060206040518083038186803b15801562000d595760006000fd5b505afa15801562000d6f573d600060003e3d6000fd5b505050506040513d602081101562000d875760006000fd5b810190808051906020019092919050505091505062000da256505b919050565b62000db76200133763ffffffff16565b151562000dc45760006000fd5b600073ffffffffffffffffffffffffffffffffffffffff16600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b565b62000e976200133763ffffffff16565b151562000ea45760006000fd5b8173ffffffffffffffffffffffffffffffffffffffff166335ce4016826040518263ffffffff1660e01b81526004018082600360200280838360005b8381101562000efe5780820151818401525b60208101905062000ee0565b5050505090500191505060206040518083038186803b15801562000f225760006000fd5b505afa15801562000f38573d600060003e3d6000fd5b505050506040513d602081101562000f505760006000fd5b8101908080519060200190929190505050151562000fba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180620028d5603d913960400191505060405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001506001600050846040518082805190602001908083835b6020831015156200102657805182525b60208201915060208101905060208303925062000ffe565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060005060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101600050906003620010bf929190620019d9565b509050507f4ca1964bc3cd347906bc558f77fdd636486951cf12238150178be72a4fbb6fab83838360405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600360200280838360005b838110156200114b5780820151818401525b6020810190506200112d565b50505050905001828103825285818151815260200191508051906020019080838360005b838110156200118d5780820151818401525b6020810190506200116f565b50505050905090810190601f168015620011bb5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a15b5b505050565b6000620011dd62001a91565b60006001600050846040518082805190602001908083835b6020831015156200121d57805182525b602082019150602081019050602083039250620011f5565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060005090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160005080600380602002604051908101604052809291908260038015620012ef576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020019060080190602082600701049283019260010382029150808411620012a95790505b5050505050905092509250506200130256505b915091565b6000600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905062001334565b90565b6000600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905062001392565b90565b620013a56200133763ffffffff16565b1515620013b25760006000fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600050826040518082805190602001908083835b6020831015156200140857805182525b602082019150602081019050602083039250620013e0565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060005060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515620014f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5061636b61676520746f20756e736574206e6f7420666f756e6400000000000081526020015060200191505060405180910390fd5b6001600050816040518082805190602001908083835b6020831015156200153057805182525b60208201915060208101905060208303925062001508565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006000820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006200159e919062001ab3565b50507f4ca1964bc3cd347906bc558f77fdd636486951cf12238150178be72a4fbb6fab8160006040518060600160405280600067ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff1667ffffffffffffffff1681526020015060405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600360200280838360005b83811015620016855780820151818401525b60208101905062001667565b50505050905001828103825285818151815260200191508051906020019080838360005b83811015620016c75780820151818401525b602081019050620016a9565b50505050905090810190601f168015620016f55780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a15b5b50565b600060006200171f868662000a4463ffffffff16565b9050600034828686604051620017359062001aba565b808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015620017d95780820151818401525b602081019050620017bb565b50505050905090810190601f168015620018075780820380516001836020036101000a031916815260200191505b509450505050506040518091039082f09050801580156200182d573d600060003e3d6000fd5b5090507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e734981604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a180925050506200189f5650505b949350505050565b620018b76200133763ffffffff16565b1515620018c45760006000fd5b620018d581620018da63ffffffff16565b5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515620019185760006000fd5b8073ffffffffffffffffffffffffffffffffffffffff16600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b826003909060030160049004810192821562001a7e5791602002820160005b8382111562001a4657835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509260200192600801602081600701049283019260010302620019f8565b801562001a7c5782816101000a81549067ffffffffffffffff021916905560080160208160070104928301926001030262001a46565b505b50905062001a8d919062001ac8565b5090565b6040518060600160405280600390602082028036833780820191505090505090565b5060009055565b610dcd8062001b0883390190565b62001b04919062001ad4565b8082111562001b0057600081816101000a81549067ffffffffffffffff02191690555060010162001ad4565b5090565b9056fe6080604052604051610dcd380380610dcd833981810160405260608110156100275760006000fd5b8101908080519060200190929190805190602001909291908051604051939291908464010000000082111561005c5760006000fd5b838201915060208201858111156100735760006000fd5b82518660018202830111640100000000821117156100915760006000fd5b8083526020830192505050908051906020019080838360005b838110156100c65780820151818401525b6020810190506100aa565b50505050905090810190601f1680156100f35780820380516001836020036101000a031916815260200191505b506040526020015050505b82815b600160405180807f656970313936372e70726f78792e696d706c656d656e746174696f6e00000000815260200150601c019050604051809103902060001c0360001b600019167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6000191614151561017857fe5b610187826102eb60201b60201c565b6000815111156102595760008273ffffffffffffffffffffffffffffffffffffffff16826040518082805190602001908083835b6020831015156101e157805182525b6020820191506020810190506020830392506101bb565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610241576040519150601f19603f3d011682016040523d82523d6000602084013e610246565b606091505b505090508015156102575760006000fd5b505b5b5050600160405180807f656970313936372e70726f78792e61646d696e000000000000000000000000008152602001506013019050604051809103902060001c0360001b600019167fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b600019161415156102d357fe5b6102e28261038560201b60201c565b5b5050506103cf565b6102fe816103b560201b6106641760201c565b1515610355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180610d92603b913960400191505060405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b9050818155505b50565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b9050818155505b50565b60006000823b9050600081119150506103ca56505b919050565b6109b4806103de6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100775780634f1ef286146100ca5780635c60da1b146101695780638f283970146101c1578063f851a4401461021457610065565b36610065575b61006261026c63ffffffff16565b5b005b5b61007461026c63ffffffff16565b5b005b3480156100845760006000fd5b506100c86004803603602081101561009c5760006000fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610299565b005b610167600480360360408110156100e15760006000fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561011f5760006000fd5b8201836020820111156101325760006000fd5b803590602001918460018302840111640100000000831117156101555760006000fd5b90919293909091929390505050610302565b005b3480156101765760006000fd5b5061017f6103ef565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101ce5760006000fd5b50610212600480360360208110156101e65760006000fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061045f565b005b3480156102215760006000fd5b5061022a6105f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61027a61067e63ffffffff16565b61029661028b61072363ffffffff16565b61075663ffffffff16565b5b565b6102a761078963ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ef576102e9816107bc63ffffffff16565b5b6102fe565b6102fd61026c63ffffffff16565b5b5b50565b61031061078963ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156103da57610352836107bc63ffffffff16565b60008373ffffffffffffffffffffffffffffffffffffffff168383604051808383808284378083019250505092505050600060405180830381855af49150503d80600081146103bd576040519150601f19603f3d011682016040523d82523d6000602084013e6103c2565b606091505b505090508015156103d35760006000fd5b505b6103e9565b6103e861026c63ffffffff16565b5b5b505050565b60006103ff61078963ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561044c5761044061072363ffffffff16565b9050610447565b61045b565b61045a61026c63ffffffff16565b5b5b90565b61046d61078963ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156105e157600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061090e6036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61055761078963ffffffff16565b82604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a16105db8161081263ffffffff16565b5b6105f0565b6105ef61026c63ffffffff16565b5b5b50565b600061060461078963ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156106515761064561078963ffffffff16565b905061064c565b610660565b61065f61026c63ffffffff16565b5b5b90565b60006000823b90506000811191505061067956505b919050565b61068c61078963ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515610712576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806108dc6032913960400191505060405180910390fd5b61072061084263ffffffff16565b5b565b600060007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b905080549150505b90565b36600060003760006000366000845af43d600060003e806000811461077e573d6000f3610783565b3d6000fd5b50505b50565b600060007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b905080549150505b90565b6107cb8161084563ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a25b50565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b9050818155505b50565b5b565b6108548161066463ffffffff16565b15156108ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180610944603b913960400191505060405180910390fd5b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b9050818155505b5056fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212205163c04f5fd29ab697db22134a7a0dfba2cefcf29a379cac0333f8fe1a07c17364736f6c634300060a003343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373546865207265717565737465642076657273696f6e206d757374206265207265676973746572656420696e2074686520676976656e207061636b616765a2646970667358221220b321e530488cda1ca87126c32fae25ea7ba8748b01ebfc01e6c990acbeb1063264736f6c634300060a0033",
  "compiler": {
    "name": "solc",
    "version": "0.6.10+commit.00c0fcaf.Emscripten.clang",
    "optimizer": {},
    "evmVersion": "constantinople"
  }
}
