{
  "contractName": "App",
  "abi": [
    {
      "constant": false,
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "_newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "name": "proxy",
          "type": "address"
        }
      ],
      "name": "ProxyCreated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "name": "providerName",
          "type": "string"
        },
        {
          "indexed": false,
          "name": "package",
          "type": "address"
        },
        {
          "indexed": false,
          "name": "version",
          "type": "uint64[3]"
        }
      ],
      "name": "PackageChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "previousOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipRenounced",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "packageName",
          "type": "string"
        }
      ],
      "name": "getProvider",
      "outputs": [
        {
          "name": "provider",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "packageName",
          "type": "string"
        }
      ],
      "name": "getPackage",
      "outputs": [
        {
          "name": "",
          "type": "address"
        },
        {
          "name": "",
          "type": "uint64[3]"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "packageName",
          "type": "string"
        },
        {
          "name": "package",
          "type": "address"
        },
        {
          "name": "version",
          "type": "uint64[3]"
        }
      ],
      "name": "setPackage",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "packageName",
          "type": "string"
        }
      ],
      "name": "unsetPackage",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "constant": true,
      "inputs": [
        {
          "name": "packageName",
          "type": "string"
        },
        {
          "name": "contractName",
          "type": "string"
        }
      ],
      "name": "getImplementation",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
    },
    {
      "constant": false,
      "inputs": [
        {
          "name": "packageName",
          "type": "string"
        },
        {
          "name": "contractName",
          "type": "string"
        },
        {
          "name": "admin",
          "type": "address"
        },
        {
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "create",
      "outputs": [
        {
          "name": "",
          "type": "address"
        }
      ],
      "payable": true,
      "stateMutability": "payable",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612373806100606000396000f300608060405260043610620000a3576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327a0d66914620000a857806350cadc85146200019a578063715018a6146200024657806371eb64cc146200026057806387c60483146200031b5780638da5cb5b14620003f8578063ad358d991462000452578063cd3e318a14620004be578063f2fde38b1462000608575b600080fd5b348015620000b557600080fd5b5062000158600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506200064e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620001a757600080fd5b5062000204600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050620007bd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200025357600080fd5b506200025e620009c6565b005b3480156200026d57600080fd5b5062000319600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919291929050505062000ac9565b005b3480156200032857600080fd5b5062000385600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505062000e9d565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600360200280838360005b83811015620003e4578082015181840152602081019050620003c7565b505050509050019250505060405180910390f35b3480156200040557600080fd5b506200041062000fc2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200045f57600080fd5b50620004bc600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505062000fe7565b005b620005c6600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505062001385565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200061557600080fd5b506200064c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200150e565b005b6000806200065c84620007bd565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200069e5760009150620007b6565b8073ffffffffffffffffffffffffffffffffffffffff16636b683896846040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620007285780820151818401526020810190506200070b565b50505050905090810190601f168015620007565780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b1580156200077657600080fd5b505af11580156200078b573d6000803e3d6000fd5b505050506040513d6020811015620007a257600080fd5b810190808051906020019092919050505091505b5092915050565b6000806001836040518082805190602001908083835b602083101515620007fa5780518252602082019150602081019050602083039250620007d3565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415620008935760009150620009c0565b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631df40eaa826001016040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180826003801562000960576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116200091a5790505b5050915050602060405180830381600087803b1580156200098057600080fd5b505af115801562000995573d6000803e3d6000fd5b505050506040513d6020811015620009ac57600080fd5b810190808051906020019092919050505091505b50919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000a2257600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000b2557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166335ce4016826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600360200280838360005b8381101562000b9a57808201518184015260208101905062000b7d565b50505050905001915050602060405180830381600087803b15801562000bbf57600080fd5b505af115801562000bd4573d6000803e3d6000fd5b505050506040513d602081101562000beb57600080fd5b8101908080519060200190929190505050151562000c97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f546865207265717565737465642076657273696f6e206d75737420626520726581526020017f676973746572656420696e2074686520676976656e207061636b61676500000081525060400191505060405180910390fd5b60408051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152506001846040518082805190602001908083835b60208310151562000cfc578051825260208201915060208101905060208303925062000cd5565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010190600362000d8f92919062001673565b509050507f4ca1964bc3cd347906bc558f77fdd636486951cf12238150178be72a4fbb6fab83838360405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600360200280838360005b8381101562000e1a57808201518184015260208101905062000dfd565b50505050905001828103825285818151815260200191508051906020019080838360005b8381101562000e5b57808201518184015260208101905062000e3e565b50505050905090810190601f16801562000e895780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1505050565b600062000ea962001728565b60006001846040518082805190602001908083835b60208310151562000ee5578051825260208201915060208101905060208303925062000ebe565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001018060038060200260405190810160405280929190826003801562000fb1576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff168152602001906008019060208260070104928301926001038202915080841162000f6b5790505b505050505090509250925050915091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156200104357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001826040518082805190602001908083835b6020831015156200109557805182526020820191506020810190506020830392506200106e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151562001179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5061636b61676520746f20756e736574206e6f7420666f756e6400000000000081525060200191505060405180910390fd5b6001816040518082805190602001908083835b602083101515620011b357805182526020820191506020810190506020830392506200118c565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006200122091906200174b565b50507f4ca1964bc3cd347906bc558f77fdd636486951cf12238150178be72a4fbb6fab816000606060405190810160405280600067ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff1667ffffffffffffffff1681525060405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600360200280838360005b8381101562001304578082015181840152602081019050620012e7565b50505050905001828103825285818151815260200191508051906020019080838360005b838110156200134557808201518184015260208101905062001328565b50505050905090810190601f168015620013735780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a150565b60008060006200139687876200064e565b915034828686620013a662001752565b808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015620014495780820151818401526020810190506200142c565b50505050905090810190601f168015620014775780820380516001836020036101000a031916815260200191505b509450505050506040518091039082f0801580156200149a573d6000803e3d6000fd5b50905090507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e734981604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18092505050949350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156200156a57600080fd5b620015758162001578565b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515620015b557600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8260038001600490048101928215620017155791602002820160005b83821115620016dd57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555092602001926008016020816007010492830192600103026200168f565b8015620017135782816101000a81549067ffffffffffffffff0219169055600801602081600701049283019260010302620016dd565b505b50905062001724919062001763565b5090565b606060405190810160405280600390602082028038833980820191505090505090565b5060009055565b604051610baa806200179e83390190565b6200179a91905b808211156200179657600081816101000a81549067ffffffffffffffff0219169055506001016200176a565b5090565b9056006080604052604051610baa380380610baa833981018060405281019080805190602001909291908051906020019092919080518201929190505050828160405180807f6f72672e7a657070656c696e6f732e70726f78792e696d706c656d656e74617481526020017f696f6e000000000000000000000000000000000000000000000000000000000081525060230190506040518091039020600019167f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3600102600019161415156100cd57fe5b6100e58261020d640100000000026401000000009004565b600081511115610180578173ffffffffffffffffffffffffffffffffffffffff168160405180828051906020019080838360005b83811015610134578082015181840152602081019050610119565b50505050905090810190601f1680156101615780820380516001836020036101000a031916815260200191505b50915050600060405180830381855af4915050151561017f57600080fd5b5b505060405180807f6f72672e7a657070656c696e6f732e70726f78792e61646d696e000000000000815250601a0190506040518091039020600019167f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b600102600019161415156101ed57fe5b610205826102f2640100000000026401000000009004565b505050610334565b600061022b8261032164010000000002610828176401000000009004565b15156102c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001807f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f81526020017f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000081525060400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c360010290508181555050565b60007f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b60010290508181555050565b600080823b905060008111915050919050565b610867806103436000396000f30060806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633659cfe6146100775780634f1ef286146100ba5780635c60da1b146101085780638f2839701461015f578063f851a440146101a2575b6100756101f9565b005b34801561008357600080fd5b506100b8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610213565b005b610106600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390505050610268565b005b34801561011457600080fd5b5061011d610305565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561016b57600080fd5b506101a0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061035d565b005b3480156101ae57600080fd5b506101b761051b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610201610573565b61021161020c61064e565b61067f565b565b61021b6106a5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561025c57610257816106d6565b610265565b6102646101f9565b5b50565b6102706106a5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102f7576102ac836106d6565b8273ffffffffffffffffffffffffffffffffffffffff16828260405180838380828437820191505092505050600060405180830381855af491505015156102f257600080fd5b610300565b6102ff6101f9565b5b505050565b600061030f6106a5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156103515761034a61064e565b905061035a565b6103596101f9565b5b90565b6103656106a5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561050f57600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610463576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001807f43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f81526020017f787920746f20746865207a65726f20616464726573730000000000000000000081525060400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61048c6106a5565b82604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a161050a81610725565b610518565b6105176101f9565b5b50565b60006105256106a5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610567576105606106a5565b9050610570565b61056f6101f9565b5b90565b61057b6106a5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515610644576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e20667281526020017f6f6d207468652070726f78792061646d696e000000000000000000000000000081525060400191505060405180910390fd5b61064c610754565b565b6000807f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c36001029050805491505090565b3660008037600080366000845af43d6000803e80600081146106a0573d6000f35b3d6000fd5b6000807f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b6001029050805491505090565b6106df81610756565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60007f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b60010290508181555050565b565b600061076182610828565b15156107fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001807f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f81526020017f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000081525060400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c360010290508181555050565b600080823b9050600081119150509190505600a165627a7a723058202029b82c05a453a0ab69adc4daaaac163e04b8cfc21e38fceccfcffcefb057f80029a165627a7a7230582035409b16d5f5be277f13e565df971823b1a1fcf037f06b2303c87601086fff110029",
  "deployedBytecode": "0x608060405260043610620000a3576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327a0d66914620000a857806350cadc85146200019a578063715018a6146200024657806371eb64cc146200026057806387c60483146200031b5780638da5cb5b14620003f8578063ad358d991462000452578063cd3e318a14620004be578063f2fde38b1462000608575b600080fd5b348015620000b557600080fd5b5062000158600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506200064e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620001a757600080fd5b5062000204600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050620007bd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200025357600080fd5b506200025e620009c6565b005b3480156200026d57600080fd5b5062000319600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919291929050505062000ac9565b005b3480156200032857600080fd5b5062000385600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505062000e9d565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600360200280838360005b83811015620003e4578082015181840152602081019050620003c7565b505050509050019250505060405180910390f35b3480156200040557600080fd5b506200041062000fc2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200045f57600080fd5b50620004bc600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505062000fe7565b005b620005c6600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505062001385565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200061557600080fd5b506200064c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200150e565b005b6000806200065c84620007bd565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200069e5760009150620007b6565b8073ffffffffffffffffffffffffffffffffffffffff16636b683896846040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620007285780820151818401526020810190506200070b565b50505050905090810190601f168015620007565780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b1580156200077657600080fd5b505af11580156200078b573d6000803e3d6000fd5b505050506040513d6020811015620007a257600080fd5b810190808051906020019092919050505091505b5092915050565b6000806001836040518082805190602001908083835b602083101515620007fa5780518252602082019150602081019050602083039250620007d3565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415620008935760009150620009c0565b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631df40eaa826001016040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180826003801562000960576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116200091a5790505b5050915050602060405180830381600087803b1580156200098057600080fd5b505af115801562000995573d6000803e3d6000fd5b505050506040513d6020811015620009ac57600080fd5b810190808051906020019092919050505091505b50919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000a2257600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000b2557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166335ce4016826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600360200280838360005b8381101562000b9a57808201518184015260208101905062000b7d565b50505050905001915050602060405180830381600087803b15801562000bbf57600080fd5b505af115801562000bd4573d6000803e3d6000fd5b505050506040513d602081101562000beb57600080fd5b8101908080519060200190929190505050151562000c97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f546865207265717565737465642076657273696f6e206d75737420626520726581526020017f676973746572656420696e2074686520676976656e207061636b61676500000081525060400191505060405180910390fd5b60408051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152506001846040518082805190602001908083835b60208310151562000cfc578051825260208201915060208101905060208303925062000cd5565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010190600362000d8f92919062001673565b509050507f4ca1964bc3cd347906bc558f77fdd636486951cf12238150178be72a4fbb6fab83838360405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600360200280838360005b8381101562000e1a57808201518184015260208101905062000dfd565b50505050905001828103825285818151815260200191508051906020019080838360005b8381101562000e5b57808201518184015260208101905062000e3e565b50505050905090810190601f16801562000e895780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1505050565b600062000ea962001728565b60006001846040518082805190602001908083835b60208310151562000ee5578051825260208201915060208101905060208303925062000ebe565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001018060038060200260405190810160405280929190826003801562000fb1576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff168152602001906008019060208260070104928301926001038202915080841162000f6b5790505b505050505090509250925050915091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156200104357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001826040518082805190602001908083835b6020831015156200109557805182526020820191506020810190506020830392506200106e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151562001179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5061636b61676520746f20756e736574206e6f7420666f756e6400000000000081525060200191505060405180910390fd5b6001816040518082805190602001908083835b602083101515620011b357805182526020820191506020810190506020830392506200118c565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006200122091906200174b565b50507f4ca1964bc3cd347906bc558f77fdd636486951cf12238150178be72a4fbb6fab816000606060405190810160405280600067ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff1667ffffffffffffffff168152602001600067ffffffffffffffff1667ffffffffffffffff1681525060405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600360200280838360005b8381101562001304578082015181840152602081019050620012e7565b50505050905001828103825285818151815260200191508051906020019080838360005b838110156200134557808201518184015260208101905062001328565b50505050905090810190601f168015620013735780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a150565b60008060006200139687876200064e565b915034828686620013a662001752565b808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015620014495780820151818401526020810190506200142c565b50505050905090810190601f168015620014775780820380516001836020036101000a031916815260200191505b509450505050506040518091039082f0801580156200149a573d6000803e3d6000fd5b50905090507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e734981604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18092505050949350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156200156a57600080fd5b620015758162001578565b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515620015b557600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8260038001600490048101928215620017155791602002820160005b83821115620016dd57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555092602001926008016020816007010492830192600103026200168f565b8015620017135782816101000a81549067ffffffffffffffff0219169055600801602081600701049283019260010302620016dd565b505b50905062001724919062001763565b5090565b606060405190810160405280600390602082028038833980820191505090505090565b5060009055565b604051610baa806200179e83390190565b6200179a91905b808211156200179657600081816101000a81549067ffffffffffffffff0219169055506001016200176a565b5090565b9056006080604052604051610baa380380610baa833981018060405281019080805190602001909291908051906020019092919080518201929190505050828160405180807f6f72672e7a657070656c696e6f732e70726f78792e696d706c656d656e74617481526020017f696f6e000000000000000000000000000000000000000000000000000000000081525060230190506040518091039020600019167f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3600102600019161415156100cd57fe5b6100e58261020d640100000000026401000000009004565b600081511115610180578173ffffffffffffffffffffffffffffffffffffffff168160405180828051906020019080838360005b83811015610134578082015181840152602081019050610119565b50505050905090810190601f1680156101615780820380516001836020036101000a031916815260200191505b50915050600060405180830381855af4915050151561017f57600080fd5b5b505060405180807f6f72672e7a657070656c696e6f732e70726f78792e61646d696e000000000000815250601a0190506040518091039020600019167f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b600102600019161415156101ed57fe5b610205826102f2640100000000026401000000009004565b505050610334565b600061022b8261032164010000000002610828176401000000009004565b15156102c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001807f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f81526020017f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000081525060400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c360010290508181555050565b60007f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b60010290508181555050565b600080823b905060008111915050919050565b610867806103436000396000f30060806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633659cfe6146100775780634f1ef286146100ba5780635c60da1b146101085780638f2839701461015f578063f851a440146101a2575b6100756101f9565b005b34801561008357600080fd5b506100b8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610213565b005b610106600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390505050610268565b005b34801561011457600080fd5b5061011d610305565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561016b57600080fd5b506101a0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061035d565b005b3480156101ae57600080fd5b506101b761051b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610201610573565b61021161020c61064e565b61067f565b565b61021b6106a5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561025c57610257816106d6565b610265565b6102646101f9565b5b50565b6102706106a5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102f7576102ac836106d6565b8273ffffffffffffffffffffffffffffffffffffffff16828260405180838380828437820191505092505050600060405180830381855af491505015156102f257600080fd5b610300565b6102ff6101f9565b5b505050565b600061030f6106a5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156103515761034a61064e565b905061035a565b6103596101f9565b5b90565b6103656106a5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561050f57600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610463576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001807f43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f81526020017f787920746f20746865207a65726f20616464726573730000000000000000000081525060400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61048c6106a5565b82604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a161050a81610725565b610518565b6105176101f9565b5b50565b60006105256106a5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610567576105606106a5565b9050610570565b61056f6101f9565b5b90565b61057b6106a5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515610644576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e20667281526020017f6f6d207468652070726f78792061646d696e000000000000000000000000000081525060400191505060405180910390fd5b61064c610754565b565b6000807f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c36001029050805491505090565b3660008037600080366000845af43d6000803e80600081146106a0573d6000f35b3d6000fd5b6000807f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b6001029050805491505090565b6106df81610756565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b60007f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b60010290508181555050565b565b600061076182610828565b15156107fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001807f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f81526020017f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000081525060400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c360010290508181555050565b600080823b9050600081119150509190505600a165627a7a723058202029b82c05a453a0ab69adc4daaaac163e04b8cfc21e38fceccfcffcefb057f80029a165627a7a7230582035409b16d5f5be277f13e565df971823b1a1fcf037f06b2303c87601086fff110029",
  "sourceMap": "319:4722:1:-;;;1192:24;8:9:-1;5:2;;;30:1;27;20:12;5:2;1192:24:1;575:10:29;567:5;;:18;;;;;;;;;;;;;;;;;;319:4722:1;;;;;;",
  "deployedSourceMap": "319:4722:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3566:280;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3566:280:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1397:310;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1397:310:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;827:111:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;827:111:29;;;;;;2479:322:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2479:322:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1947:183;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1947:183:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1947:183:1;;;;;;;;;;;;;;;;;238:20:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;238:20:29;;;;;;;;;;;;;;;;;;;;;;;;;;;2974:282:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2974:282:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4658:381;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1100:103:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1100:103:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;3566:280:1;3655:7;3670:31;3704:24;3716:11;3704;:24::i;:::-;3670:58;;3767:1;3738:31;;3746:8;3738:31;;;3734:54;;;3786:1;3771:17;;;;3734:54;3801:8;:26;;;3828:12;3801:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3801:40:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3801:40:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3801:40:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3801:40:1;;;;;;;;;;;;;;;;3794:47;;3566:280;;;;;;:::o;1397:310::-;1459:31;1498:25;1526:9;1536:11;1526:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1526:22:1;;;;;;;;;;;;;;;;;;;;;1498:50;;1591:1;1558:35;;1566:4;:12;;;;;;;;;;;;1558:35;;;1554:73;;;1625:1;1595:32;;;;1554:73;1663:4;:12;;;;;;;;;;;;:24;;;1688:4;:12;;1663:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1663:38:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1663:38:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1663:38:1;;;;;;;;;;;;;;;;1633:69;;1397:310;;;;;:::o;827:111:29:-;719:5;;;;;;;;;;;705:19;;:10;:19;;;697:28;;;;;;;;903:5;;;;;;;;;;;884:25;;;;;;;;;;;;931:1;915:5;;:18;;;;;;;;;;;;;;;;;;827:111::o;2479:322:1:-;719:5:29;;;;;;;;;;;705:19;;:10;:19;;;697:28;;;;;;;;2586:7:1;:18;;;2605:7;2586:27;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2586:27:1;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2586:27:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2586:27:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2586:27:1;;;;;;;;;;;;;;;;2578:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2710:30;;;;;;;;;2723:7;2710:30;;;;;;2732:7;2710:30;;;2685:9;2695:11;2685:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2685:22:1;;;;;;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;2751:45;2766:11;2779:7;2788;2751:45;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2751:45:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2751:45:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2479:322;;;:::o;1947:183::-;2008:7;2017:9;;:::i;:::-;2034:25;2062:9;2072:11;2062:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2062:22:1;;;;;;;;;;;;;;;;;;;;;2034:50;;2098:4;:12;;;;;;;;;;;;2112:4;:12;;2090:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1947:183;;;;:::o;238:20:29:-;;;;;;;;;;;;;:::o;2974:282:1:-;719:5:29;;;;;;;;;;;705:19;;:10;:19;;;697:28;;;;;;;;3098:1:1;3047:53;;3055:9;3065:11;3055:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3055:22:1;;;;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;3047:53;;;;3039:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3144:9;3154:11;3144:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3144:22:1;;;;;;;;;;;;;;;;;;;;;;3137:29;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3177:74;3192:11;3213:1;3177:74;;;;;;;;;3225:1;3177:74;;;;;;;;3236:1;3177:74;;;;;;;;3247:1;3177:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3177:74:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3177:74:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2974:282;:::o;4658:381::-;4766:24;4799:22;4875:30;4824:44;4842:11;4855:12;4824:17;:44::i;:::-;4799:69;;4945:9;4956:14;4972:5;4979:4;4908:76;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4908:76:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4908:76:1;;;4875:109;;4996:19;5009:5;4996:19;;;;;;;;;;;;;;;;;;;;;;5029:5;5022:12;;4658:381;;;;;;;;:::o;1100:103:29:-;719:5;;;;;;;;;;;705:19;;:10;:19;;;697:28;;;;;;;;1169:29;1188:9;1169:18;:29::i;:::-;1100:103;:::o;1338:171::-;1429:1;1408:23;;:9;:23;;;;1400:32;;;;;;;;1471:9;1443:38;;1464:5;;;;;;;;;;;1443:38;;;;;;;;;;;;1495:9;1487:5;;:17;;;;;;;;;;;;;;;;;;1338:171;:::o;319:4722:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;319:4722:1;;;;:::o;:::-;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o",
  "source": "pragma solidity ^0.4.24;\n\nimport \"./ImplementationProvider.sol\";\nimport \"./Package.sol\";\nimport \"../upgradeability/AdminUpgradeabilityProxy.sol\";\nimport \"openzeppelin-solidity/contracts/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 Ownable {\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 The provider.\n   */\n  function getProvider(string 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 packageName) public view returns (Package, uint64[3]) {\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 packageName, Package package, uint64[3] 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, 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 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 packageName, string 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 packageName, string contractName, address admin, bytes 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(proxy);\n     return proxy;\n  }\n}\n",
  "sourcePath": "/Users/yoonjae/WebstormProjects/zos/packages/lib/contracts/application/App.sol",
  "ast": {
    "absolutePath": "/Users/yoonjae/WebstormProjects/zos/packages/lib/contracts/application/App.sol",
    "exportedSymbols": {
      "App": [
        308
      ]
    },
    "id": 309,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 57,
        "literals": [
          "solidity",
          "^",
          "0.4",
          ".24"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:24:1"
      },
      {
        "absolutePath": "/Users/yoonjae/WebstormProjects/zos/packages/lib/contracts/application/ImplementationProvider.sol",
        "file": "./ImplementationProvider.sol",
        "id": 58,
        "nodeType": "ImportDirective",
        "scope": 309,
        "sourceUnit": 436,
        "src": "26:38:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/yoonjae/WebstormProjects/zos/packages/lib/contracts/application/Package.sol",
        "file": "./Package.sol",
        "id": 59,
        "nodeType": "ImportDirective",
        "scope": 309,
        "sourceUnit": 777,
        "src": "65:23:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/yoonjae/WebstormProjects/zos/packages/lib/contracts/upgradeability/AdminUpgradeabilityProxy.sol",
        "file": "../upgradeability/AdminUpgradeabilityProxy.sol",
        "id": 60,
        "nodeType": "ImportDirective",
        "scope": 309,
        "sourceUnit": 2813,
        "src": "89:56:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/ownership/Ownable.sol",
        "file": "openzeppelin-solidity/contracts/ownership/Ownable.sol",
        "id": 61,
        "nodeType": "ImportDirective",
        "scope": 309,
        "sourceUnit": 3143,
        "src": "146:63:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 62,
              "name": "Ownable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 3142,
              "src": "335:7:1",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Ownable_$3142",
                "typeString": "contract Ownable"
              }
            },
            "id": 63,
            "nodeType": "InheritanceSpecifier",
            "src": "335:7:1"
          }
        ],
        "contractDependencies": [
          2812,
          3142
        ],
        "contractKind": "contract",
        "documentation": "@title App\n@dev Contract for upgradeable applications.\nIt handles the creation of proxies.",
        "fullyImplemented": true,
        "id": 308,
        "linearizedBaseContracts": [
          308,
          3142
        ],
        "name": "App",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "documentation": "@dev Emitted when a new proxy is created.\n@param proxy Address of the created proxy.",
            "id": 67,
            "name": "ProxyCreated",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 66,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 65,
                  "indexed": false,
                  "name": "proxy",
                  "nodeType": "VariableDeclaration",
                  "scope": 67,
                  "src": "473:13:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 64,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "473:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "472:15:1"
            },
            "src": "454:34:1"
          },
          {
            "anonymous": false,
            "documentation": "@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": 77,
            "name": "PackageChanged",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 76,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 69,
                  "indexed": false,
                  "name": "providerName",
                  "nodeType": "VariableDeclaration",
                  "scope": 77,
                  "src": "777:19:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 68,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "777:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 71,
                  "indexed": false,
                  "name": "package",
                  "nodeType": "VariableDeclaration",
                  "scope": 77,
                  "src": "798:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 70,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "798:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 75,
                  "indexed": false,
                  "name": "version",
                  "nodeType": "VariableDeclaration",
                  "scope": 77,
                  "src": "815:17:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                    "typeString": "uint64[3]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 72,
                      "name": "uint64",
                      "nodeType": "ElementaryTypeName",
                      "src": "815:6:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "id": 74,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "33",
                      "id": 73,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "822:1:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": null,
                        "typeString": null
                      },
                      "value": "3"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "815:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                      "typeString": "uint64[3]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "776:57:1"
            },
            "src": "756:78:1"
          },
          {
            "canonicalName": "App.ProviderInfo",
            "id": 84,
            "members": [
              {
                "constant": false,
                "id": 79,
                "name": "package",
                "nodeType": "VariableDeclaration",
                "scope": 84,
                "src": "964:15:1",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_contract$_Package_$776",
                  "typeString": "contract Package"
                },
                "typeName": {
                  "contractScope": null,
                  "id": 78,
                  "name": "Package",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 776,
                  "src": "964:7:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Package_$776",
                    "typeString": "contract Package"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 83,
                "name": "version",
                "nodeType": "VariableDeclaration",
                "scope": 84,
                "src": "985:17:1",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                  "typeString": "uint64[3]"
                },
                "typeName": {
                  "baseType": {
                    "id": 80,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "985:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "id": 82,
                  "length": {
                    "argumentTypes": null,
                    "hexValue": "33",
                    "id": 81,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "992:1:1",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": null,
                      "typeString": null
                    },
                    "value": "3"
                  },
                  "nodeType": "ArrayTypeName",
                  "src": "985:9:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                    "typeString": "uint64[3]"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "ProviderInfo",
            "nodeType": "StructDefinition",
            "scope": 308,
            "src": "938:69:1",
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 88,
            "name": "providers",
            "nodeType": "VariableDeclaration",
            "scope": 308,
            "src": "1093:50:1",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
              "typeString": "mapping(string => struct App.ProviderInfo)"
            },
            "typeName": {
              "id": 87,
              "keyType": {
                "id": 85,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "1101:6:1",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "nodeType": "Mapping",
              "src": "1093:31:1",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
                "typeString": "mapping(string => struct App.ProviderInfo)"
              },
              "valueType": {
                "contractScope": null,
                "id": 86,
                "name": "ProviderInfo",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 84,
                "src": "1111:12:1",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                  "typeString": "struct App.ProviderInfo"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 91,
              "nodeType": "Block",
              "src": "1213:3:1",
              "statements": []
            },
            "documentation": "@dev Constructor function.",
            "id": 92,
            "implemented": true,
            "isConstructor": true,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 89,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1203:2:1"
            },
            "payable": false,
            "returnParameters": {
              "id": 90,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1213:0:1"
            },
            "scope": 308,
            "src": "1192:24:1",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 127,
              "nodeType": "Block",
              "src": "1492:215:1",
              "statements": [
                {
                  "assignments": [
                    100
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 100,
                      "name": "info",
                      "nodeType": "VariableDeclaration",
                      "scope": 128,
                      "src": "1498:25:1",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                        "typeString": "struct App.ProviderInfo"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 99,
                        "name": "ProviderInfo",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 84,
                        "src": "1498:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                          "typeString": "struct App.ProviderInfo"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 104,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 101,
                      "name": "providers",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 88,
                      "src": "1526:9:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
                        "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                      }
                    },
                    "id": 103,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 102,
                      "name": "packageName",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 94,
                      "src": "1536:11:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "1526:22:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_ProviderInfo_$84_storage",
                      "typeString": "struct App.ProviderInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1498:50:1"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 112,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 106,
                            "name": "info",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 100,
                            "src": "1566:4:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                              "typeString": "struct App.ProviderInfo storage pointer"
                            }
                          },
                          "id": 107,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "package",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 79,
                          "src": "1566:12:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Package_$776",
                            "typeString": "contract Package"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_Package_$776",
                            "typeString": "contract Package"
                          }
                        ],
                        "id": 105,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1558:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 108,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1558:21:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 110,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1591: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": 109,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1583:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 111,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1583:10:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1558:35:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 117,
                  "nodeType": "IfStatement",
                  "src": "1554:73:1",
                  "trueBody": {
                    "expression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 114,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1625: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": 113,
                        "name": "ImplementationProvider",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 435,
                        "src": "1602:22:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_ImplementationProvider_$435_$",
                          "typeString": "type(contract ImplementationProvider)"
                        }
                      },
                      "id": 115,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1602:25:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                        "typeString": "contract ImplementationProvider"
                      }
                    },
                    "functionReturnParameters": 98,
                    "id": 116,
                    "nodeType": "Return",
                    "src": "1595:32:1"
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 122,
                              "name": "info",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 100,
                              "src": "1688:4:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                                "typeString": "struct App.ProviderInfo storage pointer"
                              }
                            },
                            "id": 123,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "version",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 83,
                            "src": "1688: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": 119,
                              "name": "info",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 100,
                              "src": "1663:4:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                                "typeString": "struct App.ProviderInfo storage pointer"
                              }
                            },
                            "id": 120,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "package",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 79,
                            "src": "1663:12:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Package_$776",
                              "typeString": "contract Package"
                            }
                          },
                          "id": 121,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "getContract",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 516,
                          "src": "1663: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": 124,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1663:38:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 118,
                      "name": "ImplementationProvider",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 435,
                      "src": "1640:22:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_contract$_ImplementationProvider_$435_$",
                        "typeString": "type(contract ImplementationProvider)"
                      }
                    },
                    "id": 125,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1640:62:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                      "typeString": "contract ImplementationProvider"
                    }
                  },
                  "functionReturnParameters": 98,
                  "id": 126,
                  "nodeType": "Return",
                  "src": "1633:69:1"
                }
              ]
            },
            "documentation": "@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 The provider.",
            "id": 128,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "getProvider",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 95,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 94,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 128,
                  "src": "1418:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 93,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1418:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1417:20:1"
            },
            "payable": false,
            "returnParameters": {
              "id": 98,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 97,
                  "name": "provider",
                  "nodeType": "VariableDeclaration",
                  "scope": 128,
                  "src": "1459:31:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                    "typeString": "contract ImplementationProvider"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 96,
                    "name": "ImplementationProvider",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 435,
                    "src": "1459:22:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                      "typeString": "contract ImplementationProvider"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1458:33:1"
            },
            "scope": 308,
            "src": "1397:310:1",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 151,
              "nodeType": "Block",
              "src": "2028:102:1",
              "statements": [
                {
                  "assignments": [
                    140
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 140,
                      "name": "info",
                      "nodeType": "VariableDeclaration",
                      "scope": 152,
                      "src": "2034:25:1",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                        "typeString": "struct App.ProviderInfo"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 139,
                        "name": "ProviderInfo",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 84,
                        "src": "2034:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                          "typeString": "struct App.ProviderInfo"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 144,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 141,
                      "name": "providers",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 88,
                      "src": "2062:9:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
                        "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                      }
                    },
                    "id": 143,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 142,
                      "name": "packageName",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 130,
                      "src": "2072:11:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2062:22:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_ProviderInfo_$84_storage",
                      "typeString": "struct App.ProviderInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2034:50:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 145,
                          "name": "info",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 140,
                          "src": "2098:4:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                            "typeString": "struct App.ProviderInfo storage pointer"
                          }
                        },
                        "id": 146,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "package",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 79,
                        "src": "2098:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Package_$776",
                          "typeString": "contract Package"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 147,
                          "name": "info",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 140,
                          "src": "2112:4:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                            "typeString": "struct App.ProviderInfo storage pointer"
                          }
                        },
                        "id": 148,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "version",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 83,
                        "src": "2112:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint64_$3_storage",
                          "typeString": "uint64[3] storage ref"
                        }
                      }
                    ],
                    "id": 149,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "2097:28:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_contract$_Package_$776_$_t_array$_t_uint64_$3_storage_$",
                      "typeString": "tuple(contract Package,uint64[3] storage ref)"
                    }
                  },
                  "functionReturnParameters": 138,
                  "id": 150,
                  "nodeType": "Return",
                  "src": "2090:35:1"
                }
              ]
            },
            "documentation": "@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",
            "id": 152,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "getPackage",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 131,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 130,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 152,
                  "src": "1967:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 129,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1967:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1966:20:1"
            },
            "payable": false,
            "returnParameters": {
              "id": 138,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 133,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 152,
                  "src": "2008:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Package_$776",
                    "typeString": "contract Package"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 132,
                    "name": "Package",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 776,
                    "src": "2008:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Package_$776",
                      "typeString": "contract Package"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 137,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 152,
                  "src": "2017:9:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                    "typeString": "uint64[3]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 134,
                      "name": "uint64",
                      "nodeType": "ElementaryTypeName",
                      "src": "2017:6:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "id": 136,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "33",
                      "id": 135,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2024:1:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": null,
                        "typeString": null
                      },
                      "value": "3"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "2017:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                      "typeString": "uint64[3]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2007:20:1"
            },
            "scope": 308,
            "src": "1947:183:1",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 188,
              "nodeType": "Block",
              "src": "2572:229:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 168,
                            "name": "version",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 160,
                            "src": "2605: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": 166,
                            "name": "package",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 156,
                            "src": "2586:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Package_$776",
                              "typeString": "contract Package"
                            }
                          },
                          "id": 167,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "hasVersion",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 676,
                          "src": "2586: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": 169,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2586:27:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546865207265717565737465642076657273696f6e206d757374206265207265676973746572656420696e2074686520676976656e207061636b616765",
                        "id": 170,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2615: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": 165,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3160,
                        3161
                      ],
                      "referencedDeclaration": 3161,
                      "src": "2578:7:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 171,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2578:101:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 172,
                  "nodeType": "ExpressionStatement",
                  "src": "2578:101:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 180,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 173,
                        "name": "providers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 88,
                        "src": "2685:9:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
                          "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                        }
                      },
                      "id": 175,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 174,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 154,
                        "src": "2695:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2685:22:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$84_storage",
                        "typeString": "struct App.ProviderInfo storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 177,
                          "name": "package",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 156,
                          "src": "2723:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Package_$776",
                            "typeString": "contract Package"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 178,
                          "name": "version",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 160,
                          "src": "2732:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                            "typeString": "uint64[3] memory"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_Package_$776",
                            "typeString": "contract Package"
                          },
                          {
                            "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                            "typeString": "uint64[3] memory"
                          }
                        ],
                        "id": 176,
                        "name": "ProviderInfo",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 84,
                        "src": "2710:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_struct$_ProviderInfo_$84_storage_ptr_$",
                          "typeString": "type(struct App.ProviderInfo storage pointer)"
                        }
                      },
                      "id": 179,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "structConstructorCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2710:30:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$84_memory",
                        "typeString": "struct App.ProviderInfo memory"
                      }
                    },
                    "src": "2685:55:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_ProviderInfo_$84_storage",
                      "typeString": "struct App.ProviderInfo storage ref"
                    }
                  },
                  "id": 181,
                  "nodeType": "ExpressionStatement",
                  "src": "2685:55:1"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 183,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 154,
                        "src": "2766:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 184,
                        "name": "package",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 156,
                        "src": "2779:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Package_$776",
                          "typeString": "contract Package"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 185,
                        "name": "version",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 160,
                        "src": "2788: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_contract$_Package_$776",
                          "typeString": "contract Package"
                        },
                        {
                          "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                          "typeString": "uint64[3] memory"
                        }
                      ],
                      "id": 182,
                      "name": "PackageChanged",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 77,
                      "src": "2751: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": 186,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2751:45:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 187,
                  "nodeType": "EmitStatement",
                  "src": "2746:50:1"
                }
              ]
            },
            "documentation": "@dev Sets a package in a specific version as a dependency for this application.\nRequires 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.",
            "id": 189,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [
              {
                "arguments": null,
                "id": 163,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 162,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 3090,
                  "src": "2562:9:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2562:9:1"
              }
            ],
            "name": "setPackage",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 161,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 154,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 189,
                  "src": "2499:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 153,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2499:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 156,
                  "name": "package",
                  "nodeType": "VariableDeclaration",
                  "scope": 189,
                  "src": "2519:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Package_$776",
                    "typeString": "contract Package"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 155,
                    "name": "Package",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 776,
                    "src": "2519:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Package_$776",
                      "typeString": "contract Package"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 160,
                  "name": "version",
                  "nodeType": "VariableDeclaration",
                  "scope": 189,
                  "src": "2536:17:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                    "typeString": "uint64[3]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 157,
                      "name": "uint64",
                      "nodeType": "ElementaryTypeName",
                      "src": "2536:6:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "id": 159,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "33",
                      "id": 158,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2543:1:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": null,
                        "typeString": null
                      },
                      "value": "3"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "2536:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                      "typeString": "uint64[3]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2498:56:1"
            },
            "payable": false,
            "returnParameters": {
              "id": 164,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2572:0:1"
            },
            "scope": 308,
            "src": "2479:322:1",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 232,
              "nodeType": "Block",
              "src": "3033:223:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 206,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 198,
                                  "name": "providers",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 88,
                                  "src": "3055:9:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
                                    "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                                  }
                                },
                                "id": 200,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 199,
                                  "name": "packageName",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 191,
                                  "src": "3065:11:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "3055:22:1",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_ProviderInfo_$84_storage",
                                  "typeString": "struct App.ProviderInfo storage ref"
                                }
                              },
                              "id": 201,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "package",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 79,
                              "src": "3055:30:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_Package_$776",
                                "typeString": "contract Package"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_Package_$776",
                                "typeString": "contract Package"
                              }
                            ],
                            "id": 197,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3047:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 202,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3047:39:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 204,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3098: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": 203,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3090:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 205,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3090:10:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "3047:53:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5061636b61676520746f20756e736574206e6f7420666f756e64",
                        "id": 207,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3102: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": 196,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3160,
                        3161
                      ],
                      "referencedDeclaration": 3161,
                      "src": "3039:7:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 208,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3039:92:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 209,
                  "nodeType": "ExpressionStatement",
                  "src": "3039:92:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 213,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "delete",
                    "prefix": true,
                    "src": "3137:29:1",
                    "subExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 210,
                        "name": "providers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 88,
                        "src": "3144:9:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
                          "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                        }
                      },
                      "id": 212,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 211,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 191,
                        "src": "3154:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "3144:22:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$84_storage",
                        "typeString": "struct App.ProviderInfo storage ref"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 214,
                  "nodeType": "ExpressionStatement",
                  "src": "3137:29:1"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 216,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 191,
                        "src": "3192:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 218,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3213: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": 217,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "3205:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 219,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3205:10:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "components": [
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 221,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3225: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": 220,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3218:6:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": "uint64"
                            },
                            "id": 222,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3218:9:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 224,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3236: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": 223,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3229:6:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": "uint64"
                            },
                            "id": 225,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3229:9:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 227,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3247: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": 226,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3240:6:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": "uint64"
                            },
                            "id": 228,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3240:9:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          }
                        ],
                        "id": 229,
                        "isConstant": false,
                        "isInlineArray": true,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "3217: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",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                          "typeString": "uint64[3] memory"
                        }
                      ],
                      "id": 215,
                      "name": "PackageChanged",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 77,
                      "src": "3177: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": 230,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3177:74:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 231,
                  "nodeType": "EmitStatement",
                  "src": "3172:79:1"
                }
              ]
            },
            "documentation": "@dev Unsets a package given its name.\nReverts if the package is not set in the application.\n@param packageName Name of the package to remove.",
            "id": 233,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [
              {
                "arguments": null,
                "id": 194,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 193,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 3090,
                  "src": "3023:9:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "3023:9:1"
              }
            ],
            "name": "unsetPackage",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 192,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 191,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 233,
                  "src": "2996:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 190,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2996:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2995:20:1"
            },
            "payable": false,
            "returnParameters": {
              "id": 195,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3033:0:1"
            },
            "scope": 308,
            "src": "2974:282:1",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 265,
              "nodeType": "Block",
              "src": "3664:182:1",
              "statements": [
                {
                  "assignments": [
                    243
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 243,
                      "name": "provider",
                      "nodeType": "VariableDeclaration",
                      "scope": 266,
                      "src": "3670:31:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                        "typeString": "contract ImplementationProvider"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 242,
                        "name": "ImplementationProvider",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 435,
                        "src": "3670:22:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                          "typeString": "contract ImplementationProvider"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 247,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 245,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 235,
                        "src": "3716:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 244,
                      "name": "getProvider",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 128,
                      "src": "3704:11:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$returns$_t_contract$_ImplementationProvider_$435_$",
                        "typeString": "function (string memory) view returns (contract ImplementationProvider)"
                      }
                    },
                    "id": 246,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3704:24:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                      "typeString": "contract ImplementationProvider"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3670:58:1"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 254,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 249,
                          "name": "provider",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 243,
                          "src": "3746:8:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                            "typeString": "contract ImplementationProvider"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                            "typeString": "contract ImplementationProvider"
                          }
                        ],
                        "id": 248,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3738:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 250,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3738:17:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 252,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3767: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": 251,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3759:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 253,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3759:10:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "3738:31:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 259,
                  "nodeType": "IfStatement",
                  "src": "3734:54:1",
                  "trueBody": {
                    "expression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 256,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3786: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": 255,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3778:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 257,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3778:10:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "functionReturnParameters": 241,
                    "id": 258,
                    "nodeType": "Return",
                    "src": "3771:17:1"
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 262,
                        "name": "contractName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 237,
                        "src": "3828: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": 260,
                        "name": "provider",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 243,
                        "src": "3801:8:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                          "typeString": "contract ImplementationProvider"
                        }
                      },
                      "id": 261,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "getImplementation",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 434,
                      "src": "3801:26:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_string_memory_ptr_$returns$_t_address_$",
                        "typeString": "function (string memory) view external returns (address)"
                      }
                    },
                    "id": 263,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3801:40:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 241,
                  "id": 264,
                  "nodeType": "Return",
                  "src": "3794:47:1"
                }
              ]
            },
            "documentation": "@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.",
            "id": 266,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "getImplementation",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 238,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 235,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 266,
                  "src": "3593:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 234,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3593:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 237,
                  "name": "contractName",
                  "nodeType": "VariableDeclaration",
                  "scope": 266,
                  "src": "3613:19:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 236,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3613:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3592:41:1"
            },
            "payable": false,
            "returnParameters": {
              "id": 241,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 240,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 266,
                  "src": "3655:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 239,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3655:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3654:9:1"
            },
            "scope": 308,
            "src": "3566:280:1",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 306,
              "nodeType": "Block",
              "src": "4792:247:1",
              "statements": [
                {
                  "assignments": [
                    280
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 280,
                      "name": "implementation",
                      "nodeType": "VariableDeclaration",
                      "scope": 307,
                      "src": "4799:22:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 279,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "4799:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 285,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 282,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 268,
                        "src": "4842:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 283,
                        "name": "contractName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 270,
                        "src": "4855: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": 281,
                      "name": "getImplementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 266,
                      "src": "4824: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": 284,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4824:44:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4799:69:1"
                },
                {
                  "assignments": [
                    287
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 287,
                      "name": "proxy",
                      "nodeType": "VariableDeclaration",
                      "scope": 307,
                      "src": "4875:30:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                        "typeString": "contract AdminUpgradeabilityProxy"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 286,
                        "name": "AdminUpgradeabilityProxy",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 2812,
                        "src": "4875:24:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                          "typeString": "contract AdminUpgradeabilityProxy"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 299,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 295,
                        "name": "implementation",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 280,
                        "src": "4956:14:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 296,
                        "name": "admin",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 272,
                        "src": "4972:5:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 297,
                        "name": "data",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 274,
                        "src": "4979: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"
                        }
                      ],
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 292,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3157,
                            "src": "4945:3:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 293,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "value",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "4945:9:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 289,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "4909:28:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$2812_$",
                                "typeString": "function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 288,
                                "name": "AdminUpgradeabilityProxy",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 2812,
                                "src": "4913:24:1",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                                  "typeString": "contract AdminUpgradeabilityProxy"
                                }
                              }
                            }
                          ],
                          "id": 290,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "4908:30:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$2812_$",
                            "typeString": "function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy)"
                          }
                        },
                        "id": 291,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "value",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "4908:36:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_setvalue_nonpayable$_t_uint256_$returns$_t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$2812_$value_$",
                          "typeString": "function (uint256) returns (function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy))"
                        }
                      },
                      "id": 294,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4908:47:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$2812_$value",
                        "typeString": "function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy)"
                      }
                    },
                    "id": 298,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4908:76:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                      "typeString": "contract AdminUpgradeabilityProxy"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4875:109:1"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 301,
                        "name": "proxy",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 287,
                        "src": "5009:5:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                          "typeString": "contract AdminUpgradeabilityProxy"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                          "typeString": "contract AdminUpgradeabilityProxy"
                        }
                      ],
                      "id": 300,
                      "name": "ProxyCreated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 67,
                      "src": "4996:12:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 302,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4996:19:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 303,
                  "nodeType": "EmitStatement",
                  "src": "4991:24:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 304,
                    "name": "proxy",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 287,
                    "src": "5029:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                      "typeString": "contract AdminUpgradeabilityProxy"
                    }
                  },
                  "functionReturnParameters": 278,
                  "id": 305,
                  "nodeType": "Return",
                  "src": "5022:12:1"
                }
              ]
            },
            "documentation": "@dev Creates a new proxy for the given contract and forwards a function call to it.\nThis 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.\nIt should include the signature and the parameters of the function to be called, as described in\nhttps://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.\nThis parameter is optional, if no data is given the initialization call to proxied contract will be skipped.\n@return Address of the new proxy.",
            "id": 307,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "create",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 275,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 268,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 307,
                  "src": "4674:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 267,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "4674:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 270,
                  "name": "contractName",
                  "nodeType": "VariableDeclaration",
                  "scope": 307,
                  "src": "4694:19:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 269,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "4694:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 272,
                  "name": "admin",
                  "nodeType": "VariableDeclaration",
                  "scope": 307,
                  "src": "4715:13:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 271,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4715:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 274,
                  "name": "data",
                  "nodeType": "VariableDeclaration",
                  "scope": 307,
                  "src": "4730:10:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 273,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4730:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4673:68:1"
            },
            "payable": true,
            "returnParameters": {
              "id": 278,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 277,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 307,
                  "src": "4766:24:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                    "typeString": "contract AdminUpgradeabilityProxy"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 276,
                    "name": "AdminUpgradeabilityProxy",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 2812,
                    "src": "4766:24:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                      "typeString": "contract AdminUpgradeabilityProxy"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4765:26:1"
            },
            "scope": 308,
            "src": "4658:381:1",
            "stateMutability": "payable",
            "superFunction": null,
            "visibility": "public"
          }
        ],
        "scope": 309,
        "src": "319:4722:1"
      }
    ],
    "src": "0:5042:1"
  },
  "legacyAST": {
    "absolutePath": "/Users/yoonjae/WebstormProjects/zos/packages/lib/contracts/application/App.sol",
    "exportedSymbols": {
      "App": [
        308
      ]
    },
    "id": 309,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 57,
        "literals": [
          "solidity",
          "^",
          "0.4",
          ".24"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:24:1"
      },
      {
        "absolutePath": "/Users/yoonjae/WebstormProjects/zos/packages/lib/contracts/application/ImplementationProvider.sol",
        "file": "./ImplementationProvider.sol",
        "id": 58,
        "nodeType": "ImportDirective",
        "scope": 309,
        "sourceUnit": 436,
        "src": "26:38:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/yoonjae/WebstormProjects/zos/packages/lib/contracts/application/Package.sol",
        "file": "./Package.sol",
        "id": 59,
        "nodeType": "ImportDirective",
        "scope": 309,
        "sourceUnit": 777,
        "src": "65:23:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/yoonjae/WebstormProjects/zos/packages/lib/contracts/upgradeability/AdminUpgradeabilityProxy.sol",
        "file": "../upgradeability/AdminUpgradeabilityProxy.sol",
        "id": 60,
        "nodeType": "ImportDirective",
        "scope": 309,
        "sourceUnit": 2813,
        "src": "89:56:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "openzeppelin-solidity/contracts/ownership/Ownable.sol",
        "file": "openzeppelin-solidity/contracts/ownership/Ownable.sol",
        "id": 61,
        "nodeType": "ImportDirective",
        "scope": 309,
        "sourceUnit": 3143,
        "src": "146:63:1",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 62,
              "name": "Ownable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 3142,
              "src": "335:7:1",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Ownable_$3142",
                "typeString": "contract Ownable"
              }
            },
            "id": 63,
            "nodeType": "InheritanceSpecifier",
            "src": "335:7:1"
          }
        ],
        "contractDependencies": [
          2812,
          3142
        ],
        "contractKind": "contract",
        "documentation": "@title App\n@dev Contract for upgradeable applications.\nIt handles the creation of proxies.",
        "fullyImplemented": true,
        "id": 308,
        "linearizedBaseContracts": [
          308,
          3142
        ],
        "name": "App",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "documentation": "@dev Emitted when a new proxy is created.\n@param proxy Address of the created proxy.",
            "id": 67,
            "name": "ProxyCreated",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 66,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 65,
                  "indexed": false,
                  "name": "proxy",
                  "nodeType": "VariableDeclaration",
                  "scope": 67,
                  "src": "473:13:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 64,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "473:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "472:15:1"
            },
            "src": "454:34:1"
          },
          {
            "anonymous": false,
            "documentation": "@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": 77,
            "name": "PackageChanged",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 76,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 69,
                  "indexed": false,
                  "name": "providerName",
                  "nodeType": "VariableDeclaration",
                  "scope": 77,
                  "src": "777:19:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 68,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "777:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 71,
                  "indexed": false,
                  "name": "package",
                  "nodeType": "VariableDeclaration",
                  "scope": 77,
                  "src": "798:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 70,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "798:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 75,
                  "indexed": false,
                  "name": "version",
                  "nodeType": "VariableDeclaration",
                  "scope": 77,
                  "src": "815:17:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                    "typeString": "uint64[3]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 72,
                      "name": "uint64",
                      "nodeType": "ElementaryTypeName",
                      "src": "815:6:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "id": 74,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "33",
                      "id": 73,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "822:1:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": null,
                        "typeString": null
                      },
                      "value": "3"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "815:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                      "typeString": "uint64[3]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "776:57:1"
            },
            "src": "756:78:1"
          },
          {
            "canonicalName": "App.ProviderInfo",
            "id": 84,
            "members": [
              {
                "constant": false,
                "id": 79,
                "name": "package",
                "nodeType": "VariableDeclaration",
                "scope": 84,
                "src": "964:15:1",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_contract$_Package_$776",
                  "typeString": "contract Package"
                },
                "typeName": {
                  "contractScope": null,
                  "id": 78,
                  "name": "Package",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 776,
                  "src": "964:7:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Package_$776",
                    "typeString": "contract Package"
                  }
                },
                "value": null,
                "visibility": "internal"
              },
              {
                "constant": false,
                "id": 83,
                "name": "version",
                "nodeType": "VariableDeclaration",
                "scope": 84,
                "src": "985:17:1",
                "stateVariable": false,
                "storageLocation": "default",
                "typeDescriptions": {
                  "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                  "typeString": "uint64[3]"
                },
                "typeName": {
                  "baseType": {
                    "id": 80,
                    "name": "uint64",
                    "nodeType": "ElementaryTypeName",
                    "src": "985:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint64",
                      "typeString": "uint64"
                    }
                  },
                  "id": 82,
                  "length": {
                    "argumentTypes": null,
                    "hexValue": "33",
                    "id": 81,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "992:1:1",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": null,
                      "typeString": null
                    },
                    "value": "3"
                  },
                  "nodeType": "ArrayTypeName",
                  "src": "985:9:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                    "typeString": "uint64[3]"
                  }
                },
                "value": null,
                "visibility": "internal"
              }
            ],
            "name": "ProviderInfo",
            "nodeType": "StructDefinition",
            "scope": 308,
            "src": "938:69:1",
            "visibility": "public"
          },
          {
            "constant": false,
            "id": 88,
            "name": "providers",
            "nodeType": "VariableDeclaration",
            "scope": 308,
            "src": "1093:50:1",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
              "typeString": "mapping(string => struct App.ProviderInfo)"
            },
            "typeName": {
              "id": 87,
              "keyType": {
                "id": 85,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "1101:6:1",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              },
              "nodeType": "Mapping",
              "src": "1093:31:1",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
                "typeString": "mapping(string => struct App.ProviderInfo)"
              },
              "valueType": {
                "contractScope": null,
                "id": 86,
                "name": "ProviderInfo",
                "nodeType": "UserDefinedTypeName",
                "referencedDeclaration": 84,
                "src": "1111:12:1",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                  "typeString": "struct App.ProviderInfo"
                }
              }
            },
            "value": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 91,
              "nodeType": "Block",
              "src": "1213:3:1",
              "statements": []
            },
            "documentation": "@dev Constructor function.",
            "id": 92,
            "implemented": true,
            "isConstructor": true,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 89,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1203:2:1"
            },
            "payable": false,
            "returnParameters": {
              "id": 90,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1213:0:1"
            },
            "scope": 308,
            "src": "1192:24:1",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 127,
              "nodeType": "Block",
              "src": "1492:215:1",
              "statements": [
                {
                  "assignments": [
                    100
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 100,
                      "name": "info",
                      "nodeType": "VariableDeclaration",
                      "scope": 128,
                      "src": "1498:25:1",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                        "typeString": "struct App.ProviderInfo"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 99,
                        "name": "ProviderInfo",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 84,
                        "src": "1498:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                          "typeString": "struct App.ProviderInfo"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 104,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 101,
                      "name": "providers",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 88,
                      "src": "1526:9:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
                        "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                      }
                    },
                    "id": 103,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 102,
                      "name": "packageName",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 94,
                      "src": "1536:11:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "1526:22:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_ProviderInfo_$84_storage",
                      "typeString": "struct App.ProviderInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1498:50:1"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 112,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 106,
                            "name": "info",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 100,
                            "src": "1566:4:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                              "typeString": "struct App.ProviderInfo storage pointer"
                            }
                          },
                          "id": 107,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "package",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 79,
                          "src": "1566:12:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Package_$776",
                            "typeString": "contract Package"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_Package_$776",
                            "typeString": "contract Package"
                          }
                        ],
                        "id": 105,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1558:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 108,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1558:21:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 110,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1591: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": 109,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "1583:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 111,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1583:10:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1558:35:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 117,
                  "nodeType": "IfStatement",
                  "src": "1554:73:1",
                  "trueBody": {
                    "expression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 114,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1625: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": 113,
                        "name": "ImplementationProvider",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 435,
                        "src": "1602:22:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_ImplementationProvider_$435_$",
                          "typeString": "type(contract ImplementationProvider)"
                        }
                      },
                      "id": 115,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1602:25:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                        "typeString": "contract ImplementationProvider"
                      }
                    },
                    "functionReturnParameters": 98,
                    "id": 116,
                    "nodeType": "Return",
                    "src": "1595:32:1"
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 122,
                              "name": "info",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 100,
                              "src": "1688:4:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                                "typeString": "struct App.ProviderInfo storage pointer"
                              }
                            },
                            "id": 123,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "version",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 83,
                            "src": "1688: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": 119,
                              "name": "info",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 100,
                              "src": "1663:4:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                                "typeString": "struct App.ProviderInfo storage pointer"
                              }
                            },
                            "id": 120,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "package",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 79,
                            "src": "1663:12:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Package_$776",
                              "typeString": "contract Package"
                            }
                          },
                          "id": 121,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "getContract",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 516,
                          "src": "1663: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": 124,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1663:38:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 118,
                      "name": "ImplementationProvider",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 435,
                      "src": "1640:22:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_contract$_ImplementationProvider_$435_$",
                        "typeString": "type(contract ImplementationProvider)"
                      }
                    },
                    "id": 125,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1640:62:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                      "typeString": "contract ImplementationProvider"
                    }
                  },
                  "functionReturnParameters": 98,
                  "id": 126,
                  "nodeType": "Return",
                  "src": "1633:69:1"
                }
              ]
            },
            "documentation": "@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 The provider.",
            "id": 128,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "getProvider",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 95,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 94,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 128,
                  "src": "1418:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 93,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1418:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1417:20:1"
            },
            "payable": false,
            "returnParameters": {
              "id": 98,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 97,
                  "name": "provider",
                  "nodeType": "VariableDeclaration",
                  "scope": 128,
                  "src": "1459:31:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                    "typeString": "contract ImplementationProvider"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 96,
                    "name": "ImplementationProvider",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 435,
                    "src": "1459:22:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                      "typeString": "contract ImplementationProvider"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1458:33:1"
            },
            "scope": 308,
            "src": "1397:310:1",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 151,
              "nodeType": "Block",
              "src": "2028:102:1",
              "statements": [
                {
                  "assignments": [
                    140
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 140,
                      "name": "info",
                      "nodeType": "VariableDeclaration",
                      "scope": 152,
                      "src": "2034:25:1",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                        "typeString": "struct App.ProviderInfo"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 139,
                        "name": "ProviderInfo",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 84,
                        "src": "2034:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                          "typeString": "struct App.ProviderInfo"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 144,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 141,
                      "name": "providers",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 88,
                      "src": "2062:9:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
                        "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                      }
                    },
                    "id": 143,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 142,
                      "name": "packageName",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 130,
                      "src": "2072:11:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2062:22:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_ProviderInfo_$84_storage",
                      "typeString": "struct App.ProviderInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2034:50:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "components": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 145,
                          "name": "info",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 140,
                          "src": "2098:4:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                            "typeString": "struct App.ProviderInfo storage pointer"
                          }
                        },
                        "id": 146,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "package",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 79,
                        "src": "2098:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Package_$776",
                          "typeString": "contract Package"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 147,
                          "name": "info",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 140,
                          "src": "2112:4:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_ProviderInfo_$84_storage_ptr",
                            "typeString": "struct App.ProviderInfo storage pointer"
                          }
                        },
                        "id": 148,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "version",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 83,
                        "src": "2112:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint64_$3_storage",
                          "typeString": "uint64[3] storage ref"
                        }
                      }
                    ],
                    "id": 149,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "2097:28:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_contract$_Package_$776_$_t_array$_t_uint64_$3_storage_$",
                      "typeString": "tuple(contract Package,uint64[3] storage ref)"
                    }
                  },
                  "functionReturnParameters": 138,
                  "id": 150,
                  "nodeType": "Return",
                  "src": "2090:35:1"
                }
              ]
            },
            "documentation": "@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",
            "id": 152,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "getPackage",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 131,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 130,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 152,
                  "src": "1967:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 129,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1967:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1966:20:1"
            },
            "payable": false,
            "returnParameters": {
              "id": 138,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 133,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 152,
                  "src": "2008:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Package_$776",
                    "typeString": "contract Package"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 132,
                    "name": "Package",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 776,
                    "src": "2008:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Package_$776",
                      "typeString": "contract Package"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 137,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 152,
                  "src": "2017:9:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                    "typeString": "uint64[3]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 134,
                      "name": "uint64",
                      "nodeType": "ElementaryTypeName",
                      "src": "2017:6:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "id": 136,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "33",
                      "id": 135,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2024:1:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": null,
                        "typeString": null
                      },
                      "value": "3"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "2017:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                      "typeString": "uint64[3]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2007:20:1"
            },
            "scope": 308,
            "src": "1947:183:1",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 188,
              "nodeType": "Block",
              "src": "2572:229:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 168,
                            "name": "version",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 160,
                            "src": "2605: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": 166,
                            "name": "package",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 156,
                            "src": "2586:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Package_$776",
                              "typeString": "contract Package"
                            }
                          },
                          "id": 167,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "hasVersion",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 676,
                          "src": "2586: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": 169,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2586:27:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546865207265717565737465642076657273696f6e206d757374206265207265676973746572656420696e2074686520676976656e207061636b616765",
                        "id": 170,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2615: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": 165,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3160,
                        3161
                      ],
                      "referencedDeclaration": 3161,
                      "src": "2578:7:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 171,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2578:101:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 172,
                  "nodeType": "ExpressionStatement",
                  "src": "2578:101:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 180,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 173,
                        "name": "providers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 88,
                        "src": "2685:9:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
                          "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                        }
                      },
                      "id": 175,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 174,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 154,
                        "src": "2695:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2685:22:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$84_storage",
                        "typeString": "struct App.ProviderInfo storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 177,
                          "name": "package",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 156,
                          "src": "2723:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Package_$776",
                            "typeString": "contract Package"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 178,
                          "name": "version",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 160,
                          "src": "2732:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                            "typeString": "uint64[3] memory"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_Package_$776",
                            "typeString": "contract Package"
                          },
                          {
                            "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                            "typeString": "uint64[3] memory"
                          }
                        ],
                        "id": 176,
                        "name": "ProviderInfo",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 84,
                        "src": "2710:12:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_struct$_ProviderInfo_$84_storage_ptr_$",
                          "typeString": "type(struct App.ProviderInfo storage pointer)"
                        }
                      },
                      "id": 179,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "structConstructorCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2710:30:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$84_memory",
                        "typeString": "struct App.ProviderInfo memory"
                      }
                    },
                    "src": "2685:55:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_ProviderInfo_$84_storage",
                      "typeString": "struct App.ProviderInfo storage ref"
                    }
                  },
                  "id": 181,
                  "nodeType": "ExpressionStatement",
                  "src": "2685:55:1"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 183,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 154,
                        "src": "2766:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 184,
                        "name": "package",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 156,
                        "src": "2779:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Package_$776",
                          "typeString": "contract Package"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 185,
                        "name": "version",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 160,
                        "src": "2788: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_contract$_Package_$776",
                          "typeString": "contract Package"
                        },
                        {
                          "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                          "typeString": "uint64[3] memory"
                        }
                      ],
                      "id": 182,
                      "name": "PackageChanged",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 77,
                      "src": "2751: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": 186,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2751:45:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 187,
                  "nodeType": "EmitStatement",
                  "src": "2746:50:1"
                }
              ]
            },
            "documentation": "@dev Sets a package in a specific version as a dependency for this application.\nRequires 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.",
            "id": 189,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [
              {
                "arguments": null,
                "id": 163,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 162,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 3090,
                  "src": "2562:9:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2562:9:1"
              }
            ],
            "name": "setPackage",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 161,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 154,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 189,
                  "src": "2499:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 153,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2499:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 156,
                  "name": "package",
                  "nodeType": "VariableDeclaration",
                  "scope": 189,
                  "src": "2519:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Package_$776",
                    "typeString": "contract Package"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 155,
                    "name": "Package",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 776,
                    "src": "2519:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Package_$776",
                      "typeString": "contract Package"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 160,
                  "name": "version",
                  "nodeType": "VariableDeclaration",
                  "scope": 189,
                  "src": "2536:17:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                    "typeString": "uint64[3]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 157,
                      "name": "uint64",
                      "nodeType": "ElementaryTypeName",
                      "src": "2536:6:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint64",
                        "typeString": "uint64"
                      }
                    },
                    "id": 159,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "33",
                      "id": 158,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2543:1:1",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": null,
                        "typeString": null
                      },
                      "value": "3"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "2536:9:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint64_$3_storage_ptr",
                      "typeString": "uint64[3]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2498:56:1"
            },
            "payable": false,
            "returnParameters": {
              "id": 164,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2572:0:1"
            },
            "scope": 308,
            "src": "2479:322:1",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 232,
              "nodeType": "Block",
              "src": "3033:223:1",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 206,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 198,
                                  "name": "providers",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 88,
                                  "src": "3055:9:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
                                    "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                                  }
                                },
                                "id": 200,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 199,
                                  "name": "packageName",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 191,
                                  "src": "3065:11:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "3055:22:1",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_ProviderInfo_$84_storage",
                                  "typeString": "struct App.ProviderInfo storage ref"
                                }
                              },
                              "id": 201,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "package",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 79,
                              "src": "3055:30:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_Package_$776",
                                "typeString": "contract Package"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_Package_$776",
                                "typeString": "contract Package"
                              }
                            ],
                            "id": 197,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3047:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 202,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3047:39:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 204,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3098: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": 203,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3090:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": "address"
                          },
                          "id": 205,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3090:10:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "3047:53:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5061636b61676520746f20756e736574206e6f7420666f756e64",
                        "id": 207,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3102: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": 196,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        3160,
                        3161
                      ],
                      "referencedDeclaration": 3161,
                      "src": "3039:7:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 208,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3039:92:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 209,
                  "nodeType": "ExpressionStatement",
                  "src": "3039:92:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 213,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "delete",
                    "prefix": true,
                    "src": "3137:29:1",
                    "subExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 210,
                        "name": "providers",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 88,
                        "src": "3144:9:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_string_memory_$_t_struct$_ProviderInfo_$84_storage_$",
                          "typeString": "mapping(string memory => struct App.ProviderInfo storage ref)"
                        }
                      },
                      "id": 212,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 211,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 191,
                        "src": "3154:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "3144:22:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_ProviderInfo_$84_storage",
                        "typeString": "struct App.ProviderInfo storage ref"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 214,
                  "nodeType": "ExpressionStatement",
                  "src": "3137:29:1"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 216,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 191,
                        "src": "3192:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 218,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3213: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": 217,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "3205:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": "address"
                        },
                        "id": 219,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3205:10:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "components": [
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 221,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3225: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": 220,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3218:6:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": "uint64"
                            },
                            "id": 222,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3218:9:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 224,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3236: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": 223,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3229:6:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": "uint64"
                            },
                            "id": 225,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3229:9:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 227,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3247: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": 226,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3240:6:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint64_$",
                                "typeString": "type(uint64)"
                              },
                              "typeName": "uint64"
                            },
                            "id": 228,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3240:9:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint64",
                              "typeString": "uint64"
                            }
                          }
                        ],
                        "id": 229,
                        "isConstant": false,
                        "isInlineArray": true,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "3217: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",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_array$_t_uint64_$3_memory_ptr",
                          "typeString": "uint64[3] memory"
                        }
                      ],
                      "id": 215,
                      "name": "PackageChanged",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 77,
                      "src": "3177: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": 230,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3177:74:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 231,
                  "nodeType": "EmitStatement",
                  "src": "3172:79:1"
                }
              ]
            },
            "documentation": "@dev Unsets a package given its name.\nReverts if the package is not set in the application.\n@param packageName Name of the package to remove.",
            "id": 233,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [
              {
                "arguments": null,
                "id": 194,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 193,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 3090,
                  "src": "3023:9:1",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "3023:9:1"
              }
            ],
            "name": "unsetPackage",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 192,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 191,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 233,
                  "src": "2996:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 190,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2996:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2995:20:1"
            },
            "payable": false,
            "returnParameters": {
              "id": 195,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3033:0:1"
            },
            "scope": 308,
            "src": "2974:282:1",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 265,
              "nodeType": "Block",
              "src": "3664:182:1",
              "statements": [
                {
                  "assignments": [
                    243
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 243,
                      "name": "provider",
                      "nodeType": "VariableDeclaration",
                      "scope": 266,
                      "src": "3670:31:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                        "typeString": "contract ImplementationProvider"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 242,
                        "name": "ImplementationProvider",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 435,
                        "src": "3670:22:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                          "typeString": "contract ImplementationProvider"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 247,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 245,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 235,
                        "src": "3716:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 244,
                      "name": "getProvider",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 128,
                      "src": "3704:11:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$returns$_t_contract$_ImplementationProvider_$435_$",
                        "typeString": "function (string memory) view returns (contract ImplementationProvider)"
                      }
                    },
                    "id": 246,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3704:24:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                      "typeString": "contract ImplementationProvider"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3670:58:1"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 254,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 249,
                          "name": "provider",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 243,
                          "src": "3746:8:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                            "typeString": "contract ImplementationProvider"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                            "typeString": "contract ImplementationProvider"
                          }
                        ],
                        "id": 248,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3738:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 250,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3738:17:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 252,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3767: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": 251,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3759:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 253,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3759:10:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "3738:31:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 259,
                  "nodeType": "IfStatement",
                  "src": "3734:54:1",
                  "trueBody": {
                    "expression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 256,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3786: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": 255,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "3778:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": "address"
                      },
                      "id": 257,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3778:10:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "functionReturnParameters": 241,
                    "id": 258,
                    "nodeType": "Return",
                    "src": "3771:17:1"
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 262,
                        "name": "contractName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 237,
                        "src": "3828: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": 260,
                        "name": "provider",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 243,
                        "src": "3801:8:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ImplementationProvider_$435",
                          "typeString": "contract ImplementationProvider"
                        }
                      },
                      "id": 261,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "getImplementation",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 434,
                      "src": "3801:26:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_string_memory_ptr_$returns$_t_address_$",
                        "typeString": "function (string memory) view external returns (address)"
                      }
                    },
                    "id": 263,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3801:40:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 241,
                  "id": 264,
                  "nodeType": "Return",
                  "src": "3794:47:1"
                }
              ]
            },
            "documentation": "@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.",
            "id": 266,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": true,
            "modifiers": [],
            "name": "getImplementation",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 238,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 235,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 266,
                  "src": "3593:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 234,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3593:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 237,
                  "name": "contractName",
                  "nodeType": "VariableDeclaration",
                  "scope": 266,
                  "src": "3613:19:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 236,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3613:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3592:41:1"
            },
            "payable": false,
            "returnParameters": {
              "id": 241,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 240,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 266,
                  "src": "3655:7:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 239,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3655:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3654:9:1"
            },
            "scope": 308,
            "src": "3566:280:1",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 306,
              "nodeType": "Block",
              "src": "4792:247:1",
              "statements": [
                {
                  "assignments": [
                    280
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 280,
                      "name": "implementation",
                      "nodeType": "VariableDeclaration",
                      "scope": 307,
                      "src": "4799:22:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 279,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "4799:7:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 285,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 282,
                        "name": "packageName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 268,
                        "src": "4842:11:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 283,
                        "name": "contractName",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 270,
                        "src": "4855: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": 281,
                      "name": "getImplementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 266,
                      "src": "4824: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": 284,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4824:44:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4799:69:1"
                },
                {
                  "assignments": [
                    287
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 287,
                      "name": "proxy",
                      "nodeType": "VariableDeclaration",
                      "scope": 307,
                      "src": "4875:30:1",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                        "typeString": "contract AdminUpgradeabilityProxy"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 286,
                        "name": "AdminUpgradeabilityProxy",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 2812,
                        "src": "4875:24:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                          "typeString": "contract AdminUpgradeabilityProxy"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 299,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 295,
                        "name": "implementation",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 280,
                        "src": "4956:14:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 296,
                        "name": "admin",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 272,
                        "src": "4972:5:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 297,
                        "name": "data",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 274,
                        "src": "4979: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"
                        }
                      ],
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 292,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3157,
                            "src": "4945:3:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 293,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "value",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "4945:9:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 289,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "4909:28:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$2812_$",
                                "typeString": "function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 288,
                                "name": "AdminUpgradeabilityProxy",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 2812,
                                "src": "4913:24:1",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                                  "typeString": "contract AdminUpgradeabilityProxy"
                                }
                              }
                            }
                          ],
                          "id": 290,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "4908:30:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$2812_$",
                            "typeString": "function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy)"
                          }
                        },
                        "id": 291,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "value",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "4908:36:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_setvalue_nonpayable$_t_uint256_$returns$_t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$2812_$value_$",
                          "typeString": "function (uint256) returns (function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy))"
                        }
                      },
                      "id": 294,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4908:47:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_creation_payable$_t_address_$_t_address_$_t_bytes_memory_ptr_$returns$_t_contract$_AdminUpgradeabilityProxy_$2812_$value",
                        "typeString": "function (address,address,bytes memory) payable returns (contract AdminUpgradeabilityProxy)"
                      }
                    },
                    "id": 298,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4908:76:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                      "typeString": "contract AdminUpgradeabilityProxy"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4875:109:1"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 301,
                        "name": "proxy",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 287,
                        "src": "5009:5:1",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                          "typeString": "contract AdminUpgradeabilityProxy"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                          "typeString": "contract AdminUpgradeabilityProxy"
                        }
                      ],
                      "id": 300,
                      "name": "ProxyCreated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 67,
                      "src": "4996:12:1",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 302,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4996:19:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 303,
                  "nodeType": "EmitStatement",
                  "src": "4991:24:1"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 304,
                    "name": "proxy",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 287,
                    "src": "5029:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                      "typeString": "contract AdminUpgradeabilityProxy"
                    }
                  },
                  "functionReturnParameters": 278,
                  "id": 305,
                  "nodeType": "Return",
                  "src": "5022:12:1"
                }
              ]
            },
            "documentation": "@dev Creates a new proxy for the given contract and forwards a function call to it.\nThis 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.\nIt should include the signature and the parameters of the function to be called, as described in\nhttps://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.\nThis parameter is optional, if no data is given the initialization call to proxied contract will be skipped.\n@return Address of the new proxy.",
            "id": 307,
            "implemented": true,
            "isConstructor": false,
            "isDeclaredConst": false,
            "modifiers": [],
            "name": "create",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 275,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 268,
                  "name": "packageName",
                  "nodeType": "VariableDeclaration",
                  "scope": 307,
                  "src": "4674:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 267,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "4674:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 270,
                  "name": "contractName",
                  "nodeType": "VariableDeclaration",
                  "scope": 307,
                  "src": "4694:19:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 269,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "4694:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 272,
                  "name": "admin",
                  "nodeType": "VariableDeclaration",
                  "scope": 307,
                  "src": "4715:13:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 271,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4715:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 274,
                  "name": "data",
                  "nodeType": "VariableDeclaration",
                  "scope": 307,
                  "src": "4730:10:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 273,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4730:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4673:68:1"
            },
            "payable": true,
            "returnParameters": {
              "id": 278,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 277,
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 307,
                  "src": "4766:24:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                    "typeString": "contract AdminUpgradeabilityProxy"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 276,
                    "name": "AdminUpgradeabilityProxy",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 2812,
                    "src": "4766:24:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AdminUpgradeabilityProxy_$2812",
                      "typeString": "contract AdminUpgradeabilityProxy"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4765:26:1"
            },
            "scope": 308,
            "src": "4658:381:1",
            "stateMutability": "payable",
            "superFunction": null,
            "visibility": "public"
          }
        ],
        "scope": 309,
        "src": "319:4722:1"
      }
    ],
    "src": "0:5042:1"
  },
  "compiler": {
    "name": "solc",
    "version": "0.4.24+commit.e67f0147.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "2.0.1",
  "updatedAt": "2019-02-15T10:15:15.354Z"
}