diff --git a/README.md b/README.md index 5331b30..9b59cd9 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,7 @@ Flags: - `--external-builder`: URL of an external builder to use (enables rollup-boost) - `--enable-latest-fork` (int): Enables the latest fork (isthmus) at startup (0) or n blocks after genesis. +- `--predeploy-json` (string[]): One or more paths to JSON files describing L2 predeploy accounts to inject into the L2 genesis (e.g. EntryPoint, paymasters, custom system contracts). ### Example Commands diff --git a/playground/artifacts.go b/playground/artifacts.go index 3e74540..c6c7751 100644 --- a/playground/artifacts.go +++ b/playground/artifacts.go @@ -65,6 +65,10 @@ type ArtifactsBuilder struct { genesisDelay uint64 applyLatestL2Fork *uint64 OpblockTime uint64 + + // JSON files describing additional L2 predeploy accounts to inject into + // the L2 genesis alloc (e.g. EntryPoint, paymasters, or other system contracts). + predeployJSONFiles []string } func NewArtifactsBuilder() *ArtifactsBuilder { @@ -101,6 +105,14 @@ func (b *ArtifactsBuilder) OpBlockTime(blockTimeSeconds uint64) *ArtifactsBuilde return b } +// PredeployJSONFiles configures the builder with one or more JSON files +// that each describe a single L2 predeploy account to inject into the +// L2 genesis alloc. +func (b *ArtifactsBuilder) PredeployJSONFiles(files []string) *ArtifactsBuilder { + b.predeployJSONFiles = files + return b +} + type Artifacts struct { Out *output } @@ -295,6 +307,27 @@ func (b *ArtifactsBuilder) Build() (*Artifacts, error) { } } + // Inject any additional L2 predeploy accounts provided via JSON files. + for _, path := range b.predeployJSONFiles { + data, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("failed to read L2 predeploy JSON %q: %w", path, err) + } + + genesisAllocMap, err := loadPredeployAlloc(data) + if err != nil { + return nil, fmt.Errorf("failed to load L2 predeploy from %q: %w", path, err) + } + + for addr, account := range genesisAllocMap { + if _, exists := allocs[addr.String()]; exists { + return nil, fmt.Errorf("L2 predeploy address %s already exists in allocs, cannot inject duplicate address", addr.String()) + } + + allocs[addr.String()] = account + } + } + newOpGenesis, err := overrideJSON(opGenesis, input) if err != nil { return nil, err @@ -348,6 +381,27 @@ func (b *ArtifactsBuilder) Build() (*Artifacts, error) { return &Artifacts{Out: out}, nil } +// PredeployAlloc is a generic JSON schema for describing a single L2 +// predeploy account to be injected into the L2 genesis alloc. + +// loadPredeployAlloc parses a JSON blob describing a single L2 predeploy +// account and returns the address plus a genesis alloc entry. +func loadPredeployAlloc(raw []byte) (types.GenesisAlloc, error) { + if len(raw) == 0 { + return nil, fmt.Errorf("predeploy JSON is empty") + } + + var genesisAllocMap types.GenesisAlloc + err := genesisAllocMap.UnmarshalJSON(raw) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal predeploy JSON: %w", err) + } + + // Validation helpers (kept local; could also live in utils.go) + + return genesisAllocMap, nil +} + type OpGenesisTmplInput struct { Timestamp uint64 LatestFork *uint64 diff --git a/playground/recipe_opstack.go b/playground/recipe_opstack.go index d0b1a0e..227324e 100644 --- a/playground/recipe_opstack.go +++ b/playground/recipe_opstack.go @@ -36,6 +36,11 @@ type OpRecipe struct { // whether to enable websocket proxy enableWebsocketProxy bool + + // JSON files describing L2 predeploy accounts to inject into L2 genesis + // (e.g. ERC-4337 EntryPoint, paymasters, or other system contracts). + // Each file should define a single account in a simple JSON format. + l2PredeployJSON []string } func (o *OpRecipe) Name() string { @@ -56,6 +61,12 @@ func (o *OpRecipe) Flags() *flag.FlagSet { flags.BoolVar(&o.baseOverlay, "base-overlay", false, "Whether to use base implementation for flashblocks-rpc") flags.StringVar(&o.flashblocksBuilderURL, "flashblocks-builder", "", "External URL of builder flashblocks stream") flags.BoolVar(&o.enableWebsocketProxy, "enable-websocket-proxy", false, "Whether to enable websocket proxy") + flags.StringArrayVar( + &o.l2PredeployJSON, + "predeploy-json", + nil, + "Path(s) to JSON file(s) describing L2 predeploy accounts injected into L2 genesis (e.g. EntryPoint)", + ) return flags } @@ -63,6 +74,9 @@ func (o *OpRecipe) Artifacts() *ArtifactsBuilder { builder := NewArtifactsBuilder() builder.ApplyLatestL2Fork(o.enableLatestFork) builder.OpBlockTime(o.blockTime) + if len(o.l2PredeployJSON) > 0 { + builder.PredeployJSONFiles(o.l2PredeployJSON) + } return builder } diff --git a/playground/utils/entrypoint_v07.json b/playground/utils/entrypoint_v07.json new file mode 100644 index 0000000..ea1743c --- /dev/null +++ b/playground/utils/entrypoint_v07.json @@ -0,0 +1,9 @@ +{ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" : { + "balance": "0x0", + "nonce": "0x1", + "code": "0x6101606040526004361015610024575b3615610019575f80fd5b610022336130d5565b005b5f610140525f3560e01c806242dc531461242b57806301ffc9a7146122d95780630396cb601461207a57806309ccb880146120095780630bd28e3b14611f6d57806313c65a6e14611f32578063154e58dc14611ed75780631b2e01b814611e41578063205c287814611cf257806322cdde4c14611c6e57806335567e1a14611bb45780635287ce1214611a9457806370a0823114611a29578063765e827f1461197c57806384b0196e1461183c578063850aaf62146117775780639b249f6914611613578063b0a398d1146115d3578063b760faf914611599578063bb9fe6bf14611443578063c23a5cea146112635763dbed18e00361000f5734610fd25761012c36612b72565b6101005260e0523332148061125a575b1561122c576101405190815b60e051811061100b575061015b82612f1b565b61012052610140516080526101405160c0525b60e05160c05110610286577fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9726101405161014051a161014051608081905290815b60e05181106101cc576101c58361010051614969565b6101405180f35b61022e6101dc8260e0518561319d565b73ffffffffffffffffffffffffffffffffffffffff6101fd60208301613231565b167f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d6101405161014051a2806131dd565b9061014051915b808310610247575050506001016101af565b90919460019061027461025b888587612fea565b61026a60805161012051613057565b51906080516142c0565b01958160805101608052019190610235565b61029560c05160e0518361319d565b73ffffffffffffffffffffffffffffffffffffffff6102c360206102b984806131dd565b60a0529301613231565b61014051911691905b60a05181106102f05750505060a05160805101608052600160c0510160c05261016e565b610301816080510161012051613057565b5161030f8260a05185612fea565b61014051915a81519273ffffffffffffffffffffffffffffffffffffffff61033682613231565b168452602081810135908501526fffffffffffffffffffffffffffffffff6080808301358281166060880152811c604087015260a083013560c0808801919091528301359182166101008701521c61012085015261039760e0820182613252565b9081610f31575b5050604051936103ad82612dca565b6020850152846040526040810151946effffffffffffffffffffffffffffff8660c08401511760608401511760808401511760a084015117610100840151176101208401511711610ecb5750604081015160608201510160808201510160a08201510160c0820151016101008201510294856040860152845173ffffffffffffffffffffffffffffffffffffffff60e08183511692610460898d61045460408b018b613252565b92909160805101615250565b0151169661014051978015610e9a575b87516040810151905173ffffffffffffffffffffffffffffffffffffffff169061014051506040519a8b8960208d01519260208301937f19822f7c00000000000000000000000000000000000000000000000000000000855260248401926104d79361570f565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018d52610507908d612a49565b61014051908c5190846101405190602095f161014051519a3d602003610e8f575b60405215610d9c575015610d1e575b505073ffffffffffffffffffffffffffffffffffffffff825116602083015190610140515260016020526040610140512077ffffffffffffffffffffffffffffffffffffffffffffffff8260401c165f5260205267ffffffffffffffff60405f20918254926105a584612d26565b90551603610cb5575a840311610c4c5760e0015160609073ffffffffffffffffffffffffffffffffffffffff166108f0575b73ffffffffffffffffffffffffffffffffffffffff949260a08593608093606061060c9801520135905a900301910152614fbc565b929091168603610887576107b3575061063973ffffffffffffffffffffffffffffffffffffffff91614fbc565b9290911661074a5761064e57506001016102cc565b6106e15760a490604051907f220266b600000000000000000000000000000000000000000000000000000000825260805101600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b608490604051907f220266b600000000000000000000000000000000000000000000000000000000825260805101600482015260406024820152602060448201527f41413337207061796d617374657220696e76616c20626c6f636b2072616e67656064820152fd5b608483604051907f220266b600000000000000000000000000000000000000000000000000000000825260805101600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b8260849161082157604051907f220266b600000000000000000000000000000000000000000000000000000000825260805101600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b604051907f220266b600000000000000000000000000000000000000000000000000000000825260805101600482015260406024820152601e60448201527f41413237206f7574736964652076616c696420626c6f636b2072616e676500006064820152fd5b608484604051907f220266b600000000000000000000000000000000000000000000000000000000825260805101600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b9897969594505a9883519961092473ffffffffffffffffffffffffffffffffffffffff60e08d015116604087015190615731565b15610be35760807f52b7512c000000000000000000000000000000000000000000000000000000009798999a9b01516040516109a58161097960208a015160408b015190602084019d8e52896024850161570f565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612a49565b8651608073ffffffffffffffffffffffffffffffffffffffff60e08301511691015161014051918b61014051928551926101405191f1983d908161014051843e519482519a604084019b8c519115610b615760401490811591610b2f575b50610aaa5750601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09101160191826040525a900311610a445750946105d7565b80887f220266b6000000000000000000000000000000000000000000000000000000006084935260805101600482015260406024820152602060448201527f41413336206f76657220706d566572696669636174696f6e4761734c696d69746064820152fd5b8b610b2b610ab66133d4565b6040519384937f65c8fd4d0000000000000000000000000000000000000000000000000000000085526080510160048501526024840152601d60648401527f41413335206d616c666f726d6564207061796d61737465722064617461000000608484015260a0604484015260a4830190612c05565b0390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09150601f011681018214155f610a03565b828e610b2b610b6e6133d4565b6040519384937f65c8fd4d0000000000000000000000000000000000000000000000000000000085526080510160048501526024840152600d60648401527f4141333320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190612c05565b608487604051907f220266b600000000000000000000000000000000000000000000000000000000825260805101600482015260406024820152601e60448201527f41413331207061796d6173746572206465706f73697420746f6f206c6f7700006064820152fd5b608487604051907f220266b600000000000000000000000000000000000000000000000000000000825260805101600482015260406024820152601e60448201527f41413236206f76657220766572696669636174696f6e4761734c696d697400006064820152fd5b608488604051907f220266b600000000000000000000000000000000000000000000000000000000825260805101600482015260406024820152601a60448201527f4141323520696e76616c6964206163636f756e74206e6f6e63650000000000006064820152fd5b610d2791615731565b15610d33578b80610537565b608488604051907f220266b600000000000000000000000000000000000000000000000000000000825260805101600482015260406024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152fd5b8b903b610e0c57608490604051907f220266b600000000000000000000000000000000000000000000000000000000825260805101600482015260406024820152601960448201527f41413230206163636f756e74206e6f74206465706c6f796564000000000000006064820152fd5b610e146133d4565b90610b2b6040519283927f65c8fd4d00000000000000000000000000000000000000000000000000000000845260805101600484015260606024840152600d60648401527f4141323320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190612c05565b610140519150610528565b6101408051849052516020819052604090205490985081811115610ec45750610140515b97610470565b8103610ebe565b80887f220266b6000000000000000000000000000000000000000000000000000000006084935260805101600482015260406024820152601860448201527f41413934206761732076616c756573206f766572666c6f7700000000000000006064820152fd5b60348210610fd95781601411610fd25780359160248110610fd257603411610fd2576024810135608090811c60a0880152601490910135811c90860152606081901c15610f875760601c60e0850152898061039e565b73ffffffffffffffffffffffffffffffffffffffff907fd8ccb29200000000000000000000000000000000000000000000000000000000610140515260601c16600452602461014051fd5b6101405180fd5b507f120aaab5000000000000000000000000000000000000000000000000000000006101405152600452602461014051fd5b6110188160e0518461319d565b9261102384806131dd565b919073ffffffffffffffffffffffffffffffffffffffff61104660208801613231565b1695600187146111fa5786611063575b5050019250600101610148565b806040611071920190613252565b91873b15610fd257916040519283917f2dd8113300000000000000000000000000000000000000000000000000000000835286604484016040600486015252606483019160648860051b8501019281610140517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee182360301915b8b82106111a057505050505081611131917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc858095030160248501526101405195613097565b0381610140518a5af19081611185575b5061117857847f86a9f750000000000000000000000000000000000000000000000000000000006101405152600452602461014051fd5b929350839260015f611056565b6101405161119291612a49565b61014051610fd2575f611141565b9193967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c90879294969703018552863584811215610fd25760206111e9600193858394016132f3565b9801950192018896959493916110eb565b867f86a9f750000000000000000000000000000000000000000000000000000000006101405152600452602461014051fd5b7fab143c06000000000000000000000000000000000000000000000000000000006101405152600461014051fd5b50333b1561013c565b34610fd25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd25761129a612afa565b33610140515261014051602052600160406101405120019081549165ffffffffffff6dffffffffffffffffffffffffffff8460081c16936112eb60ff821663ffffffff8360781c1687801515613148565b60981c16801561140e574281116113d9575080547fffffffffffffff000000000000000000000000000000000000000000000000ff1690556040805173ffffffffffffffffffffffffffffffffffffffff831681526020810184905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2610140518080808573ffffffffffffffffffffffffffffffffffffffff86165af1611395612d60565b90156113a2576101405180f35b610b2b906040519384937f0dcf087c0000000000000000000000000000000000000000000000000000000085523360048601612d8f565b7f561d331200000000000000000000000000000000000000000000000000000000610140515260045242602452604461014051fd5b7ffbd021d600000000000000000000000000000000000000000000000000000000610140515260045242602452604461014051fd5b34610fd257610140517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd257336101405152610140516020526001604061014051200180546114c963ffffffff8260781c16918260ff6dffffffffffffffffffffffffffff8360081c169216916114c3838383811515613148565b82613148565b65ffffffffffff4216019065ffffffffffff82116115665780547fffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff001678ffffffffffff00000000000000000000000000000000000000609884901b1617905560405165ffffffffffff909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a26101405180f35b7f4e487b710000000000000000000000000000000000000000000000000000000061014051526011600452602461014051fd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd2576101c56115ce612afa565b6130d5565b34610fd257610140517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd2576020610140515c604051908152f35b34610fd25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd25760043567ffffffffffffffff8111610fd25760206116676116a2923690600401612b1d565b60405193849283927f570e1a360000000000000000000000000000000000000000000000000000000084528560048501526024840191613097565b03816101405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af180156117695773ffffffffffffffffffffffffffffffffffffffff91610140519161173a575b507f6ca7b80600000000000000000000000000000000000000000000000000000000610140515216600452602461014051fd5b61175c915060203d602011611762575b6117548183612a49565b81019061306b565b82611707565b503d61174a565b6040513d61014051823e3d90fd5b34610fd25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd2576117ae612afa565b60243567ffffffffffffffff8111610fd2576117ce903690600401612b1d565b604051929181908437820190610140518252610140519280610140519303915af46117f7612d60565b90610b2b6040519283927f9941055400000000000000000000000000000000000000000000000000000000845215156004840152604060248401526044830190612c05565b34610fd257610140517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd25761191a6118997f0000000000000000000000000000000000000000000000000000000000000000614cc0565b6118c27f0000000000000000000000000000000000000000000000000000000000000000614e36565b60405190602090611928906118d78385612a49565b6101405184525f3681376040519586957f0f00000000000000000000000000000000000000000000000000000000000000875260e08588015260e0870190612c05565b908582036040870152612c05565b4660608501523060808501526101405160a085015283810360c0850152818084519283815201930191610140515b82811061196557505050500390f35b835185528695509381019392810192600101611956565b34610fd25761198a36612b72565b91909133321480611a20575b1561122c576119a483612f1b565b6119af818585613660565b5061014051927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a161014051915b8583106119f0576101c58585614969565b909193600190611a16611a04878987612fea565b611a0e8886613057565b5190886142c0565b01940191906119df565b50333b15611996565b34610fd25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd25773ffffffffffffffffffffffffffffffffffffffff611a75612afa565b1661014051526101405160205260206040610140512054604051908152f35b34610fd25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd25773ffffffffffffffffffffffffffffffffffffffff611ae0612afa565b604051611aec816129c7565b6101405181526101405160208201526101405160408201526101405160608201526080610140519101521661014051526101405160205260a06040610140512065ffffffffffff604051611b3f816129c7565b63ffffffff60018454948584520154916dffffffffffffffffffffffffffff6020820160ff8516151581526040830190828660081c1682528660806060860195878960781c168752019660981c1686526040519788525115156020880152511660408601525116606084015251166080820152f35b34610fd25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd2576020611bed612afa565b73ffffffffffffffffffffffffffffffffffffffff611c0a612b4b565b91166101405152600182526040610140512077ffffffffffffffffffffffffffffffffffffffffffffffff82165f52825260405f20547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b34610fd25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd25760043567ffffffffffffffff8111610fd2576101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610fd257611cea602091600401612dca565b604051908152f35b34610fd25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd257611d29612afa565b602435903361014051526101405160205260406101405120828154808211611e0d5790611d5591612d53565b90556040805173ffffffffffffffffffffffffffffffffffffffff831681526020810184905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2610140518080808573ffffffffffffffffffffffffffffffffffffffff86165af1611dc9612d60565b9015611dd6576101405180f35b610b2b906040519384937f9f3d69330000000000000000000000000000000000000000000000000000000085523360048601612d8f565b7f25c3f46e000000000000000000000000000000000000000000000000000000006101405152600452602452604461014051fd5b34610fd25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd257611e78612afa565b73ffffffffffffffffffffffffffffffffffffffff611e95612b4b565b91166101405152600160205277ffffffffffffffffffffffffffffffffffffffffffffffff6040610140512091165f52602052602060405f2054604051908152f35b34610fd257610140517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd25760206040517f29a0bca4af4be3421398da00295e58e6d7de38cb492214754cb6a47507dd6f8e8152f35b34610fd257610140517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd2576020611cea613401565b34610fd25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd25760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610fd257336101405152600160205277ffffffffffffffffffffffffffffffffffffffffffffffff6040610140512091165f5260205260405f206120008154612d26565b90556101405180f35b34610fd257610140517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd25760043563ffffffff8116808203610fd257336101405152610140516020526122a16dffffffffffffffffffffffffffff604061014051209361210660018601549163ffffffff8360781c16906120fd8282891515612c62565b81871015612c62565b60081c169261213e6121183486612ca3565b946121268134881515612cdd565b346dffffffffffffffffffffffffffff871115612cdd565b546040519061214c826129c7565b815265ffffffffffff602082019160018352604081016dffffffffffffffffffffffffffff87168152606082019086825260016080840193610140518552336101405152610140516020526040610140512090518155019451151560ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008754169116178555517fffffffffffffffffffffffffffffffffff0000000000000000000000000000ff6effffffffffffffffffffffffffff008087549360081b16169116178455517fffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffff72ffffffff0000000000000000000000000000008086549360781b1616911617835551167fffffffffffffff000000000000ffffffffffffffffffffffffffffffffffffff78ffffffffffff0000000000000000000000000000000000000083549260981b169116179055565b60405191825260208201527fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c0160403392a26101405180f35b34610fd25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610fd2576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610fd257807fd9934b3f0000000000000000000000000000000000000000000000000000000060209214908115612401575b81156123d7575b81156123ad575b8115612383575b506040519015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501482612378565b7f3e84f0210000000000000000000000000000000000000000000000000000000081149150612371565b7fcf28ef97000000000000000000000000000000000000000000000000000000008114915061236a565b7f283f54890000000000000000000000000000000000000000000000000000000081149150612363565b34612884576102007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126128845760043567ffffffffffffffff811161288457366023820112156128845761248c903690602481600401359101612ac4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101c0811261288457610140604051916124c8836129c7565b12612884576040516124d981612a10565b60243573ffffffffffffffffffffffffffffffffffffffff8116810361288457815260443560208201526064356040820152608435606082015260a435608082015260c43560a082015260e43560c08201526101043573ffffffffffffffffffffffffffffffffffffffff811681036128845760e082015261012435610100820152610144356101208201528152602081019161016435835260408201906101843582526101a435606084015260808301916101c43583526101e43567ffffffffffffffff8111612884576125b2903690600401612b1d565b955a9030330361299f578651606081015195603f5a0260061c61271060a084015189010111612977575f96815191826128bd575b5050505050906125fe915a9003855101963691612ac4565b925a93855161010081015161012082015148018082105f146128b55750975b61264a73ffffffffffffffffffffffffffffffffffffffff60e08401511694518203606084015190614a16565b01925f92816127605750505173ffffffffffffffffffffffffffffffffffffffff16945b5a900301019485029051928184105f1461270c57505060038110156126d9576002036126ab5760209281611cea92936126a681614b37565b614a35565b7fdeadaa51000000000000000000000000000000000000000000000000000000006101405152602061014051fd5b7f4e487b710000000000000000000000000000000000000000000000000000000061014051526021600452602461014051fd5b81612742929594969396039073ffffffffffffffffffffffffffffffffffffffff165f525f60205260405f209081540180915590565b5060038410156126d9578261275b926020951590614ab6565b611cea565b909691878251612773575b50505061266e565b90919293505a92600388101561288857600288036127a9575b505060a06127a0925a900391015190614a16565b9088808061276b565b60a083015191803b15612884578b925f9283612805938c8b88604051998a98899788957f7c627b210000000000000000000000000000000000000000000000000000000087526004870152608060248701526084860190612c05565b9202604484015260648301520393f1908161286f575b5061286557610b2b61282b6133d4565b6040519182917fad7954bc000000000000000000000000000000000000000000000000000000008352602060048401526024830190612c05565b60a06127a061278c565b5f61287991612a49565b5f610140528a61281b565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b90509761261d565b915f9291838093602073ffffffffffffffffffffffffffffffffffffffff885116910192f1156128f0575b8080806125e6565b6125fe93929550604051916129036133d4565b90815161291c575b5050506040526001939091886128e8565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a201905191602073ffffffffffffffffffffffffffffffffffffffff85511694015161296c60405192839283612c48565b0390a388808061290b565b7fdeaddead000000000000000000000000000000000000000000000000000000005f5260205ffd5b7f9fbdaa09000000000000000000000000000000000000000000000000000000005f5260045ffd5b60a0810190811067ffffffffffffffff8211176129e357604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610140810190811067ffffffffffffffff8211176129e357604052565b6060810190811067ffffffffffffffff8211176129e357604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176129e357604052565b67ffffffffffffffff81116129e357601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192612ad082612a8a565b91612ade6040519384612a49565b829481845281830111612884578281602093845f960137010152565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361288457565b9181601f840112156128845782359167ffffffffffffffff8311612884576020838186019501011161288457565b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361288457565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126128845760043567ffffffffffffffff81116128845760040182601f820112156128845780359267ffffffffffffffff8411612884576020808301928560051b01011161288457919060243573ffffffffffffffffffffffffffffffffffffffff811681036128845790565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b604090612c5f939281528160208201520190612c05565b90565b15612c6b575050565b9063ffffffff80927fe1823bce000000000000000000000000000000000000000000000000000000005f52166004521660245260445ffd5b91908201809211612cb057565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b15612ce6575050565b6dffffffffffffffffffffffffffff92507f0e10009c000000000000000000000000000000000000000000000000000000005f526004521660245260445ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612cb05760010190565b91908203918211612cb057565b3d15612d8a573d90612d7182612a8a565b91612d7f6040519384612a49565b82523d5f602084013e565b606090565b909273ffffffffffffffffffffffffffffffffffffffff60809381612c5f979616845216602083015260408201528160608201520190612c05565b604290612dd681613542565b612dde613401565b91612de881613231565b918015612ee657905b60c0612e006060830183613252565b90816040519182372091612e20612e1a60e0830183613252565b90614f06565b926040519473ffffffffffffffffffffffffffffffffffffffff60208701977f29a0bca4af4be3421398da00295e58e6d7de38cb492214754cb6a47507dd6f8e895216604087015260208301356060870152608086015260a085015260808101358285015260a081013560e085015201356101008301526101208201526101208152612eae61014082612a49565b519020604051917f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201522090565b50612ef46040820182613252565b90816040519182372090612df1565b67ffffffffffffffff81116129e35760051b60200190565b90612f2582612f03565b612f326040519182612a49565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0612f608294612f03565b01905f5b828110612f7057505050565b602090604051612f7f816129c7565b604051612f8b81612a10565b5f81525f848201525f60408201525f60608201525f60808201525f60a08201525f60c08201525f60e08201525f6101008201525f61012082015281525f838201525f60408201525f60608201525f608082015282828501015201612f64565b919081101561302a5760051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee181360301821215612884570190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805182101561302a5760209160051b010190565b90816020910312612884575173ffffffffffffffffffffffffffffffffffffffff811681036128845790565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093818652868601375f8582860101520116010190565b7f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4602073ffffffffffffffffffffffffffffffffffffffff61313c348573ffffffffffffffffffffffffffffffffffffffff165f525f60205260405f209081540180915590565b936040519485521692a2565b1561315257505050565b906dffffffffffffffffffffffffffff63ffffffff927f8421e8e5000000000000000000000000000000000000000000000000000000005f521660045216602452151560445260645ffd5b919081101561302a5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215612884570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612884570180359067ffffffffffffffff821161288457602001918160051b3603831361288457565b3573ffffffffffffffffffffffffffffffffffffffff811681036128845790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612884570180359067ffffffffffffffff82116128845760200191813603831361288457565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561288457016020813591019167ffffffffffffffff821161288457813603831361288457565b80359173ffffffffffffffffffffffffffffffffffffffff831683036128845773ffffffffffffffffffffffffffffffffffffffff612c5f93168152602082013560208201526133c56133b961338061336561335260408701876132a3565b6101206040880152610120870191613097565b61337260608701876132a3565b908683036060880152613097565b6080850135608085015260a085013560a085015260c085013560c08501526133ab60e08601866132a3565b9085830360e0870152613097565b926101008101906132a3565b91610100818503910152613097565b3d61080081116133f8575b604051906020818301016040528082525f602083013e90565b506108006133df565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016301480613501575b15613469577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a081526134fb60c082612a49565b51902090565b507f00000000000000000000000000000000000000000000000000000000000000004614613440565b90939293848311612884578411612884578101920390565b61354f6040820182613252565b909161355b8284614b87565b156136595761356c61357191613231565b614bdc565b91601482116135ba5750506040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b168252601481526134fb603482612a49565b816014116128845760206134fb916040519384917fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008484019760601b16875260147fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec83019101603484013781015f8382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612a49565b5050505f90565b92919092835f5b8181106136745750505050565b61367e8185613057565b5161368a828486612fea565b5f915a81519273ffffffffffffffffffffffffffffffffffffffff6136ae82613231565b168452602081013560208501526080810135936fffffffffffffffffffffffffffffffff8560801c951694604082019060608301968752815260c0820160a0840135815260c0840135906fffffffffffffffffffffffffffffffff8260801c9216916101208501906101008601938452815261372d60e0870187613252565b9081614203575b505060405161374287612dca565b9960208a019a8b528160405285519586855117825117926effffffffffffffffffffffffffffff60808a01948551179560a08b0196875117895117905117116141a15750519051019051019051019051019051029560408601918783528973ffffffffffffffffffffffffffffffffffffffff60e089516137d78b84835116956137cf60408d018d613252565b929091615250565b015116985f99801561417a575b89516040810151905173ffffffffffffffffffffffffffffffffffffffff1680916040519d8e808d8b519360208301947f19822f7c00000000000000000000000000000000000000000000000000000000865260248401926138459361570f565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810182526138759082612a49565b51905f6020948194f15f519c3d602003614172575b6040521561408757501561400d575b505073ffffffffffffffffffffffffffffffffffffffff8451166020850151905f52600160205260405f2077ffffffffffffffffffffffffffffffffffffffffffffffff8260401c165f5260205267ffffffffffffffff60405f209182549261390184612d26565b90551603613fa8575a860311613f435773ffffffffffffffffffffffffffffffffffffffff60e0606094015116613c34575b505073ffffffffffffffffffffffffffffffffffffffff949260a08593608093606061396a9801520135905a900301910152614fbc565b92909116613bcf57613b03575061399573ffffffffffffffffffffffffffffffffffffffff91614fbc565b92909116613a9e576139aa5750600101613667565b613a395760a490604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b608490604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602060448201527f41413337207061796d617374657220696e76616c20626c6f636b2072616e67656064820152fd5b608483604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b82608491613b6d57604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601e60448201527f41413237206f7574736964652076616c696420626c6f636b2072616e676500006064820152fd5b608484604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b909c9b9a99989796505a9085519d60e08f015173ffffffffffffffffffffffffffffffffffffffff168151613c6891615731565b15613ede57613cbb7f52b7512c00000000000000000000000000000000000000000000000000000000999a9b9c9d9e9f608001519261097960405193849251905190602084019d8e52896024850161570f565b5f8088518b82608073ffffffffffffffffffffffffffffffffffffffff60e08501511693015192865193f1983d90815f843e519482519a604084019b8c519115613e605760401490811591613e2e575b50613db15750601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09101160191826040525a900311613d4f5750948260a0613933565b80887f220266b60000000000000000000000000000000000000000000000000000000060849352600482015260406024820152602060448201527f41413336206f76657220706d566572696669636174696f6e4761734c696d69746064820152fd5b8b610b2b613dbd6133d4565b6040519384937f65c8fd4d00000000000000000000000000000000000000000000000000000000855260048501526024840152601d60648401527f41413335206d616c666f726d6564207061796d61737465722064617461000000608484015260a0604484015260a4830190612c05565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09150601f011681018214155f613d0b565b828e610b2b613e6d6133d4565b6040519384937f65c8fd4d00000000000000000000000000000000000000000000000000000000855260048501526024840152600d60648401527f4141333320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190612c05565b608489604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601e60448201527f41413331207061796d6173746572206465706f73697420746f6f206c6f7700006064820152fd5b608489604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601e60448201527f41413236206f76657220766572696669636174696f6e4761734c696d697400006064820152fd5b60848a604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601a60448201527f4141323520696e76616c6964206163636f756e74206e6f6e63650000000000006064820152fd5b61401691615731565b15614022575f80613899565b60848a604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152fd5b8d903b6140f357608490604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601960448201527f41413230206163636f756e74206e6f74206465706c6f796564000000000000006064820152fd5b6140fb6133d4565b90610b2b6040519283927f65c8fd4d000000000000000000000000000000000000000000000000000000008452600484015260606024840152600d60648401527f4141323320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190612c05565b5f915061388a565b9950815f525f60205260405f20548181115f1461419a57505f5b996137e4565b8103614194565b808f7f220266b60000000000000000000000000000000000000000000000000000000060849352600482015260406024820152601860448201527f41413934206761732076616c756573206f766572666c6f7700000000000000006064820152fd5b60348210614294578160141161288457803560601c916024811061288457601482013590603411612884576fffffffffffffffffffffffffffffffff60248193013560801c1660a089015260801c16608087015280156142695760e08601525f80613734565b7fd8ccb292000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b507f120aaab5000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b9092915a6020820180515f5d60608301519060405196876142e46060830183613252565b5f60038211614961575b7fffffffff00000000000000000000000000000000000000000000000000000000167f8dd7712f00000000000000000000000000000000000000000000000000000000036147f3575050505f6143f96144ed6143876143b960209587516040519384927f8dd7712f000000000000000000000000000000000000000000000000000000008a8501526040602485015260648401906132f3565b906044830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612a49565b6109796040519384927e42dc5300000000000000000000000000000000000000000000000000000000888501526102006024850152610224840190612c05565b6144bc604484018c60806101a091610120815173ffffffffffffffffffffffffffffffffffffffff8151168652602081015160208701526040810151604087015260608101516060870152838101518487015260a081015160a087015260c081015160c087015273ffffffffffffffffffffffffffffffffffffffff60e08201511660e087015261010081015161010087015201516101208501526020810151610140850152604081015161016085015260608101516101808501520151910152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8382030161020484015288612c05565b828151910182305af15f519760405215614509575b5050505050565b909192939495505f3d6020146147e6575b7fdeaddead0000000000000000000000000000000000000000000000000000000081036145a657608486604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152600f60448201527f41413935206f7574206f662067617300000000000000000000000000000000006064820152fd5b7fdeadaa5100000000000000000000000000000000000000000000000000000000919293949550145f1461460e5750506145f26145e7614602925a90612d53565b608084015190612ca3565b6040830151836126a68295614b37565b905b5f80808080614502565b9161467f919260405190518551907ff62676f440ff169a3a9afdbf812e89e7f95975ee8e5c31214ffdef631c5f4792602073ffffffffffffffffffffffffffffffffffffffff8451169301516146626133d4565b9061467260405192839283612c48565b0390a36040525a90612d53565b61468f6080840191825190612ca3565b915f905a92855161010081015161012082015148018082105f146147de5750955b6146dd73ffffffffffffffffffffffffffffffffffffffff60e08401511693518203606084015190614a16565b01925f92806147af5750505173ffffffffffffffffffffffffffffffffffffffff16935b5a900301019283026040850151928184105f14614763575050806147365750908161473092936126a681614b37565b90614604565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526021600452fd5b614798908284939795039073ffffffffffffffffffffffffffffffffffffffff165f525f60205260405f209081540180915590565b50614736575090825f6147aa93614ab6565b614730565b959190516147be575b50614701565b935090506147d75a9360a05f955a900391015190614a16565b905f6147b8565b9050956146b0565b5060205f803e5f5161451a565b614958935061492c91614838917e42dc530000000000000000000000000000000000000000000000000000000060208601526102006024860152610224850191613097565b6148fb604484018960806101a091610120815173ffffffffffffffffffffffffffffffffffffffff8151168652602081015160208701526040810151604087015260608101516060870152838101518487015260a081015160a087015260c081015160c087015273ffffffffffffffffffffffffffffffffffffffff60e08201511660e087015261010081015161010087015201516101208501526020810151610140850152604081015161016085015260608101516101808501520151910152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8382030161020484015285612c05565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101895288612a49565b60205f886144ed565b5081356142ee565b73ffffffffffffffffffffffffffffffffffffffff1680156149eb575f805d5f80808085855af1614998612d60565b90156149a357505050565b610b2b906040519384937f40848e6100000000000000000000000000000000000000000000000000000000855260048501526024840152606060448401526064830190612c05565b7f1a3b45fd000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b90619c408201811115614a2f57606491600a9103020490565b50505f90565b9190917f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f6080602083015192519473ffffffffffffffffffffffffffffffffffffffff86511694602073ffffffffffffffffffffffffffffffffffffffff60e089015116970151916040519283525f602084015260408301526060820152a4565b9060807f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f91602084015193519573ffffffffffffffffffffffffffffffffffffffff87511695602073ffffffffffffffffffffffffffffffffffffffff60e08a015116980151926040519384521515602084015260408301526060820152a4565b60208101519051907f67b4fa9642f42120bf031f3051d1824b0fe25627945b27b8a6a65d5761d5482e60208073ffffffffffffffffffffffffffffffffffffffff855116940151604051908152a3565b90600211614bd757357fffffffffffffffffffffffffffffffffffffffff000000000000000000000000167f77020000000000000000000000000000000000000000000000000000000000001490565b505f90565b60175f80833c5f51907fef010000000000000000000000000000000000000000000000000000000000007fffffff0000000000000000000000000000000000000000000000000000000000831603614c4b575060481c73ffffffffffffffffffffffffffffffffffffffff1690565b8073ffffffffffffffffffffffffffffffffffffffff913b15614c94577f9f4e4cc9000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b7fe5819b95000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b60ff8114614d1f5760ff811690601f8211614cf75760405191614ce4604084612a49565b6020808452838101919036833783525290565b7fb3512b0c000000000000000000000000000000000000000000000000000000005f5260045ffd5b506040515f6002548060011c9160018216918215614e2c575b602084108314614dff578385528492908115614dc25750600114614d63575b612c5f92500382612a49565b5060025f90815290917f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b818310614da6575050906020612c5f92820101614d57565b6020919350806001915483858801015201910190918392614d8e565b60209250612c5f9491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b820101614d57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b92607f1692614d38565b60ff8114614e5a5760ff811690601f8211614cf75760405191614ce4604084612a49565b506040515f6003548060011c9160018216918215614efc575b602084108314614dff578385528492908115614dc25750600114614e9d57612c5f92500382612a49565b5060035f90815290917fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b818310614ee0575050906020612c5f92820101614d57565b6020919350806001915483858801015201910190918392614ec8565b92607f1692614e73565b614f1082826150b8565b80614f215750816040519182372090565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe919203604051927ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff682019084377f22e325a2974396560000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6828501015201902090565b80156150af575f60408051614fd081612a2d565b828152826020820152015273ffffffffffffffffffffffffffffffffffffffff81169065ffffffffffff8160a01c169081156150a1575b60409060d01c91815161501981612a2d565b84815283602082015265ffffffffffff821692839101526580000000000083101580615091575b1561507457657fffffffffff9150164311908115615061575b509060019092565b657fffffffffff9150164311155f615059565b504211908115615086575b50905f9092565b90504211155f61507f565b5065800000000000821015615040565b65ffffffffffff9150615007565b505f905f905f90565b603e8210614a2f577f22e325a2974396560000000000000000000000000000000000000000000000007fffffffffffffffff000000000000000000000000000000000000000000000000615130847ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88101818661352a565b9035828116916008811061523b575b50501603614a2f578161517691817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff681019161352a565b90357fffff00000000000000000000000000000000000000000000000000000000000081169160028110615206575b505060f01c907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2810182116151d8575090565b7f07b9a191000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7fffff0000000000000000000000000000000000000000000000000000000000009250829060020360031b1b16165f806151a5565b839250829060080360031b1b16165f8061513f565b929091925f82615261575050505050565b83519473ffffffffffffffffffffffffffffffffffffffff865116956152878583614b87565b6155b9575060148410615554578360141161555057803560601c93863b61551a576152f39160209160408851015190856040518096819582947f570e1a360000000000000000000000000000000000000000000000000000000084528860048501526024840191613097565b039273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690f191821561550e57916154ef575b5073ffffffffffffffffffffffffffffffffffffffff8116801561548a578503615425573b156153c0575060407fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9173ffffffffffffffffffffffffffffffffffffffff60e06020860151955101511682519182526020820152a35f80808080614502565b608490604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152fd5b608482604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152602060448201527f4141313420696e6974436f6465206d7573742072657475726e2073656e6465726064820152fd5b608483604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601b60448201527f4141313320696e6974436f6465206661696c6564206f72204f4f4700000000006064820152fd5b615508915060203d602011611762576117548183612a49565b5f61533b565b604051903d90823e3d90fd5b50505050906020807fa39bcda08ffd11bafb11c4f170ef24fc6dc1a9d1b0394d90dbd19e0b919050e992015192604051908152a3565b5080fd5b608483604051907f220266b6000000000000000000000000000000000000000000000000000000008252600482015260406024820152601760448201527f4141393920696e6974436f646520746f6f20736d616c6c0000000000000000006064820152fd5b91959493909250601481116155d1575b505050505050565b604073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169201518160141161288457823b156128845761568c935f80946040518097819682957fc09ad0d90000000000000000000000000000000000000000000000000000000084528c60048501526040602485015260147fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec6044860193019101613097565b0393f18015615704576156ef575b507f7c9f9ade6a03a0bba484e52df872467a270e798ffc1adab9dfaa8d0e627f054473ffffffffffffffffffffffffffffffffffffffff60206156dc85614bdc565b93015192169380a45f80808080806155c9565b6156fc9193505f90612a49565b5f915f61569a565b6040513d5f823e3d90fd5b615727604092959493956060835260608301906132f3565b9460208201520152565b73ffffffffffffffffffffffffffffffffffffffff165f525f60205260405f209081548181106136595703905560019056fea2646970667358221220103fb192e0a71c317870b5572e8de9adf2590b83d7b291358c06304b0f96152e64736f6c634300081c0033", + "storage": {} + } +} +