From d751ef79009505936ae1eff3deb764f71574c383 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Wed, 13 Jul 2022 10:49:42 -0400 Subject: [PATCH 01/19] v1.17.0-rc3 --- CHANGELOG.md | 531 +++++++++++++++++++++++++++ build/openrpc/full.json.gz | Bin 28036 -> 28036 bytes build/openrpc/gateway.json.gz | Bin 4893 -> 4893 bytes build/openrpc/miner.json.gz | Bin 13875 -> 13875 bytes build/openrpc/worker.json.gz | Bin 4764 -> 4764 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 9 files changed, 535 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e0e6316c..f11ddd583 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,536 @@ # Lotus changelog + +# v1.17.0-rc3 / 2022-07-13 + +This is the third release candidate of the OPTIONAL release 1.17.0. + +Note that: due to circumstances, we have decided to reset the code freeze to the latest master for this release and restart the testing flow. This also means we are skipping the feature release of June, and have everthing in the July feature release. + +Detailed Changelog will be added later! + +- github.com/filecoin-project/lotus: + - build: merge: release v1.17.0 to master ([filecoin-project/lotus#9017](https://github.com/filecoin-project/lotus/pull/9017)) + - change 1475 bootstrap peer ([filecoin-project/lotus#9008](https://github.com/filecoin-project/lotus/pull/9008)) + - feat: dagstore: Add DestroyShard() in dagstore wrapper ([filecoin-project/lotus#9010](https://github.com/filecoin-project/lotus/pull/9010)) + - build: merge: v1.16.1 to master ([filecoin-project/lotus#9014](https://github.com/filecoin-project/lotus/pull/9014)) + - chore: market: Upgrade to `go-car` `2.4.1` ([filecoin-project/lotus#8985](https://github.com/filecoin-project/lotus/pull/8985)) + - fix: Delegate storage auth on market nodes ([filecoin-project/lotus#8978](https://github.com/filecoin-project/lotus/pull/8978)) + - Docs: readme: use proper hwloc dependency for Fedora ([filecoin-project/lotus#8999](https://github.com/filecoin-project/lotus/pull/8999)) + - chore: stop using the deprecated github.com/libp2p/go-libp2p-yamux (#8998) ([filecoin-project/lotus#8998](https://github.com/filecoin-project/lotus/pull/8998)) + - chore: update and fix libp2p ([filecoin-project/lotus#8996](https://github.com/filecoin-project/lotus/pull/8996)) + - fix incorrect usage of peer.IDFromString (should be peer.Decode) ([filecoin-project/lotus#8993](https://github.com/filecoin-project/lotus/pull/8993)) + - remove mock file + - feat: recovery: Config for maximum partition count per message ([filecoin-project/lotus#8986](https://github.com/filecoin-project/lotus/pull/8986)) + - feat: wdpost: Config for maximum partition count per message ([filecoin-project/lotus#8982](https://github.com/filecoin-project/lotus/pull/8982)) + - deps: update go-fil-markets to v1.23.0 ([filecoin-project/lotus#8976](https://github.com/filecoin-project/lotus/pull/8976)) + - feat: msig cli: Check for existing signers in add-propose ([filecoin-project/lotus#8833](https://github.com/filecoin-project/lotus/pull/8833)) + - feat: shed: migrate-nv16 ([filecoin-project/lotus#8942](https://github.com/filecoin-project/lotus/pull/8942)) + - fix: lotus-stats: actor code string ([filecoin-project/lotus#8977](https://github.com/filecoin-project/lotus/pull/8977)) + - sealer: Config for disabling builtin PoSt / PoSt pre-checks ([filecoin-project/lotus#8959](https://github.com/filecoin-project/lotus/pull/8959)) + - feat: cli: Hide sector nums in 'proving deadline' by default ([filecoin-project/lotus#8952](https://github.com/filecoin-project/lotus/pull/8952)) + - ux: print absolute time for proving period start in proving cli ([filecoin-project/lotus#8954](https://github.com/filecoin-project/lotus/pull/8954)) + - ux: cli: add compute description ([filecoin-project/lotus#8963](https://github.com/filecoin-project/lotus/pull/8963)) + - chore:networking:disconnect cmd ([filecoin-project/lotus#8955](https://github.com/filecoin-project/lotus/pull/8955)) + - go mod tidy + - Update deps + - chore: state: clarify state tree versioning in comment ([filecoin-project/lotus#8947](https://github.com/filecoin-project/lotus/pull/8947)) + - Feat: api: Api call to get actor cids works for versions < 16 ([filecoin-project/lotus#8941](https://github.com/filecoin-project/lotus/pull/8941)) + - chore: market: upgrade index-provider and related dependencies ([filecoin-project/lotus#8945](https://github.com/filecoin-project/lotus/pull/8945)) + - PoC: FVM Debug Dual Execution ([filecoin-project/lotus#8841](https://github.com/filecoin-project/lotus/pull/8841)) + - fix appimage build ([filecoin-project/lotus#8931](https://github.com/filecoin-project/lotus/pull/8931)) + - build: chore: releases back to master ([filecoin-project/lotus#8929](https://github.com/filecoin-project/lotus/pull/8929)) + - fix: readme: Update install instructions link ([filecoin-project/lotus#8460](https://github.com/filecoin-project/lotus/pull/8460)) + - docs: update ./documentation/en/README.md ([filecoin-project/lotus#8887](https://github.com/filecoin-project/lotus/pull/8887)) + - deps: upgrade go-fil-markets to v1.22.0 ([filecoin-project/lotus#8905](https://github.com/filecoin-project/lotus/pull/8905)) + - Fix: cli: Break out of retrieval if provider cancels ([filecoin-project/lotus#8912](https://github.com/filecoin-project/lotus/pull/8912)) + - feat: shed: print out actor code CIDs in manifest cid checker ([filecoin-project/lotus#8911](https://github.com/filecoin-project/lotus/pull/8911)) + - Make cli deal command get Block Delay specific to build ([filecoin-project/lotus#8896](https://github.com/filecoin-project/lotus/pull/8896)) + - fix: fvm: make exectraces match legacyVM some more ([filecoin-project/lotus#8889](https://github.com/filecoin-project/lotus/pull/8889)) + - Add a reentrant multisig test ([filecoin-project/lotus#8816](https://github.com/filecoin-project/lotus/pull/8816)) + - chore: deps: Update to go-state-types v0.1.10 ([filecoin-project/lotus#8883](https://github.com/filecoin-project/lotus/pull/8883)) + - fix: deps: Update butterfly artifacts ([filecoin-project/lotus#8881](https://github.com/filecoin-project/lotus/pull/8881)) + - chore: sealing pipeline: Remove adapter code (storage refactors part 2) ([filecoin-project/lotus#8871](https://github.com/filecoin-project/lotus/pull/8871)) + - build: deps: add uninstall make target ([filecoin-project/lotus#8814](https://github.com/filecoin-project/lotus/pull/8814)) + - fix: ux: Check for client deal addrs on-chain ([filecoin-project/lotus#8830](https://github.com/filecoin-project/lotus/pull/8830)) + - update release template ([filecoin-project/lotus#7715](https://github.com/filecoin-project/lotus/pull/7715)) + - build: bump master version to v1.17.1-dev ([filecoin-project/lotus#8875](https://github.com/filecoin-project/lotus/pull/8875)) + - chore: backport: v1.16.0 bundle to master ([filecoin-project/lotus#8872](https://github.com/filecoin-project/lotus/pull/8872)) + - feat: update go-fil-markets to v1.21.0 ([filecoin-project/lotus#8856](https://github.com/filecoin-project/lotus/pull/8856)) + - chore: storage refactors part 1 ([filecoin-project/lotus#8858](https://github.com/filecoin-project/lotus/pull/8858)) + - feat: shed: report the "user version" ([filecoin-project/lotus#8864](https://github.com/filecoin-project/lotus/pull/8864)) + - chore: fix imports conflict ([filecoin-project/lotus#8863](https://github.com/filecoin-project/lotus/pull/8863)) + - chore: Fix imports ([filecoin-project/lotus#8859](https://github.com/filecoin-project/lotus/pull/8859)) + - chore: backport: release v1.16.0 back to master ([filecoin-project/lotus#8855](https://github.com/filecoin-project/lotus/pull/8855)) + - fix: format error log ([filecoin-project/lotus#8854](https://github.com/filecoin-project/lotus/pull/8854)) + - fix: build: really make macos compatible (#8853) ([filecoin-project/lotus#8853](https://github.com/filecoin-project/lotus/pull/8853)) + - fix: build: fix pack script and add calibrationnet to bundle ([filecoin-project/lotus#8852](https://github.com/filecoin-project/lotus/pull/8852)) + - Add new proofs version type ([filecoin-project/lotus#8848](https://github.com/filecoin-project/lotus/pull/8848)) + - feat: refactor: actor bundling system (#8838) ([filecoin-project/lotus#8838](https://github.com/filecoin-project/lotus/pull/8838)) + - refactor: remove old BlockSyncProtocolID ([filecoin-project/lotus#8820](https://github.com/filecoin-project/lotus/pull/8820)) + - chore: deps: Update to go-address v1.0.0 ([filecoin-project/lotus#8826](https://github.com/filecoin-project/lotus/pull/8826)) + - Revert "deps: update go-libp2p-pubsub to v0.7.0" ([filecoin-project/lotus#8842](https://github.com/filecoin-project/lotus/pull/8842)) + - Feat: migration: Implement function to migrate actors with only code changes ([filecoin-project/lotus#8843](https://github.com/filecoin-project/lotus/pull/8843)) + - feat: Add rate limiting to the lotus gateway ([filecoin-project/lotus#8517](https://github.com/filecoin-project/lotus/pull/8517)) + - gofmt + - fix: build: fix 2k build params ([filecoin-project/lotus#8835](https://github.com/filecoin-project/lotus/pull/8835)) + - Merge nv16 changes into master ([filecoin-project/lotus#8810](https://github.com/filecoin-project/lotus/pull/8810)) + - chore: improve error message when maxPrice is too low ([filecoin-project/lotus#8818](https://github.com/filecoin-project/lotus/pull/8818)) + - Fix: PaychGetRestartAfterAddFundsMsg may stuck in forever waiting ([filecoin-project/lotus#8829](https://github.com/filecoin-project/lotus/pull/8829)) + - fix: paych: Print "waiting for confirmation.." ([filecoin-project/lotus#8823](https://github.com/filecoin-project/lotus/pull/8823)) + - feat: conformance & tvx: support ReportConsensusFault messages ([filecoin-project/lotus#8302](https://github.com/filecoin-project/lotus/pull/8302)) + - fix: build: genesis miner network version ([filecoin-project/lotus#8756](https://github.com/filecoin-project/lotus/pull/8756)) + - deps: update go-libp2p@v0.19.4 ([filecoin-project/lotus#8799](https://github.com/filecoin-project/lotus/pull/8799)) + - feat: lotus-shed get remote peer hello message ([filecoin-project/lotus#8787](https://github.com/filecoin-project/lotus/pull/8787)) + - feat: cli: Nicer net stat ([filecoin-project/lotus#8797](https://github.com/filecoin-project/lotus/pull/8797)) + - fix: bench: consistency in description ([filecoin-project/lotus#8777](https://github.com/filecoin-project/lotus/pull/8777)) + - deps: update go-libp2p-pubsub to v0.7.0 ([filecoin-project/lotus#8770](https://github.com/filecoin-project/lotus/pull/8770)) + - feat: only enable rcmgr by default in full nodes ([filecoin-project/lotus#8769](https://github.com/filecoin-project/lotus/pull/8769)) + - chore: bundle: remove wrongly committed bundle cars ([filecoin-project/lotus#8762](https://github.com/filecoin-project/lotus/pull/8762)) + - Revert "VM: Refactor pricelist to be based on network versions" ([filecoin-project/lotus#8758](https://github.com/filecoin-project/lotus/pull/8758)) + - feat: bench: simple sealing operations commands ([filecoin-project/lotus#8373](https://github.com/filecoin-project/lotus/pull/8373)) + - feat: networking: add healthz and livez endpoints ([filecoin-project/lotus#8692](https://github.com/filecoin-project/lotus/pull/8692)) + - fix: worker: don't log normal storage stat calls ([filecoin-project/lotus#8744](https://github.com/filecoin-project/lotus/pull/8744)) + - fix: worker: don't check params with --no-default when not needed ([filecoin-project/lotus#8741](https://github.com/filecoin-project/lotus/pull/8741)) + - feat: add create ledger wallet address by account index command ([filecoin-project/lotus#8657](https://github.com/filecoin-project/lotus/pull/8657)) + - fix: rpc: readd rpc.discover aliases; lotus-gateway openrpc ([filecoin-project/lotus#8738](https://github.com/filecoin-project/lotus/pull/8738)) + - feat: wdpost: Ignore faults in lotus-miner proving compute window-post ([filecoin-project/lotus#8737](https://github.com/filecoin-project/lotus/pull/8737)) + - fix: post workers: check proving params on startup ([filecoin-project/lotus#8736](https://github.com/filecoin-project/lotus/pull/8736)) + - feat: sched: Per worker concurrent task count limits ([filecoin-project/lotus#8725](https://github.com/filecoin-project/lotus/pull/8725)) + - feat: sched: Finalize* move selectors ([filecoin-project/lotus#8710](https://github.com/filecoin-project/lotus/pull/8710)) + - feat: sched: Add scheduler interfaces, configurable assigner ([filecoin-project/lotus#8700](https://github.com/filecoin-project/lotus/pull/8700)) + - feat: miner cli: sealing data-cid command ([filecoin-project/lotus#8715](https://github.com/filecoin-project/lotus/pull/8715)) + - Snap Deals full unseal ([filecoin-project/lotus#8478](https://github.com/filecoin-project/lotus/pull/8478)) + - deps: libp2p: update to the latest golibp2p tag ([filecoin-project/lotus#8704](https://github.com/filecoin-project/lotus/pull/8704)) + - fix: deps: restore butterfly network genesis from v1.14.4 ([filecoin-project/lotus#8708](https://github.com/filecoin-project/lotus/pull/8708)) + - build: version: bump the version to v1.15.4-rc1 ([filecoin-project/lotus#8646](https://github.com/filecoin-project/lotus/pull/8646)) + - ci: deps: Use testground-github-action from testground org ([filecoin-project/lotus#8490](https://github.com/filecoin-project/lotus/pull/8490)) + - feat: worker: lotus-worker run --no-default ([filecoin-project/lotus#8672](https://github.com/filecoin-project/lotus/pull/8672)) + - docs:sealing:fix default miner config comments ([filecoin-project/lotus#8689](https://github.com/filecoin-project/lotus/pull/8689)) + - fix: verifreg: update deprecation log ([filecoin-project/lotus#8690](https://github.com/filecoin-project/lotus/pull/8690)) + - fix: vm: support raw blocks in chain export ([filecoin-project/lotus#8691](https://github.com/filecoin-project/lotus/pull/8691)) + - feat: precommits info ([filecoin-project/lotus#8696](https://github.com/filecoin-project/lotus/pull/8696)) + - Implement cli command for compactPartitions ([filecoin-project/lotus#8637](https://github.com/filecoin-project/lotus/pull/8637)) + - feat: dagstore: add dagstore register-shard command ([filecoin-project/lotus#8645](https://github.com/filecoin-project/lotus/pull/8645)) + - stores: Deduplicate parallel stat requests ([filecoin-project/lotus#8589](https://github.com/filecoin-project/lotus/pull/8589)) +- github.com/filecoin-project/go-address (v0.0.6 -> v1.0.0): + - add more checks and define constants ([filecoin-project/go-address#31](https://github.com/filecoin-project/go-address/pull/31)) + - enforce that the trailing bits of an address string are standard ([filecoin-project/go-address#28](https://github.com/filecoin-project/go-address/pull/28)) + - sync: update CI config files ([filecoin-project/go-address#29](https://github.com/filecoin-project/go-address/pull/29)) + - chore: fix test on 32bit and non-cgo platforms ([filecoin-project/go-address#30](https://github.com/filecoin-project/go-address/pull/30)) +- github.com/filecoin-project/go-data-transfer (v1.15.1 -> v1.15.2): + - chore(deps): update libp2p v0.19.4 (#341) ([filecoin-project/go-data-transfer#341](https://github.com/filecoin-project/go-data-transfer/pull/341)) + - Fix transfer message bindnode wrap passing pointer to pointer + - Log less important messages at debug level (#334) ([filecoin-project/go-data-transfer#334](https://github.com/filecoin-project/go-data-transfer/pull/334)) + - fix(message): do not EncodeToNode selectors (#326) ([filecoin-project/go-data-transfer#326](https://github.com/filecoin-project/go-data-transfer/pull/326)) + - ci(circle): update to non-legacy image (#328) ([filecoin-project/go-data-transfer#328](https://github.com/filecoin-project/go-data-transfer/pull/328)) + - Merge branch 'release/v1.15.1' +- github.com/filecoin-project/go-fil-markets (v1.20.1-v16-2 -> v1.23.1): + - release: v1.23.1 + - Upgrade to `go-car` `2.4.1` (#733) ([filecoin-project/go-fil-markets#733](https://github.com/filecoin-project/go-fil-markets/pull/733)) + - release: v1.23.0 (#732) ([filecoin-project/go-fil-markets#732](https://github.com/filecoin-project/go-fil-markets/pull/732)) + - feat: update deps (#731) ([filecoin-project/go-fil-markets#731](https://github.com/filecoin-project/go-fil-markets/pull/731)) + - release: v1.22.2 (#729) ([filecoin-project/go-fil-markets#729](https://github.com/filecoin-project/go-fil-markets/pull/729)) + - Upgrade to go-ipfs-blockstore `v1.2.0` (#728) ([filecoin-project/go-fil-markets#728](https://github.com/filecoin-project/go-fil-markets/pull/728)) + - release: v1.22.1 (#727) ([filecoin-project/go-fil-markets#727](https://github.com/filecoin-project/go-fil-markets/pull/727)) + - Upgrade index-provider and related dependencies (#722) ([filecoin-project/go-fil-markets#722](https://github.com/filecoin-project/go-fil-markets/pull/722)) + - release: v1.22.0 (#726) ([filecoin-project/go-fil-markets#726](https://github.com/filecoin-project/go-fil-markets/pull/726)) + - migrate provider deal proposal label to the new format (#721) ([filecoin-project/go-fil-markets#721](https://github.com/filecoin-project/go-fil-markets/pull/721)) + - release: v1.21.0 (#720) ([filecoin-project/go-fil-markets#720](https://github.com/filecoin-project/go-fil-markets/pull/720)) + - Use new go-state-types state accessors (#711) (#719) ([filecoin-project/go-fil-markets#719](https://github.com/filecoin-project/go-fil-markets/pull/719)) + - chore: update go-car dependency (#709) ([filecoin-project/go-fil-markets#709](https://github.com/filecoin-project/go-fil-markets/pull/709)) + - fix:close ask/dealstatus stream (#710) ([filecoin-project/go-fil-markets#710](https://github.com/filecoin-project/go-fil-markets/pull/710)) + - fix: fire storage deal provider ready event after startup completes (#708) ([filecoin-project/go-fil-markets#708](https://github.com/filecoin-project/go-fil-markets/pull/708)) + - release: v1.20.3 (#703) ([filecoin-project/go-fil-markets#703](https://github.com/filecoin-project/go-fil-markets/pull/703)) + - validate deal proposal (#702) ([filecoin-project/go-fil-markets#702](https://github.com/filecoin-project/go-fil-markets/pull/702)) + - FIP 0027 integration (#694) ([filecoin-project/go-fil-markets#694](https://github.com/filecoin-project/go-fil-markets/pull/694)) + - Update index provider library (#698) ([filecoin-project/go-fil-markets#698](https://github.com/filecoin-project/go-fil-markets/pull/698)) + - feat: add offset to ListLocalDealsPage (#695) ([filecoin-project/go-fil-markets#695](https://github.com/filecoin-project/go-fil-markets/pull/695)) + - feat: provider deals pagination (#692) ([filecoin-project/go-fil-markets#692](https://github.com/filecoin-project/go-fil-markets/pull/692)) + - better answer message on ErrNotFound (#690) ([filecoin-project/go-fil-markets#690](https://github.com/filecoin-project/go-fil-markets/pull/690)) + - api to fetch a deal state (#691) ([filecoin-project/go-fil-markets#691](https://github.com/filecoin-project/go-fil-markets/pull/691)) + - release: v1.20.1 ([filecoin-project/go-fil-markets#689](https://github.com/filecoin-project/go-fil-markets/pull/689)) +- github.com/filecoin-project/go-indexer-core (v0.2.8 -> v0.2.16): + - Use sth with bad key recovery (#58) ([filecoin-project/go-indexer-core#58](https://github.com/filecoin-project/go-indexer-core/pull/58)) + - Update storethehash to get index recovery fix + - Update to storethehash with panic fix + - Update storethehash dependency + - update .github/workflows/go-check.yml + - update .github/workflows/go-test.yml + - update .github/workflows/automerge.yml + - Upgrade storethehash + - Sth with file fixer (#53) ([filecoin-project/go-indexer-core#53](https://github.com/filecoin-project/go-indexer-core/pull/53)) + - oops + - Use the new storethehash with index GC + - Update storethehash +- github.com/filecoin-project/go-legs (v0.3.10 -> v0.4.4): + - New version + - Update libp2p dependencies + - Put tests of non-exported functions into internal_test.go + - Compare with error instance instead of err string + - Fix derived protocol ID so there are no double slashes + - Update deps + - Bump version for rate limiter and test changes + - Simplify rate limiter configuration (#130) ([filecoin-project/go-legs#130](https://github.com/filecoin-project/go-legs/pull/130)) + - Bump version in preparation of rolling out http addr fix + - Learn HTTP publisher address from announce message + - Bump version + - Fix equality check during segmented sync + - Bump version in prep for releasing segmented sync feature + - Implement the ability to sync a DAG in segments of configurable depth + - Update version (#125) ([filecoin-project/go-legs#125](https://github.com/filecoin-project/go-legs/pull/125)) + - Fix rate limit burst refresh for graphsync (#124) ([filecoin-project/go-legs#124](https://github.com/filecoin-project/go-legs/pull/124)) + - Retry on rate limit error during HTTP sync + - Option for publisher to allow/reject data transfers (#122) ([filecoin-project/go-legs#122](https://github.com/filecoin-project/go-legs/pull/122)) + - Revert "Fix derived protocol ID so there are no double slashes" + - Fix derived protocol ID so there are no double slashes + - Do not let async goroutines build up (#119) ([filecoin-project/go-legs#119](https://github.com/filecoin-project/go-legs/pull/119)) + - Add ability to get subscriber http peerstore (#116) ([filecoin-project/go-legs#116](https://github.com/filecoin-project/go-legs/pull/116)) + - sync: update CI config files (#114) ([filecoin-project/go-legs#114](https://github.com/filecoin-project/go-legs/pull/114)) + - Better error if we cannot query head for sync (#115) ([filecoin-project/go-legs#115](https://github.com/filecoin-project/go-legs/pull/115)) + - Update version + - Update go-data-transfer and go-graphsync deps + - Fix out of date cborgen and regenerate voucher serialization + - Upgrade to the latest graphsync and datatransfer + - Implement rate limiting for subscribers (#111) ([filecoin-project/go-legs#111](https://github.com/filecoin-project/go-legs/pull/111)) +- github.com/filecoin-project/index-provider (v0.5.0 -> v0.8.1): + - Bump version in preparation for release + - Ignore staticcheck erros in generated cbor-gen + - Upgrade to tagged release of `go-data-transfer` + - Cache links of a root entry instead of resolving them on the fly + - Do not bother restoring cache when purge cache is set + - Upgrade dependencies + - Policy to allow/block indexers from syncing with provider (#230) ([filecoin-project/index-provider#230](https://github.com/filecoin-project/index-provider/pull/230)) + - Bump version to `0.8.0` in preparation for release + - Recover from corrupted cached chunks gracefully + - Smaller default MultihashIterator implementation (#228) ([filecoin-project/index-provider#228](https://github.com/filecoin-project/index-provider/pull/228)) + - Restore TAG in makefile after discussion + - Do not assume build system has bash shell + - Make linksystem less noisy + - add a getter to metadata ([filecoin-project/index-provider#221](https://github.com/filecoin-project/index-provider/pull/221)) + - Upgrade to go-legs `0.3.13` + - Remove nested `cmd` module now that go mod is upgraded to `1.17` + - Bump version to `0.7.0` in preparation for release + - Fix bug where no publisher caused panic when previous root is present + - Bump github.com/ipld/go-codec-dagpb from 1.3.0 to 1.3.1 (#215) ([filecoin-project/index-provider#215](https://github.com/filecoin-project/index-provider/pull/215)) + - Bump github.com/ipfs/go-ipfs from 0.11.0 to 0.12.1 in /cmd + - allow option specifying provider addrinfo ([filecoin-project/index-provider#214](https://github.com/filecoin-project/index-provider/pull/214)) + - sync: update CI config files (#210) ([filecoin-project/index-provider#210](https://github.com/filecoin-project/index-provider/pull/210)) + - Fix encoding of error in logs when instantiating publisher + - Bump version to `0.6.0` + - New announce command to announce latest advertisement + - Add `list car` command and refactor CAR admin server handlers + - Remove dependency to `go-ipfs-blocksutil` used only for testing + - Upgrade index provider to sti with bindnode schema + - Replace IPLD accumulate with IPLD schema file + - Update version and go-logs and storetheindex dependencies + - Remove temporary fixed by depending on head of main in sti + - Support multiple metadata transport protocols + - Fix incomplete sentence in README (#197) ([filecoin-project/index-provider#197](https://github.com/filecoin-project/index-provider/pull/197)) + - Rename `Callback` to a more specific name: `MultihashLister` + - Fix intermittently failing tests that use gossipsub + - Re-implement engine tests and re-enable all tests + - Refactor `config` package to `cmd` since that's where it is used + - Print ad chain stats and retry when syncing ads +- github.com/filecoin-project/specs-actors/v8 (v8.0.0 -> v8.0.1): + - don't panic during migration (#1598) ([filecoin-project/specs-actors#1598](https://github.com/filecoin-project/specs-actors/pull/1598)) +- github.com/filecoin-project/storetheindex (v0.3.5 -> v0.4.17): + - Update version and go-legs with new libp2p + - Add command to import providers from another indexer (#574) ([filecoin-project/storetheindex#574](https://github.com/filecoin-project/storetheindex/pull/574)) + - Update storetheindex/storetheindex in `dev` environment + - Update config with logging and missing settings + - Update config with logging and missing settings + - Update dev config with logging and missing settings + - More config items (#569) ([filecoin-project/storetheindex#569](https://github.com/filecoin-project/storetheindex/pull/569)) + - Deploy latest to `dev` environment (#567) ([filecoin-project/storetheindex#567](https://github.com/filecoin-project/storetheindex/pull/567)) + - Log levels are configurable in config file and reloadable (#564) ([filecoin-project/storetheindex#564](https://github.com/filecoin-project/storetheindex/pull/564)) + - Update storetheindex/storetheindex in `prod` environment + - Bump version to release reframe upgrade + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - update dependency on delegated routing; this change moves Reframe queries from the URL to the HTTP body ([filecoin-project/storetheindex#563](https://github.com/filecoin-project/storetheindex/pull/563)) + - Fix `/reframe` routing through CloudFront in `prod` + - Update storetheindex/storetheindex in `prod` environment + - Only log first bad multihash error to prevent log flooding. + - Create new version tag + - Deploy latest to `dev` environment (#557) ([filecoin-project/storetheindex#557](https://github.com/filecoin-project/storetheindex/pull/557)) + - Ignore invalid multihashes (#555) ([filecoin-project/storetheindex#555](https://github.com/filecoin-project/storetheindex/pull/555)) + - Skip ads with context deleted later in chain (#553) ([filecoin-project/storetheindex#553](https://github.com/filecoin-project/storetheindex/pull/553)) + - Do not create a PR in CD branches if there is no commit + - Add `INDEXER_WATCH_CONFIG` env var back to avoid race condition + - Do not trigger rolling deployment when indexer config changes + - Enable automatic config reload + - Deploy latest to `dev` environment (#548) ([filecoin-project/storetheindex#548](https://github.com/filecoin-project/storetheindex/pull/548)) + - Reload policy and rate limit settings without restarting daemon (#529) ([filecoin-project/storetheindex#529](https://github.com/filecoin-project/storetheindex/pull/529)) + - Assert ongoing announce does not deadlock ingestion (#546) ([filecoin-project/storetheindex#546](https://github.com/filecoin-project/storetheindex/pull/546)) + - Update storetheindex/storetheindex in `prod` environment + - Bump version to release CPU contention fix and corrupt key skip + - Update storetheindex/storetheindex in `dev` environment + - Use sth with bad key recovery (#543) ([filecoin-project/storetheindex#543](https://github.com/filecoin-project/storetheindex/pull/543)) + - Update storetheindex/storetheindex in `dev` environment + - Defer handling of announce until ad chain processing is finished + - Increase CPU resources in `prod` to `3.5` + - Increase CPU limit in `dev` to `3.5` + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Move changes in prod config from #528 to combine deployment + - Update storetheindex/storetheindex in `prod` environment + - update dep on delgated routing to v0.2.1 (#538) ([filecoin-project/storetheindex#538](https://github.com/filecoin-project/storetheindex/pull/538)) + - add metrics to reframe endpoint (#536) ([filecoin-project/storetheindex#536](https://github.com/filecoin-project/storetheindex/pull/536)) + - Move changes in dev config from #528 to combine deployment + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Update version and deps (#533) ([filecoin-project/storetheindex#533](https://github.com/filecoin-project/storetheindex/pull/533)) + - Ignore multihash entries that are too short (#530) ([filecoin-project/storetheindex#530](https://github.com/filecoin-project/storetheindex/pull/530)) + - Deploy latest to `dev` environment (#527) ([filecoin-project/storetheindex#527](https://github.com/filecoin-project/storetheindex/pull/527)) + - Upgrade go-legs to fix HTTP publisher address issue + - Use `http.Client` instead of `cleanhttp` in `retryablehttp` + - Re-allow all peers on `prod` and separate the config from `base` + - Update storetheindex/storetheindex in `prod` environment + - Update storetheindex/storetheindex in `dev` environment + - Allow other randomly selected peer IDs in `dev` + - Update storetheindex/storetheindex in `dev` environment + - Bump version in preparation to release segmented sync + - Reduce verbose logging of HTTP sync requests + - Deploy latest to `dev` environment (#509) ([filecoin-project/storetheindex#509](https://github.com/filecoin-project/storetheindex/pull/509)) + - Fix bug where tail of chain is synced twice + - Retry HTTP sync requests + - Use concrete `go-legs` version with segmented sync + - Deploy latest to `dev` environment (#499) ([filecoin-project/storetheindex#499](https://github.com/filecoin-project/storetheindex/pull/499)) + - Sync ads and entries in configurable segments + - Update config document for version 2 + - Improve test stability by asserting multihashes are eventually indexed + - Remove overriding std in/err in E2E test + - Fix intermittent test failures + - Update storetheindex/storetheindex in `prod` environment + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Create new version tag + - Add memory optimized `r5a.2xlarge` workers to `dev` + - Configure rate limit (#488) ([filecoin-project/storetheindex#488](https://github.com/filecoin-project/storetheindex/pull/488)) + - Cleanup policy evaluation (#479) ([filecoin-project/storetheindex#479](https://github.com/filecoin-project/storetheindex/pull/479)) + - Add logging around announce messages (#481) ([filecoin-project/storetheindex#481](https://github.com/filecoin-project/storetheindex/pull/481)) + - Fix invalid json in dev config + - Only whitelist ingestion from a specific provider in `dev` for testing + - Use larger instance types and override config in dev to limit providers + - Upgrade indexer config base layer (#441) ([filecoin-project/storetheindex#441](https://github.com/filecoin-project/storetheindex/pull/441)) + - Define dedicated KMS keys used to encrypt autoretrieve secrets + - Allow `put` via cloudfront sitting in front of `cid.contact` + - Add a Reframe API server at HTTP `/reframe`. ([filecoin-project/storetheindex#464](https://github.com/filecoin-project/storetheindex/pull/464)) + - Allow GitHub Actions from ARG autoretrieve repo to publish to ECR + - GitOps deployment of dev-v2 cluster (#449) ([filecoin-project/storetheindex#449](https://github.com/filecoin-project/storetheindex/pull/449)) + - Onboard `autoretrieve` as a temporary tenant of sti `dev` cluster + - Stop deployment to `fil-dev` and `fil-prod` via CircleCI + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - update doc with current codes + - Add encrypted credentials to access GitHub for `index-observer` + - Add `index-observer` to dev cluster manifests + - Configure flux cd for `index-observer` on `dev` cluster + - Define `index-observer` ECR repo and CI to build and push images + - use default cidlink length (#450) ([filecoin-project/storetheindex#450](https://github.com/filecoin-project/storetheindex/pull/450)) + - Point `cid.contact` to `prod` CloudFront distribution + - Disable autoscaler in prod to investigate the selection policy + - Configure Promtail to forward host and container logs to PL loki + - Increase memory and CPU for indexer on `prod` + - Fix version written by init (#435) ([filecoin-project/storetheindex#435](https://github.com/filecoin-project/storetheindex/pull/435)) + - Update link to config documentation + - Create config file description + - Update README.md (#434) ([filecoin-project/storetheindex#434](https://github.com/filecoin-project/storetheindex/pull/434)) + - Log and config update (#429) ([filecoin-project/storetheindex#429](https://github.com/filecoin-project/storetheindex/pull/429)) + - Update storetheindex/storetheindex in `dev` environment + - Fix regex replacement in automated PR creation template + - Configure image update automation for `prod` + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Scale up `dev` to 2 instances + - Point infra.cid.contact to `prod` running in sti AWS account + - Update kustomization.yaml + - Deploy the latest release to `prod` environment + - Announce handling (#418) ([filecoin-project/storetheindex#418](https://github.com/filecoin-project/storetheindex/pull/418)) + - Update storethehash to get index recovery fix + - Deploy latest to `dev` environment (#400) ([filecoin-project/storetheindex#400](https://github.com/filecoin-project/storetheindex/pull/400)) + - If no value for "indexer" CLI flag, then read from config (#407) ([filecoin-project/storetheindex#407](https://github.com/filecoin-project/storetheindex/pull/407)) + - Configure resources for `dev` amd `prod` + - Write `prod` metrics to a dedicated AWS managed prometheus + - Create pl-grafana IAM user to integrate with PL Grafana + - Spread indexer instances across AZs when possible + - Publish containers to ECR repo when a release is created + - Define base promtail kustomization used for log forwarding + - Send metrics to AWS managed prometheus via private link + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Update to core with storehash panic filx (#387) ([filecoin-project/storetheindex#387](https://github.com/filecoin-project/storetheindex/pull/387)) + - Use new flag names in commands + - Set up remote write for dev metrics to aws managed prometheus + - Upgrade monitoring manifests now that K8S clusters are on 1.22 + - Upgrade dev cluster to 1.22 + - Reduce iops per GiB for storage classes to unblock deployment + - Update storetheindex/storetheindex in `dev` environment + - Quote glob format to select tags + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Skip dev CD job if PR it should create exists already + - Don't override image in prod until auto deploy is set up + - Update version + - Use `io2` storage class for `prod` instances + - support a list of peers from which we accept advertisements for other providers (#344) ([filecoin-project/storetheindex#344](https://github.com/filecoin-project/storetheindex/pull/344)) + - Add AWS EBS CSI to dev cluster manifests + - Use io2 storage class for indexer pods in `dev` + - Update storetheindex/storetheindex in `dev` environment + - Fix ECR build still running on sti bot pushes to `deploy` directory + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Remove skip message from image update automation + - Specify pod disruption budget for storetheindex + - Add readiness probe to base storetheindex K8S manifests + - Fix wrong publisher address when using HTTP (#357) ([filecoin-project/storetheindex#357](https://github.com/filecoin-project/storetheindex/pull/357)) + - Update storetheindex/storetheindex in `dev` environment + - Update storetheindex/storetheindex in `dev` environment + - Do not publish to ECR if pusher is `sti-bot` + - Update storetheindex/storetheindex in `dev` environment + - Configure automated image deployment for `dev` environment + - Configure private ECR repo for storetheindex in `common` infra + - Revert "Remove redundant private ECR repo" + - Remove redundant private ECR repo + - Create GitHub Actions credentials and set container publish to ECR + - Bump github.com/ipfs/go-ipfs from 0.11.0 to 0.12.1 + - Configure EBS CSI controller to run on all nodes + - Define production infrastructure in `us-east-2` + - Add README on how to interact with `sops` encrypted secrets + - Define prod kustomization overlay + - Upgrade storethehash + - Use storethehash with corrupted file fixer (#339) ([filecoin-project/storetheindex#339](https://github.com/filecoin-project/storetheindex/pull/339)) + - Use storethehash that has index GC + - Bump chart version to include templated readiness probe + - Add `io2` storage class to dev cluster + - Restructure identity settings to allow per instance key + - Specify remote build for `monitoring` in HTTP but different format + - Update version.json (#333) ([filecoin-project/storetheindex#333](https://github.com/filecoin-project/storetheindex/pull/333)) + - Update version.json (#332) ([filecoin-project/storetheindex#332](https://github.com/filecoin-project/storetheindex/pull/332)) + - Fix `MalformedYAMLError` when kustomization uses HTTPS to clone repo + - Set up K8S monitoring + - Allow Kyle to interact with dev KMS + - sync: update CI config files (#317) ([filecoin-project/storetheindex#317](https://github.com/filecoin-project/storetheindex/pull/317)) + - Fix out of bounds panic in registery + - Add `cluster-autoscaler` to list of cluster level kustomizations + - Set up cluster-autoscaler on `dev` + - Cache 404s in cloudfront (#314) ([filecoin-project/storetheindex#314](https://github.com/filecoin-project/storetheindex/pull/314)) + - Added users cmharden and steveFraser to kms.tf and aws-auth.yaml (#313) ([filecoin-project/storetheindex#313](https://github.com/filecoin-project/storetheindex/pull/313)) + - Set up caching layer for dev endpoint using CloudFront + - Give Kyle access to `dev` cluster + - Update version + - Fix pprof handlers + - Update dependencies + - Add comments and tests for ad signature + - Set up `dev.cid.contact` with all things manged by K8S + - Store publisher address with publisher ID (#298) ([filecoin-project/storetheindex#298](https://github.com/filecoin-project/storetheindex/pull/298)) + - Define base kustomization and dev overlay for storetheindex + - Define KMS key to encrypt secrets used by storetheindex + - Allow the ability to configure private key via file + - Install `nginx` ingress controller on dev K8S cluster + - Replace target CD branch to `main` + - Define base and dev overlay K8S manifests + - Define terraform infrastructure for dev EKS cluster + - Fix `.gitignore` to not ignore all directories named `storetheindex` + - Add PR Template (#292) ([filecoin-project/storetheindex#292](https://github.com/filecoin-project/storetheindex/pull/292)) + - Fix find latency metric (#284) ([filecoin-project/storetheindex#284](https://github.com/filecoin-project/storetheindex/pull/284)) + - About doc (#283) ([filecoin-project/storetheindex#283](https://github.com/filecoin-project/storetheindex/pull/283)) + - Bump version to `0.4.0` after bindnode merge (#281) ([filecoin-project/storetheindex#281](https://github.com/filecoin-project/storetheindex/pull/281)) + - More efficient batch processing of multihashes (#282) ([filecoin-project/storetheindex#282](https://github.com/filecoin-project/storetheindex/pull/282)) + - Fix goroutine leak in go-statemachine (#280) ([filecoin-project/storetheindex#280](https://github.com/filecoin-project/storetheindex/pull/280)) + - Use IPLD bindnode and reduce boilerplate code in ingest schema + - Update version and go-legs + - Build docker image using go1.18 + - Fix a goroutine leak in go-libp2p-swarm + - Limit number of open connection to the http server (#273) ([filecoin-project/storetheindex#273](https://github.com/filecoin-project/storetheindex/pull/273)) + - Remove recursion depth limits for sync (#270) ([filecoin-project/storetheindex#270](https://github.com/filecoin-project/storetheindex/pull/270)) + - Fair share ingest workers (#259) ([filecoin-project/storetheindex#259](https://github.com/filecoin-project/storetheindex/pull/259)) + - Drop support for Go 1.16 (#267) ([filecoin-project/storetheindex#267](https://github.com/filecoin-project/storetheindex/pull/267)) + - Set the maximum acceptable length for advertisement metadata + - Revert "Skip e2e tests until provider side is upgraded." + - Add indexer ecosystem diagram and source ([filecoin-project/storetheindex#264](https://github.com/filecoin-project/storetheindex/pull/264)) + - Skip e2e tests until provider side is upgraded. + - Replace `v0.Metadata` with `[]byte` + - Don't optimistically delete an Ad (#258) ([filecoin-project/storetheindex#258](https://github.com/filecoin-project/storetheindex/pull/258)) + - Use go1.17 for docker build + - Set latestsynchandler on go legs (#256) ([filecoin-project/storetheindex#256](https://github.com/filecoin-project/storetheindex/pull/256)) + - Update to latest legs and update version + - don't be as aggressive about using :3000 / :3001 on client request (#254) ([filecoin-project/storetheindex#254](https://github.com/filecoin-project/storetheindex/pull/254)) + - Create creating-an-index-provider.md (#253) ([filecoin-project/storetheindex#253](https://github.com/filecoin-project/storetheindex/pull/253)) + - add cors headers to find interface (#252) ([filecoin-project/storetheindex#252](https://github.com/filecoin-project/storetheindex/pull/252)) + - Update dependencies and version + - Reduce log volume and log progress (#246) ([filecoin-project/storetheindex#246](https://github.com/filecoin-project/storetheindex/pull/246)) + - Indexer auto-syncs after period of no contact with publisher (#247) ([filecoin-project/storetheindex#247](https://github.com/filecoin-project/storetheindex/pull/247)) + - Only increase error metric on error + - Remove readBeforeErr hack now that cbor-gen bug is fixed + +Contributors + +| Contributor | Commits | Lines ± | Files Changed | +|-------------|---------|---------|---------------| +| Masih H. Derkani | 153 | +15515/-16832 | 660 | +| Łukasz Magiera | 92 | +10429/-8024 | 1580 | +| Andrew Gillis | 43 | +4149/-1765 | 208 | +| Jennifer Wang | 10 | +1441/-1138 | 34 | +| Geoff Stuart | 18 | +1348/-859 | 113 | +| dirkmc | 11 | +1827/-210 | 70 | +| Aayush | 21 | +1134/-894 | 69 | +| Steven Allen | 9 | +743/-889 | 66 | +| Marco Munizaga | 15 | +990/-252 | 36 | +| gammazero | 47 | +681/-411 | 104 | +| Will | 4 | +514/-246 | 29 | +| web3-bot | 15 | +409/-348 | 20 | +| Steven Fraser | 1 | +671/-0 | 36 | +| Cory Schwartz | 27 | +520/-89 | 36 | +| Hannah Howard | 3 | +318/-105 | 8 | +| Piotr Galar | 2 | +337/-59 | 7 | +| swift-mx | 14 | +264/-131 | 17 | +| vyzo | 7 | +357/-15 | 16 | +| Petar Maymounkov | 6 | +221/-23 | 14 | +| LexLuthr | 7 | +182/-21 | 14 | +| Aayush Rajasekaran | 5 | +97/-70 | 33 | +| Raúl Kripalani | 5 | +87/-45 | 7 | +| unknown | 1 | +114/-0 | 8 | +| sti-bot | 44 | +54/-60 | 44 | +| Aarsh Shah | 2 | +61/-50 | 8 | +| Lucas Molas | 1 | +74/-27 | 3 | +| zenground0 | 8 | +80/-18 | 14 | +| Dirk McCormick | 3 | +52/-33 | 8 | +| frank | 3 | +73/-7 | 3 | +| Will Scott | 4 | +45/-11 | 5 | +| kaola526 | 5 | +44/-11 | 5 | +| dependabot[bot] | 3 | +16/-10 | 8 | +| zl | 1 | +15/-4 | 4 | +| Phi | 5 | +12/-6 | 6 | +| Marcin Rataj | 1 | +11/-7 | 1 | +| github-actions[bot] | 7 | +8/-8 | 7 | +| Anton Evangelatov | 2 | +13/-0 | 4 | +| Nicolas Gimenez | 1 | +12/-0 | 1 | +| Marten Seemann | 2 | +5/-7 | 5 | +| Chris Harden | 1 | +10/-0 | 2 | +| jennijuju | 1 | +4/-4 | 7 | +| Travis Person | 2 | +2/-6 | 2 | +| Rod Vagg | 1 | +3/-3 | 2 | +| Rob Quist | 1 | +3/-3 | 1 | +| Jiaying Wang | 1 | +2/-3 | 2 | +| zengroundumbass | 1 | +3/-1 | 1 | +| lifei | 1 | +1/-1 | 1 | +| Mike | 1 | +2/-0 | 1 | +| Hubert | 1 | +1/-1 | 1 | +| Daniel N | 1 | +1/-1 | 1 | +| BMZ | 1 | +1/-1 | 1 | + + # 1.16.1 / 2022-07-07 This is an OPTIONAL PATCH releases for storage providers who have failed to publish `SubmitWindowedPoSt` due to out of gas error. The error log looks like `/wdpost_run.go:xxx estimating gas {"error": "estimating gas used: message execution failed: exit SysErrOutOfGas(7)...`. diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 8ff1c06f49e820c252d2fdfa2b178936125e60b0..8a085654877db1949c2ac3e7bd7378ae12dcc71e 100644 GIT binary patch delta 26 icmZp<&De6AaY7eMja=p8jeYNOIJ{4+Fs&+OWdH!6919u% delta 26 icmZp<&De6AaY7eM)w{*7H}<{D;gDQzCSO&`$^ZbZ&kKJ5 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index e91b9161da5aaeccd7ee95dbdb60ff35af281b73..3c523b7e1d23cf55fb0ed576e0de43c1c06948b7 100644 GIT binary patch delta 4811 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 delta 4811 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index e0537ab248e8a01c6dd88cfa8ba43df6b26bc609..a52ea990c9be4efcd3279e63df26b0f1b61aa772 100644 GIT binary patch delta 25 hcmdm-vpHu%D{Ec-d1LpDT?^@!reC005go3l#tW delta 25 hcmdm-vpHu%E9<|6^G@X(yB3;q1V!dg@!reC005!R3lIPR diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 4a724cbe9ccc7a271d529efa3654984da858be2a..1e9afa59d1896e01226ee7b4b6f5ab300235e1d3 100644 GIT binary patch delta 4676 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 Date: Fri, 15 Jul 2022 15:07:53 -0400 Subject: [PATCH 02/19] fix: deps: update FFI to fix a slow memory leak --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 98eeb1eb8..32afd6e1f 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 98eeb1eb8e45967c8ac8108a466819cc072f0292 +Subproject commit 32afd6e1f1419b6bb7d0f4b3944287fde593ca64 From a72f3dc29e6595e28a2e41cca529249d766bcc55 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 15 Jul 2022 10:27:03 -0700 Subject: [PATCH 03/19] Workaround for sealing bug --- storage/pipeline/checks.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/storage/pipeline/checks.go b/storage/pipeline/checks.go index 2e52fb505..757714f1e 100644 --- a/storage/pipeline/checks.go +++ b/storage/pipeline/checks.go @@ -3,6 +3,7 @@ package sealing import ( "bytes" "context" + "time" "golang.org/x/xerrors" @@ -122,6 +123,8 @@ func checkPrecommit(ctx context.Context, maddr address.Address, si SectorInfo, t if err != nil { return xerrors.Errorf("checking if sector is allocated: %w", err) } + // TODO This is a very bad hack!! We are only using this while we investigate the compiler issue here. + time.Sleep(time.Nanosecond) if alloc { //committed P2 message but commit C2 message too late, pci should be null in this case return &ErrSectorNumberAllocated{xerrors.Errorf("sector %d is allocated, but PreCommit info wasn't found on chain", si.SectorNumber)} @@ -151,6 +154,8 @@ func (m *Sealing) checkCommit(ctx context.Context, si SectorInfo, proof []byte, if err != nil { return xerrors.Errorf("checking if sector is allocated: %w", err) } + // TODO This is a very bad hack!! We are only using this while we investigate the compiler issue here. + time.Sleep(time.Nanosecond) if alloc { // not much more we can check here, basically try to wait for commit, // and hope that this will work From 05bb68f07d40adf8885670d7f9a6a36f4643cb94 Mon Sep 17 00:00:00 2001 From: Phi Date: Fri, 22 Jul 2022 13:09:21 +0200 Subject: [PATCH 04/19] bump version to v1.17.0-rc4 bump version to v1.17.0-rc4 --- build/openrpc/full.json.gz | Bin 28036 -> 28036 bytes build/openrpc/gateway.json.gz | Bin 4893 -> 4893 bytes build/openrpc/miner.json.gz | Bin 13875 -> 13875 bytes build/openrpc/worker.json.gz | Bin 4764 -> 4764 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 8 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 8a085654877db1949c2ac3e7bd7378ae12dcc71e..b07d5b7a32e11a78873e52727b155b948d3e1577 100644 GIT binary patch literal 28036 zcmb4~Lv$rTx3**3w(XpBl8$ZLPRF)w`^2`>aniAE+jcs*{eAZi{^?(n+BK;`)ml}1 zzx#QKqhUb)JH9Wwt(-T0Hwt{HDSGM4CMol^9swe&LmGY1F36>vPBxsZb5 z7bQ;kqWHfsRGaT8HX(>83AXNIMV@X{ZcUK}m}4X|WP6SOC~*W5y+8ZHC}PZ=(!RP$ zG4bSrv^p|uqv5C~LVrCm3p(UW8{EU(0myc7g}6Dd1PFt;l^zrC9{>negNe-6e%Rk- z^xW>R6q`O?QauJq0^c9bEClr)Kf~vY>$%Ixx(pDXtX1K9?=dYyji`~t z+XzzymV{e>JaI@`>~>f2FKun(d;Bp69aweBP!W{|8))uq>+fVg1Ri~**bpY$_@d?< z`mhV~)8f8`iHLo^bNSwq_}<_35Uy`U$!zo|>)H*sFb%Pn!ZmW9;o*HY)XRSkUv8vas?Wxx8 z$_1h4HH%J7DHYbMjACHI7?D%`AQZc>rtteyWYU(Cxk0!=pn0GQiy$eZatD!Ier5#s zA5dr_a;K07p$z!w#A5wm$+UgOgfpmnPUv>kU3))=g%saI-i=!Qla}NLqyKidO4Q*m zKcm8-NaPLsyXq`iJw-k7LF{4O*7rI_e472@wJl3mvsI=nx71wF8tM6n1{L;&Amb21 zCDU&uD|^L5b@1?6v<5A0BC<=R(o~S+M^?xW%2D{!-w+Qof*w<-tP{Qpov7)HfI1BV zfdH9&QaP!4Nv6;S>MI}|LrT2c+=A#Z32H8AW6o&^^QGuu3PS=Y{(0Y*oQ?Zz4uVb` zjmh+$F#+zQ_WE=B-L4WYt6OQB#6oOc^0@t)Dwx5ML%@6YdiaPr0PGDBV!DZlM z?b;YZqSJ@ZSi_R&OU(Wo=>QTK?jL)C-kcHRM&*IQ>~?^2Wn*xI5F#qmT8S2)mc8T{ zmRwVVosF2YN4TG~;%}%LeLBq3)L=zBfjnq zhNZ#>qZz^1P%zF{1YC5IJs@I@y}xIiayCQ7-~0ka$3T3BN}j5@nwvHR{O;SvOzQr2 ze17IAbYWY?|Hy{O{^k+L@I34_KkfZ~VlLq9flZ+HS~2TE{AuDOY4Qi!yDof!j+o?B z=|1ch=9loarR+!l_VlxZ0|ZZX^@}Ub51x_}-L}u8jlS0>Ye0fOA;WLW=8ixWoXC>Z zlW=u8KXH#A2f^L_$A$opI)58mJ6k(S%4tX@{vy?BJ7QmIM1R4Ue%c=*M1M#vJ~`{~ zuN#JflOI0MID}P36D^;F?UG94nbHmkSdmT&w27P&^A0L(pV~OkhF}o}xl-iHt#|_v zy2T{@*zO3cQdJmb26DJ`2*jf+qvq{{dF~rNOk!YTukEy)8KmW;>qcQ;MpW0#$mnlC;JUTh<5Cp;l+uc@i8|DzDw37~y3{Pqq)pIl$S8f}fAewgG_OmG!= z5J`hV3PN6-A&*00ZlZ(_7AF$+iemT$4-VQR9H`hqnqJ18PH}Yy1r3TrzB^(>vX;T@ zvBQke7odcqJbVif3_?}sKn6gvd&DwD##7Hzj5amMlKs#a2ylkLA^RBxa=1n=92w5l zcY;e6)r^ZEBD#8;q=-g?-wz?dV2jR|=u7YX2l1F4Wfp%Bu$u(`Qx5t-=}&z;*&Qn6 z(J7W^gJzl&lz?8>8aVb%{7ip1H};JHVc^3{o}T~@Sl-Xv4}5|y(B8aW9x!_WV4%A_ z6H}Z(4><95PTozgw=+_lK#;G4-}~|H>(w180PyDWnr(S^ivId~CcHSo>3t{FY`FZB z@9pz+D$)9Q|Ml@>YKZa;Sl~i`Xv&TcMrn9h{%8euYl%V1oQ+0IX&{d@v!+B;PFRw; zlBU10s(=KR7P!K^1LaR)aVb32m0xOhWGi}dd=qbcQ5odlM-%F&ryf<<%E3t548RE`2K8u*gxcWGB zwPgGH5@NF>+vV?eva->{)4k7a^8F0AeO=%0&f0P^3SZ}Ruq;5q=Jl$=LLg}-c?ZQy zFFIqei}IJ>uCa9)*?G<#JlC4Cc}X*-WwxMFUxiC>Mc35UTY9-jPQVLX)5yNNwKI#! z@^9iP|5}IkACPy}$MTY|QP)MVk*n4-1gfjn%8kk@`=uO=uD{}|BNo0MoYt*ByF?&Z zH@B|yFEl!x&qc=I33A~Xz1kCn+Lo(4NsH>&$`c-KbK4c3*h|XmuCddy6FS&8A8TUY z3rxu)g9V8rihI!>{vIpayyRnjTmX+D^CJ3c;q_PAo_XeuY}I?2)-TRyM)mB}W!~da z9w~>V{ILm_*s|C6?v$*HIwnX64Xc&V__JZk8w7sAeqTVcEWM54=f$I|PrAl=vH1`vyzx1Q7EDo0Ehm)XzZ zpv}*_WQn9a9Vz1TFt)GcJg`ewr12gp?!zd12;){`Bup(_o}7L}Nrim)>&x4XO+VIQ z7bOZ5@{)gXuOYQLdU*3j*LJUQ;`w}cU?J#HYAir1XNf(;E`7juEw)kbk~iE;AlEY5 z7-(y8Jr=jQ7@wP_>oinR{f%fyK%6bNp?J}Gwz=Y(AR-n2F@b+qEk9hYK!P!Fz;Y`v zcGiN*R5+!tCM;*#y?YvYalvUZQ0=1S!00JjXD!XOW=2T)GCjXOPb~4t@g;Np$Bj;? zOs=lOYcSout<8YT{%_ZUqy#duwliebQDcRBDS#0Riq3(Q4Y|aFJh^w4;MY_up%@f^UO(7_} zgQnC#T3{qXOcFFYo*7t!Fq(c6oxPa@tB4lQ1jDNor9tCJ z2Vc5VN&0Q+Nt*$+h)l|fY~iSj>)iex?ZM>(OC?#7wr@?P&^13Bv z1#*Opt6c81nr6q=FKDa}GX`-WrY1rV@=6NDZh0$2#7^?F!{y!j`P!wLj0`FeF z7V7*v1|m3##ZA4rHr>sJ++=pHEo_xJgW#xb#9%r4Z*39x^Rp zDtZm|;dp7Fah1LNPX4tRdCpz5mXHh12(Eu9HpOh zSnFoIe-@8;EO77SELX{jErK640s?PK$!L7(flEB`?~{uOu8xZrVEFlEEro-^*$Ex3 zpW!h-IkUSfwe!nxXSja-_By4|mEEpMND?GSDS)uft!w@6{O?ee0k>Y353<&Y;&J8m z{lPqINxyPj6<(EjlQq)@+j>eDWmd>hyuvu9~5wxXe~F@GrJJ}tYFawOBwbm zVkQfbLh4{VC1fF|UfeOurZcv4Z-~!08wjD^c>I+@;Fn=mX=S8+#Fy-WzSE8=l|GGy z;1KJk+J$$0M_X2{BXGE@DMQuuVz3yEif-|(F^9OaL?6wsSdpVFQ?C8V|rgN~ah|Mx!k0al3_rxz7~IM8-0!gw%Gdt|ivd z<)Y&Ox|ZD3vK0fVsCS(QJINLF*4{xnw0>MHd!f$Yn#tfO&Yy*d6J-qw)q@~7rWq@h zG{A{=fcjai7c2*}-PiD%ec@u&NkG%+bG#|$IU2 zpFHLf{L0eJ8rF$QO7*6GBtmu&izs-?-BczFqLaPB%cvyYChHWB>CjdCFtN}X>_Gzv zBG4C2sF#8iZaX3z3Omn;K;}8@m=srjeU&^vBo&?u`|ySsPJxnxYR$6K;A&k$rdFDQ z^qgWS6HTEehTRfDAf`B&u`8-_Zhm~bOH>s;JQCxf@4hR}Iy1;t*|KCra`h@$ZCI|k zDw?xT@$-9`xf1C8JlR<}{rtYY-Mao6?e|>=e)DkkH@NL&<7N&2{d%A4-NET|LE}}9g|wa2ThT!0AV{b3}lv$Ar<+V4^b}kGCW;*;$pjbDW+j}{CxOt zYjt2}hOXxR0?_!dK;#Xy(?+~0@<<+1SeTfI7}oT+ZaizY9g8=PZEKU4>RfN39XU!! z2tLAhFxpE~&O#vjvVdxGeFKsVdXB$E(HroOm|#JjOZmz`pl(ql829=zG9CGE*X*b? zI-|IsRV?pN-Hhx>79##GAbOurq*yXmlV_#d#Au5jA;SFkA49WF6fTS`4}tK?x> z0j?ovE-6k{BMHQ8BDF`upAGxOe*nbve>WS7iU>V$ZU&xsin0S6ae(mf433+W5sL?uw%SGvDmN`BB{JJ z{CSt@*}mUvg2DJxj*3PbsUle(k6FtU(Jf$Un8l`8PFfM}M^ljPf3WR-5oAh?CrXWmz-=2zNGYg13EKFn5Vv*|EG zCCJ-sAaR1!G{d{q)2Q!l&yzJyAZRy@RxiCH4bN^uS@I@dxE|8lXkw4G1cGk`j+hgh;_S4tl4I+S}?S8RM@K{i{ zVAl*Dr^61I*LEHW*x()L$L&fia6)r^_WqW~E3M731fvr!n-6VLpqDO|K<6#8{d8od zoFcwP#*i{iy=*oOL$*jjDV_m~gFVKnG)axKzQZ*pr97W-vk{(Ud#_y2JN%sVv$0HM5|O2&i5{% zbC^{7d>Pq6L*?8UQo>2=(|UxF1I_gm z)`Er2vYY8Kmsu)Ts_k55o4ECy^1|?PwMVvXBi6tqohuLQ^wmh~a{i`#9Zvju;TBAC zXGh`G=J2&8sWqTZo#9I2MMsScm6vN{E=ALJT%wg0N`=(4%}R&h{RH%UK=Z{c|B_3h zH=CThNoGY8T|&RV1`waO!BiL|z1n&sT4S|Q(;c&NZierd1pa2rke)VKD9wa_EtDy3 zI8@4}R?^>g7WgXEV}~G;k7%fUSZzw8YP*;TVWlsBA>X=XUC@K)H-Sql zO6j5YIt(YNIYC{9)h`kVqNl$PL8{Izt=^8j8@~E6GO=F*Zw$L}*S*-;vF`6XB2;^PPR)8xncg*)kZO+JD-hdXtV zC`;KYqurR@=k9z$ClD*|(fkAc6-(@Dw+IbKHe#4pcPY%2PPig-{0HqFTO_`q#(@~{ z+aRQe?3ic*-AB7Q;9g@WsZ7cDN?C8`BRkKE-4iNtN9}BIDp~4!>0^(9R;0{sc+5q) zhQo5+_8M}E_40eJ=UUfAMzDe;MQNeKM)@Ew(~p4ag<}~*-2f|v{$z`j9C3%J=d~p##T=KV14Nr(uk6)J zT1ebYGY{zmAJ2npzjzP-(+`F#|7h) z-%y0yV1kEd#!Sc~0~OB~i2cM&l;9rN4C;XcQ52d^w$A(tJpB0MjPv7*MCIqJSw>-{u)NLu`D?q0Pt~U%Y3c9szEM6HuyS%NFi)d&n(FgH@#9%S4^Dgq-XrIlNEN57 z6$V)dB*_%!W?`kJDxoT@=U*7DA2wep041Ic^Qy_+Oj1>%fn^;boov3PHo7&wn{ZSP z(w-K9vBu4#X)LdAn}Um0^K;AZ8a;Pp@aCM%ey*{^Jv7v=rMardg)y6TtuTeksmg_A*a(GW z$EB%^Lhc-!?hBgl=*~rIk(Mho9Id+A1x9!F#^L8aG<;E2?-CE{NrL*A*D1EkAx#?y5fmXhLBUDF>kKtV7TFgcI61`Z7)75bqz|Ttfe9L{qU9uL^a#Qy z;Y28|&<$L2#Q;509iVIfHtIhCpK;fHB@x5W8NS;vbz~yZQC~+YV zrSY3ME2(h>b**;#;o-v2&B?cWz5naRP1%3uuj6m|7v^nn(OO5*NIw4GVW?pTAfREt z`+mesCr&bRE%pzR^imXZXF4+!-J6HO+!~@p5IG+V$|~pcGYltGbaaCj6X#YfWb!Gr z>f0@E4*5Z^;Sb*tI6Yz&h^+c~r)!rl2@kq7A`K6S67;T!S)L-hWpxQUhnq=|j1#mNjp{QU$k;6XEh}v;m7x|itWp%@4 zDZaT1ogZE#r1`GUAHz43;OcsVFCk`Fi7&g;1RjN@4RXaT;|@Fv5heX-f_bbEt?X~@ z(QLj>J`9f&zq1OyzgBvo287HK%I*Mt3f;d%J_$cx`5vO(bJG7}MB?w+bqA1@OD9&*3g=Y&DSc>pKAr9WteL{1156oLPVYlaRAk+;F-)e1pEim04RzwSt%i+!2+F=C~Y*}Zke zN#$vp$C;Zh)jjpej3a%m1>Hj)^@}yhP8D6Z->_Ai)eCxK=cU4?B$Vw#_8TBED1e-( zVbaIE+>GXmE7biPZwav_^=dnxwvKDUnbx(RgbLwKl`(DDHztVa<{aR=dNv?W+%xg+ zkjSWgJ%@bz%&5Fkb7U-U{gq!Ic^#8a9bZXC?H;qu>NRqDgH_a96xA;;S6_g9zkJqn zL)-@vrLe6|O~W-yl_;DF$zTx+rodo_k3nn6;z~J&w{8iB39efUkzyItGqXtP(^v6> zDOn8U5pc!qwyxKDwCO&v0A&5CY83p#;zHv3*JrY`(x#HpZ6TF%%)a&wihu}$*h+a< z&Si1nT#)M__QgT0GWG>vy&O-XyVE_hn0B9zj4)>*!$FW5_90J*Nu_RA;(3?Fh|P)>-G+_;hb37m;=EbTtXvNadH-Xfa=pp9AO4Wcv@Jk;mIV35PQ}sA0 zD)wj6Rr(SlH3x^}%3m=yywK>9h6OwGQ7SU7*@I)YR#D~%8u=mOo+0u=fL$DZ=C9bmheHhH2?fOSKGP7b{P$WuG$Muhs;UawoW z6stAWnZzYgKyh3r^y(qy`*T%)Vj-(8#QjvF{Oro_` zpEhnWDgsbtD9$^U`#q}=4NZOWcfl&8RM@CVbQUt93cN|)wyL*eE)|14aC43BEH|SS zd{og3RIqu%DN9bF>VUv=PwgAAZRqTH7eU-x;7a8x=n@OkW%zSl*3f8g+qYVIzwt$n zm!12|H{&ZQq)Q>oIPllHV3p{p){q}phEnHN7h0FRmS5XBW>Bjc&OIB->3rXbODXRK zPP{hQra|f%X_ZW=7720|(UX&}A$Nto?Gl7&TFfWmKh7jW*0QaMy(mzf3Dcy@5fGdq ziSD4M8;YD^$R@XL;5BSMJHLag;} z6-f6SLGMiUDq4lxNd z`r=Suwz>V*w%)M=*jYmp48Hng&Jy6}F>gq1p{vJR8l;~w3GDzlT-~PHnbA&K zM;*{9X<$axhZ}YXlcQBZ_-q+zaotlIfzrV;g0y6ONR}_774w6cF5}|yBpe9J%XRhE zDj%Vac-4qYaKe=?hyaPsHJeT5SaRg248$>57wTD{pgY(Wtc!)FTi6jV=(PT#87NA?u0vSY zq*XgQ(*)-n$e2swLWEQ0&*5ZdgI=Gdcr*GFg8K|cNQ-tNd`B&{hbtj%#}JuYt=ujY zF=Nz!)Bx?XAqd}H7N|7H;_ui}+Qz@|)H6$em^r1T8IVnH_i}w9_xjgfYC5|?{oBV5w`Xmp)%JxnpRaV#2mip6_$5XW zz%!J$&IWk_;t`i`*;QTm{Irfzq77ybbySR6LQ4VyRfw)+%>scO{>(XcO;-L7mtPDb ztl7Zy9q?e4PFGJ3*=aO z6$|-&yK*hncsGC|YFl$#-Fn!b@=WZZvYobedhK@h56U#{aVz|;0s^~f7F>mtvLvLm zpq#jWG+3yF-aoIju7iN>ohH*un>?yK_>In-?(QQ90qoXrG|T*HnkqOASsO;J?gMF} z$QM4?lT0=lm!A^Da2E__z=Y4aNGzbKYtoX`@^sQt$)20l@0B=rx2%1i8iM@^vW|2; zn>xGFTr;8W4g$3nqzyCW0){3Q7%UJr(6r(s#rm6qL3tY*Y{#fFj)V>h9tzI%JC{ME zLJG|Q&CA+sTr!eWn_lxmXjv9GA1K3+QD(j-YJ()1do9&*ZIcN2(N-P?omhJZlmM$3 z9B>v40`@-%iQ`%5=Iz-!)_=6&lk?GL6J=5@HAiN1AnfDq7+NDp+M)3(^o0Rj&+nU&@SzE@C+mvDR`=iJnw7fqLTgsO zt(VVFmY7pl=#?^E*NKfv$!6#_{al!qG1OED#d3 z59z4}+!Otd;pUdeZH8s#lPhA3Dzhx#sg!9O<1P57(Q(ikPM5yz({hfr58ov+IY>EC z7M@?jbSP1iD}B99A>83Aa|bO=V;584D`*%6Oj#1V8peQ7>4%Vr^jM$l=|9^pw%@R| z6nVSg@)ULWguXM)+(mnfU0oBx^{Zgk^sX;d>G6G!SWwZ0Ke(S{P3t@78Ncorg!Fc| zYhi227)^*s@~JL+GJy6}cANY3f~9FZKEWO>plXo5iDT4R-5m6>0KmnwVtH!UA7>(qQU;5m zHWnToK_brH_Q!s5Z~Wf$8Xa^i^dX2}V^3cB?CZR02f3AaNF+P~hagGdlE|neSIeP} z@<$(ZTz_@p`LizJkKfKmk*x5UHCSd&#An%e8`-CKcnMn7gI%}OI4tViNbY+k9oO`I zu^Ibb_(=wRHQUTOTbe+4AxCHd^8Jo*@(OU%6CD{BV1g1b_jcQxmDWJ%zOAf7N#oB_d8Vs%#b#aHR5aSS#T@zo2R zir>f%W!1VVZsB?mPZ(XeEZ=H+B>rJ#Hz+&3VSs=G5JDP=71#%j=7nR~;1d;4en^G;gkIcs4VUc% zAKEhNX0fNG1KlLQim*Wn%w&$L1xX@|*+|eAeu_SFvgovzQ1exropWP=L5;>Bh zWVhBABw5efYNS53mu)=mW-$-&b_AxeCM*XfYtNXC|HXVXK6qNaMVP(nETT|uE58JT zy~7U0LcCM2M9VKmUE4VEr%J0{m3yBA!F~X3r?$R|3m)(wVFFOxP%rb4;cwx5>0Yf% ziN@QhyfF<4qinJ7eShl(c-4E?A+U0X|NMQFsnt-|dLAv678|Bk?CDD@aZ|~+Y6p|n zBVGKM`==P&r@YdHw`5wYlYSHaj5o;3_x16pR`m$y{G$D-Aq}4JsQltuJUqJBkDB#; zAQIq0oC7%#r+RG{;+*9quQF{l&Lj5}a_o*Lyp>nL(=ARnWJ)b*&*hLlPn_xU1hoSn z+@cVeQbYxL3)UE=;ExDywlpVXON9zNnJ2AahdcG8Ib?Vd57_1D5m&! zHDHr;(?zcIvrD&bT6$ISFn}(n{!}_VT$URyictw zK29`Eazjt2Yc`R2Td-D@1*f{lX{W1vS!jm;`_*1Zn7T#YkdAm$ZWO;nMBh3Q?-n7Y zbxBLT)IUdzKWaUCPH-;U_cRLL%qezI;G5w_Ue2-SnUqhQ05>3=;Fn1CI~IM{B=y04 zNMO7$A1I`^6JZf=V1_mOP_~N(;S-_?qiyy(Cm-ckzSOeX$}6yL-~);ztG2P2TKnKR zVhWo0$Bew}yt02mSg-U-pNR~$!jTAnxSY-w41`A@87zh1Ye*vBXS6_tX)XPbE!Q(@ z3X-E?qF-`Yj||Y|`U9y7iFc*4Dq+<}=s9vAPDBXT0v)_v@iVH7f68cjo`of%|Np1Lf8X?SFZ5 zFmwT6%H2!!eTk7w2`;J;pYAclumPqKd4j`jT-;)Nv2*q3S30tW0dK;XZ`;ZUm|pfu zO>wjKW<;Bkt`$C*&J#1v@N`uc+tLoIK9hDiJiRIFvJLvyT!-2QbxbO+v!(+VSvW0a z4trD2!2xhl3M5wcyfiI_R{S1txfJ1MPhdrh9xa=zHsmywFtzE}$ZC|eNtkDzW4=7% z?b+G3-c3|l722Ls8T)OlcN^r5QCyeYn@t0_6cCVa?-SgHwI0l^ZRbY6ZE3DhQw=I? zQp)Mg!H-wvor!Bq$lq?VrI5y2V4z2OJb3!4#3wG1hNUex{Hc@0mV|ZqH&1=BY;-sq#OQy& z^$RmR!LNr0$gFGc=~goDr6)8pky;|O@Q81SU`D)Lln+PRQ}+O0-S+?bMciCvMN}#y z5zdpKh+I~#cUz8y7aAF_W zMmP;1(GnC^=<+2JzJYtQVm7|cJ=Y}rKO0P!XJy`KwVp`8mYOTvIXSl@47PKFIzJ}@i}(i=X;O!OD2l{C zXM=GV2z(;7TU1^#QNo+sFk2L2(jG%{0AC^L&uB|NAgFY%H+w{+tUd#>Aa#SGD~b6u z<>j@KcX*L1mz9X|-=%ZGcQf88YBkHK`etOm&!WXdHIgTh;4)@w;XhK>uSl*Tr8fzT z3@yl4IUFCfht)L^p5fNBHrTL5P!=bxInUd2!@6j*G$v#V>kg(ZJQOd;Z(}i~v?J(kKp}?tUL}6Q+_{!5)_G6qrbDkuii(rX?`JFQ`|V*8EAT zkXlqwZsSd-0M%=F*7Ha5Op%o}xe?G*9FH!^8!Ph=Ho=ksFS`_Ol!;NV{ee>FJT*tw zyKABrcN_|i_vq}HB{UR@&hF$9NA-4r7sc>@e33RNIOJ z)4%t&T&rK-l<2BeR;+m`L&)3At*}BbGgOtDQNLBaN?NlRK_ zj7)_@!ayZ`#g4{kYVDYPm2dH5>zNEb@Dw*GWJ|nL=3s7Np%jgo>QJ&v~tslw*F9E%#B#x1Bo@dM&w6EBNc%VnWN<( z6Gt@$c}7Zn^VI5IyS&*R;tQEKwShTg4EhiKhDRm0{j@oV1~uMlLW2ThFjt%hWPz@as*9N^L1n$|nND06I%6(^)VOzHGFH2cRfXMceXG8?@h#sO*s@zlTucf?y zd;DG+NX4JD7;60*ghhWXAg+6=GF%oh zScW0g*k-@ZJyf}x=&*b%?G@JZ<<^Wi=XF7isRkTSHwmg;>gW5Vq3H>$yI$%W+1e!u zQb?2iECIWx*AX6$y`XdQDyvlxV59YTRe_{yqWB~!0zC5Qi2{%cxku}K$$7KuWYiar zCke^~xt-Rkuu0c(H6QxsE47cG6|0bD4%&L7P&rhJZZms}SO8Z5Aa5>0!4Sm-7R*NV z+9SG%5yVw;jnphWg&1GiuN<^MqEim_g(Lcs2>g#_-?q{F#LD@D8E;<)hpK2ve?5KN z61nsClH~f`FB@+$XMYRy{3g)WM$oU*Uyn$KfPW(KbT=dqG8f(KshNssH-)S;U+%$@ zL!7m-ZLUizwzBhL^?|;%L1u8{bE-2P{;oo zSTniKqjNncutJ~s*2JeBioKsa?~q6{iRJ4|5N-uKoRED?@wIC+^^&R9iDL+uMtn&1 z(6zHY}{17fG;7Qf@<3MXjX6VV9=8rbFSYq_sSwi9}bk8=#{J~v0l`fSnztp{899yVo4 zkG3Y=IFOTN!f8S8)y&WE$$|^BIFmr-XFfVeu;3Tb2w*n@gvOeNDYHR=Uv5`hPQ^c` z@ey+QIIO8M}5bBz0IysZgt3> zP$okxpF~@Mrifr~+So|>$xz~?aTqKNO*fv%4IBxp6eP-+<0#5a@*6I(sc($E^DpNr z`Wxrb27x-T_S4D_m?UiVChGJys}uDq39XV&;HU`>{0Y!WNs zpD27N^-aBh_kK3Bi1m?=#Bc0`emIMg{X=9`-n21ZEGRVa=MmeS(W`tu{jHi&b)Xs{j@f{k7A`X_tqGa`7 zL_;ddn9A9o}-$<3@3R^Y2Dd7nDlmIdof>=*ut0JkxzBw zfj`&&wgCYD3l7CPFJX8?!rSjW`Om0&6#xG^^TqWWae?`TB0eOe6{u-i1+_IA)4ecA86)_?}~GsllnJ29Ud^d6l9+Icw@N^Sh{Z2t#0 zeEowPHgYd#y0w9)6gv$U{cu;itF_Ap7uI9O-=q?BNa!^fBg-hVX6otwRs*L$>nmm( zy=9E<1Led_;sgB08*)AG54!$Yp~}C4yQlVcWuvyN!M25-dC?7CTa2~CQ^ugs&K5V^ zC3%w;oI!BCqGtmOW%%A)Vhg!r4%#OVY`PL8pD<8yZbRQr!Kjn{!>CxLw0r)+d)64i zaz|GIU7F3Fs6s<@TS@f>X!a2EvPU4l(~5|Z;*3-6z3baLGrtrV^KoVMtbfvBDV5_Z zD)eBkc6>ZTpmVHltP>$Z+nW@MNS?q;0Zr(rw^Y7ao@QG7ylRLIE>3c=Pet2;yY0~& zb4E;%p@hc0H~%=m7uB;!5&P0EHBe*dQ|A91UlvF>qf3xuodKH3$@~z)av}Ot7@6swx^< zLyM`&X#gFzO)^t$cR{Mwv^mWzY9Xz=O%;~5HLKL3wrwQ(QQLZkD%J6vAisYcGj`0l zH)gDjL@jsm!)D?S&FNyhCXbRj5|U>`zI2Z2=yQ>4qV9Mubs!73lfUyGX3APD8(Drb zXZC34Wo9(r-uU;m%!>)&+B;=asJ{4z`Y zAq}R}M_wF2j>%L==Ah#xp;9w-kfh>X&=_xA&?`jL zh2rHnq}Wx{^`Ly)9Y9FMxR$uQm+3Rz-q9`eIPkJEfT==s0+KHSATN1+Zd{TJfjYD& zP%Oj%B#WCFicsqK6H!h*8UW0N3>iu;jv1gNSV)KZWHE{_!{WL8!u>f1IoE?07kTmv zv(h&=|K26~D)P0RnxqP97t(nccZeQrR&L?R{^e`Q6>?PN3aML`y?ly!7+df=Ri#I# z$aHke!v^OlkS^Yn0NvtofPhEmbHQMw6T9i(m~);K+^3qE8IFrELLiC>fT95!PiL~m zA0NPt;BJ~5h7rBSKJvj#Mh%b-mY-*c01pNM@`t%k2X1f>>|K)Q;DkayUtiHM1T+$C zRKD}#NcvuS;;VugfWqN$|q%xhDth}sde(1RQ~4b!)Vd*>wq;5m3gsBBFR z5Hr9y3Y8D)7)@w|!1Y{>RnENj{nTEgC^;>Cs@hVgr&_NCaX5{jkHjD#S*U3gJj0Iz zAve^7BDH#HB;*H)gFv(dz&N1Z6$4_&BVP!pY`Chc!$hI>BC79eiJ^)XmREiQmm zs$?R$vJ#@qz7&Y2TdQtXmu4aI1n~3I3O6wFb&C;FKNfObBqZpklGyrDB$v*T5AlHq2^b@VA~*#M&jlJW9FDVEm;fJ7CP)sca1W1d)X&T%k^NOo zka|IjHIscQR&0KPE=f!{R-Y>!s@UOT5Q*sP;$u8l7_7=$`%g*YpW=H7J}BtWb1L~- z1a2VVOn)V@EIfk?Nuq|?oG@jd8Y9^prU4hZ?pyx=e&QHmc--n(RR-JZejH4yx-D&Kar>Hj@MG2*2U-C z-578;2HcGScVob*(059Ob~gsxjRALKz}*;d%=peRV|Qbq!A-9g6g@OYz85t~vrWf` zBgmmp*jMp;(QUK|_YKE*;|xu)pdI<=NUk(G(Mfp3+am;n<0F}hr|cJF8|gMrV9!Z; zs;9s%D^C@5`kMTay9AV(1l z4romLjyDFIT5R%kJ%zrH{8NlPbdLW~K|aTn1~o3OqMKs#OXYeKZ4FYss;~AUf62sH zI>|N;!Mp)5$3$+IIlKj4T2Sm`P9r!?-AJQL;z0s1V==VE7*un)Dh) z%At#K$YTZ|%lx)jziwECwXjBCtkL#bT(QK$wUS_>b%O#?4?*HwNq($6t=izF39Tt) z6|oVgr~U9&9o)A&J=5vdS{ukZ8<`%6D*LJ?m8@o^0%>UbPDfdnwa`|LRpzRX@w}Kp zwk+$gkRuc5p>N+UL|jHve|I?w18t$K=IDW(qj{*@jD7hcf1yDMh#?q5mN{BS$ipF) zNK<;xCkd{kaFdg$d3%pC=-w%}>1tY^tXz{yd)HDkI=N{tHx0&An#cS*%Y;D7oeLg_ zV0zt@N>LiBR}xHS3pP<($^z*xM#;t*ywQhyGG~qwQA-4n*>z*S9GNG*wInKx%u;L0 z5oJmtM9NY~3|)(&Cl@ zx~8b|?W)){k5waa7`nwZCf*Q8s_@dr)^s0(Mzu4BJ3n>ksY4&7=J%O(l@q8LRhmQuMTo4-ftwar%4b@UZKxoif*!GYkC zM<{@cb0k)$*r|tL5bspPF~aQzGZH`t1pxa5|Y( zzuadG&Bwu_`t2E-#3-nKcLBp1a(;{Ff5(tlzdVhwhfXl#pJ>PmMbsGIL3RP>Atux8 z@?E}-Ll|I>*0hfzhGETAe2O5M)=+&Iz_>_IGSnz$HN*KxqZ>4>?eHRw#x;b#UxX;~ zBYa&)&y0FBfV}4Qr`b7yVeVbq1f#`8Z{wX^w<+3U`O00;hW6T}Vl#@G#owZ8eml0P zm|weXDi+s6o4V%OZc(qiMq5-aa-|kk3ml|H%>uJ)QM0s@Thz^O#x@mm45>xM0-I}7 zvx)(?sGpY!Eh^@OTZ?+8plMUhWZG@&nJl~8Rh%5gsJP`^3lVI{tVABh9c>%y{_?xd z5BY}7i&0b7jdzHjLE_UnL5#hP=v=9Lowb3g#%j-WqeaN+#u1%EOwN%2$1-pMoTkUT zxrnk$9FOF+iL`qgEu)IqC4sZED(z2$>!+uMi&7ogm}QYGr2=4DTqZOEQCh1%Lx24j zT$?3iJua~K!HnZvlOF7`N}jV+UkEc_TYTh$8}(uD#>x0ym5n=1X&_3h_5yoXh<7)Y zRkn6dq@$+xM~cU6f>x1_3E|ZOQr$Ln^3lmhCm)@Bbn>wvA73=36FI?*uad4Yt8bqe z>C4xW$JP=_mi5x;;9F?6z4*$FX2}`3L6dntp7^^mKqmlQqiCUTkzit`H*l$memDav zt&gg32OYfLGPgJTnD3=QJusfL+Z547?3^SqLwBx|v{1))p6LP~AlJE!3Y$gZ?UL8d zm#?-lTTCJv*;412ErnrPUOmXs6;OJ`z!-X0(oNJ%9h)ZXxWRk|Aef7Zl6hq)ppg#h zk}zn-X&8!^xfE_`#-g6sS?-%z9*;N06K;9D*ezCB`+!@Wt<%m0cBM%xs}%P^C#sfZ zbrD(2H$Q9vR7d=IK-Y*$s^bHb*RPsFwn%}330g%*Q1#cXBdA{1uOpY$v69E}r7ui~(4Fvz6#YS+nH zvnSnalkt6J)|8FR;*MELQG|Ge(Y21jbbOQsywI8T6xP=d-32qpCzn}zmvG6u_vP;< z6WrZwirJvH?-?D(jMvR{3x1eu=x4CT90BX+lEv{_Gt4}lCaeqNaezH=g%;Hu)ZnZW z8UaGdbLe?AHq;vio=EM4;ptFeLIx1`o;t4UxUS>6KZfgWHAOP`0HZ6!lMBI}_-(F< z)i`agsik~2SGs}2=E}9_uf_3MaMnC!%4Qvhl6AgeUPN!CP3DA3V~q}VPz_HLUHM$c z991nl_UYK?6871=v5RkQ4kpyf)wl1|+U*j2AZe!Uu|(42qmIY9yWJEVKz-FC1cQ#y z*=WGtv^j_27iCBO`Yda}l6%X(8hCeg<6W6}GO{IRPLs3*5Mwf-k;-=j;F!i-8#-l( z=k+pa$M)>mUiEq@O=)d08%D@Cw|7UoBk^1eg)$h(zcKPqWe(P^(O$Cn-FsV`qiva> zNJbEs#OirD3@{?xJTp$Bo14#0;1~sJROcK z>H38tr11FrP;DtODd))JG^*(S1Ty}6=!%J$$Yntol}~gwk>2|$>x@t{^D&rF;{WBfIY@)wMq+?uF}>dR;<9bZJ4Xj>ds%~ zhUk!B%-Fx_y~HGFeRT%JWc##OqvZ`{HOA8Zw5nz7(Jq%Y8=gE6%r; zQN0qKj{_@|>0ZO&Elc&cq93Hp4!DlHZB78R2pia-=eJkxokstoHTrhuW2dz{t=(zu zcSmb~Ao%b_Q_uzJ^1SbHe2vs>ch%8L?W}fO{^jd4=~J_zTKh!g)sJH`q03QYiIhe! z^SXXI=U;`@41e>T*!%3!JNyl@jkJ6Pdx&U#qdazKLYRJ@O7jWouxs!a|+OP1I zZzyUt!>XdvItF{M1#?dlt?#{3zmVT6AXN&Iq07iEmXG=R<~GEIFtDQ9XC0wWLPb+X z=3X2V%rOj31LRMUe)i@zL>@=}5nP<18yNY8=ZV-h>ztu5fFAPI6zxw@N=x#l*qSQ& z8(PQ-BXJOXZ*d_ZFPhC+u@SH7w5~TSVE#k2MyBP@(6x!e7wgarZWBGWu&CO0SFvKc zHeoDBJFu4SXWQcGhHr=K^Q*sG?Sv88kXpq6R(I8TShs+7cbh_&D1?(_gILWav#P1p zu%>!)fTzcVTcXQC{|x}sY`iO^ERWV2RTc@&IlCojebZIX9nu$zbT72`($K~1nvMDNy+}cM7`T-_gB03Z^a*Wyk2$P!01cucI5Zz7;TxorYz<3AfY5V zwU+_5W(Z6~!9{9-&D~{keBbeX8@^v!<)zuIDq%67g5y6XWc+foDcp$M*p(J+duA!B zuXxupX~vF4ijqxtJd-jV8KWMLEnAe-RGdHM-I*NUb9~S0u4e6qG~d{GFMYZpc`u>Q zG`h+^`G{`H55@M4Xt1AzZOAVjRsL`W$rRthzd@>jgWKcS>uxo>yf5yb8 zH>dQRr`eYDS(tQtkd7;(ozaWeFGsINyRUK;V8rFuOAhVxNhKw;c@w~piLaxak=pqp z)ih<9#jh~o#z|4Tqln^>kU6JDqn+~97TY!!Pg^qe(roQEq*qu)5-)QJ*vxs;%4k_X zTZ&c{J5E`}zI${TgI{hn1r5^t(Krn>+{;!$Hk%!JTl_%lS$Tk?TEX zsh=6kXwHqKn+Gpgl>wnF1iY+NVpL=y^5mIgdM=~1&qs>5YFC^kb}0IqRJfw_?0h1c zJcC6~<&sNEh5v~@em{gE^e|r}Go~La+EYWJ6#KbXDgUo{mkzmYKKLKy^3m2=qBK`! z57ye5Yteptmw~!ZvL;6gW2OBN-wXSx=plZ3ITW~4z}zwHk3neLjRD4lR7yAZD)#xT zkv2Fi#)R+g)PSxpU(-hIFjq!H>5Bf!$gpm-Gd!4MY+JW58Lcm{uR?dll)IDkg0vnrMv#+2gx*wex)y?3)L-pz z=vmf~rC^r1B>KDgZjQtDP)N~`cODf_^jWw&7jlxT?alW3?U;XOW8X0yO9Z!;Gr37v zHP%XTitq189@^Q%PGjUQx%?7C>k*QC`z>8veAYC1w@x4Gs9f*yL&Mzkef}WUqwEU! zsxNo$;LaV~xq~}*aOV!rH0916?f^P_(HPTD!3B9CsrEKW8&H;OX+`UXY-7XT`L)n{ z-*%4D*sLuc1-d*KcyS=p(h8uI94!FI0i$ySkYIxnN5S;6ScoD_{Yzq|^EN9#k5C}3 zCQ0L%66PYeIOe+4dXnw3vh^hQ&IY9(#!-X_FS@^qwJT$9rO%Fuk8Tyd`xK%KIvxg; zWkE|0XD|p5F~XQgyZK?v>12{V`z)OeWhdE9R@wAt?S?3}kSdU`l(w&&7HeLfP8@hwKU3;+8Zj~%Bp-^w$j7RcI|-HhHcBPm)&vK z?RLb%`7zppVUs-5M5mcGousfA6C+BVX6X!ZnO7+>_%WBi*fB!8JMneV)(bCf>~|;l zTA#=&-&pmxa#mGgpIRBWl18j;NejEOCzh=~FuTXA&86|3R*$^jA?E(G3Ij*YO_J3@ z@&AM%{N?cb_87i0_eaS2mwsIAod?G;4d#b zJ6W;0CN1BgdzVbWB@=MT1Y9zKsyjz6nSe_s@Dm{OR#S|>kBHyU=<1_**9kEj4O9T; zr{IaN1iw*kDbh8{HUQmn!|efXp85t%Ym$^RZHNc@5Ra%b>Tl{J!Drcmc*qBwwnC^? zn4mn|(g&+7Vu4@fIvNb`HArLWttPooY)ocmC^0o!e% zi#P0ynhrW|k8FfXlBX9a%xx6CIj;3PXzGC+hkaW6oT_23YSgTivSM6YZaqg#Tf3dl znC>V)8a0JKIYZD_xj;LyqO|&o4#)dCM<`z|q|+|@^D;I^VR7b=QIL-Zmt3EQVlclj zz(kqHY9eyHu!SdZw*1Scw%j|LlY}HQm(Gz*ebnR4G@UlMZC31*rq=nbHTf+yy5{W0 z>f1c*yTPw^n&N0kjegOU=Zm_Quv0R85BnR3*cXicm|RouOl|-RPA@v@lg(?wt$4ib zJCgsfELAUJ3{KGyK*r)ZCR2bpxPdG^5l|=05R>605k1TipHUy&;2^mo3?Nan3m9A|H&6|H zleTUkBfoIfo+gOUT8czX7>Yd|VIlZ*Im|#n=@s%p94fN$Bq1s7223G)9-%P8UeXjL z&n5j?F+utm>G?)Jcn&ZTEy?_K3~4u3F*M`@V-an9VADga$4)2*bI84!EG`~P!K#NR zo_R0`Py}uu;S6vJ5Mgno^W>ph=<#5oyZSpuOvXYn27+#p7jxvRX~CC>&zR5D(G+I7r7`8R0u5qfX@sYkz#t`P4j1B+AQ%D2 zE(wc04>2~0gJ6*onojf(+{~~yla<650|CB500N)J;{ZKpAtJt9m;2Sr4jNyI&qPH$ znV?8;;=|)3@#zkF#N=wYBv~t=!gP(DME`c8VbK8MHJaJT8Dz7Kyu#Se=kIC+tAvvVA1dR?{7b9AJd&052O>YP zsc0yp8BQmlJ|Y@F)uYA=rz?w(lT2!E?;z>ES!b-Xe4e!|dg0gyuM& z>jxjClpO4B4F{*18I&_R3@t!aE*i=!VZ0Z2IE%>Nfm)Lbh)v-aotZ z>+RW`Uh$i;e|rUQcbJ5fAK3KFlON~JE#?Z%ZVm@$Qj}E_@D8%yWuAuD-{p@(%47o{ z6bJ6_JER@S={bN5y+!Ci(IuXIx<=6(#_?S8UgL$jTZ;&kZbR9l3mm2gn3I?!Ez9UZ zY7{E+(iwp2(0FTic`I;B8Di%}8>EB>$SqN%z!0O#O4MpI+<7*ZMi<1v=%8M5$Ju z$72E0Qr_bhhFchgg`xZ#S`N8w+?u$}A-yJ~A`48J+5H3}%#UrG$R|&US|1fnds92& z)Rp5F1{uBjx{<3EYz4X5LalgtVj0}0Dn?$>S%q273%4z2d9V7~_Jds8Qh04gqRpge zcHZVgO7`B?Y-lj}4pp_Fu$dcEae7@s>O@TiuglIUji_~4Cd&5^4%LNM zQAr=<-ONyglC#X@^yrdYl8>J*-s}N+T4{40sSdKr=aH8Lg7g!lfr`s5K9|qak{cfi z=Yz(<(kO*$mqeM;6Te!NXzs~_ z61^L1J6fE_jGIS`S(Kw50)4Ytj_Xet1oS3x0KPeVUbvBknMpPtYFV!wpsN2zkl|q8MIpYq>90HXOXy*TK3(Bz>P=C0nkibT*q9U*bV(T=}Ka z?!X~gRjc3SyU#k_Zd2THby?E5!`e~R%eS(Ipmfgy^L~2Pm4yPBuh6F+SQ@ouXp0g} ziB6{?mP4+=vhq^ZfsLeogG8OjnmpA7ru*3f@yFevsM+piEL3061{r-K7kHk#9~^xOJzGFYeOIrg+op6TU;dGD1lUL8O~lhZO1>bty+!-y$d*Z!7teP-9+u zOI`V8prvIg$Tq;4u1n$|0GMRn{aR?rX0UlTL75;^=YLUP!;pk?xR8$jV+5e*#S!F4 zv@7#@h{o9v#0*u#4!|jxBA!;fBq)0)MXM8>PH;YO!D$=uX{C5iF5J`F!#%Z+59wk& z)i&W`JlPTMVmv(_yU?qqqy@!nl`Ej}w2`%2g-)o~#wL^!);AtEN8AdLXB15^@mZRb z?$6`E{)8F)@>n5J8N$$%F)@ofGSKvJ0X>$%rqXQZ!E1xmn1bG;Xpb$5US%`;7QJk zBn?PuihPxu=aPIBYcdUmkx%I}hYM*#O0)mm%y3|kc&rRlqUQ~8q1@b{90%k8Vd)c; zRZc{#YMg-^6d~Zzc?gAeF--mM@-*DQ%Dh4V6F?(hxobtpk39q!{wECpnHIbxNtE&= zK)3V*D~?!nW6q88Z&FTV`YD)6r?gP;hsPSi${~fvgA|rA;bv=CO${6TAdBvOD_O%T zjAcEW#|pXs4eM9VXjWk%)3$;`7(x&8MKaa;v7$YXi*m1WAgS;!9kPHp$*dkB$!N6g zD}7uh+{SFz9+h>rM5)t5dK;O%8K0h3k5o8;?O#hTu@BvN<4 zN&%8L4?u*}IKfz75s3-Ma|E!UV*))Sa6eSQ-lKkxF=ZV_w8x00Wm0h!pj^TR1HQ$< zAM)CaMlNr0@BtI^=Rq71p8Y(b-j(^<=s0_Lh8T*j(Gh0jI7;F?wM0Kz*KOrSk*W^$ zlTmi4s;93*&GM{uXe9ZXk6Y+%Hzfc`Fv4Mg5#i!d+%b1vRZA;|BbS=LJ^`jTC|WN1 zDro4>23Ipei!ip8beR@7A94shnBB=#!YY}kyunS`*dlqoj!=LIj~2;Y%d{a5#{o*3 zyChjlkJ5(Z1Z)cEWZBcnm+s;<-4P%1T+apI73s+c(gd9R4>dGSZ|@R z7Aa|p{MeGu7CLOoNt5rPgK|+j#$}4dGTy66OO%PEJV<)_g@K4t8I9Wk{-2SerX*?Z zx+J=z3~8q+1C3txQ4bI>`l;YAS`+MxIsm@NK|Kfc?l5b0P_G}(`l2bx%V&sr=U_~_ zavd+t!Y*xt7!$s`(_aK8-F1JAG#g8c=t~I|U1Kk8=$tD09@7wDuJXb#5EG7rTs9UM zMfe&qBajj#KA0jEN=S0oEWemX$prg|cnJ6?i;q$C$9>F23myLHiU7sNXh$m{_6?bR=%@)GsyDR`nj zZ=+6Sv{$WDT@Ee>t(2-fg$;Iavug=e8Nib?L1y0FeGL61hop`~J520XDyL+GAfu!| z^O8ekcPw$8ZlE}~>0=A~Pc9KqXS8@n+0Dzkz--Aj3n?b$lz-L?M^?8!yi@mXni!63 zubSm_U^WSL7VJiKELaOmm<-aZq-F)ej9eovJ25aL;%6tGaMk3*vo%QD;1%>n?>8jeA-*(#M9*=xN@~ zNtflVEYU*44jwN6TM$p)Ui+PC+Y-9v5t4DCq`A;Ri3bZM9vSBtZEn_GiCz#-o@aF8 z8?t5v*LVt^JWJm%Q$A#&eok`?lIod;>d!p-_Toqxiq)yOJ|&P7E4c(<3&zpB9Y3hF zEY(kU?v;&YNrq@bqL%vonMPMAIzCdj<_;i}CWb@o>x7uY!GYwC$*;slvMJPc7)_PB zZdd-CON+@?!Ac`vMA8v`b93vt{O@9Ob5H*FpTThOMkW2Newi9#$|*ws_^=;_0Tx@T zb=-v9Jax+!nM`KOAWtfTmteI}%!v;A z*kKS#09_b`Rs7lwL;2M{K;8s;3u*~v*dy#u9`F!c#w*WHA&Z)GmlKb{?p-4Uvn9Rc zWz!Td!YPlYA{@ADm0kOmno|E01Oc!2WD^SI$=2h@pK%8L{_RYZt*%D{s9=gAn{iu| zw*H9FJG?-A_;ttPQwV&FKA(<8Z)2l#5UTaR*)ib_ntGeDpR9 zQy5Yc<;}01F_WuphfYZ{fg}UTTo@&k)<;pOyZj8N^l=1Y7Q7H0lpxB)C{kXsM&Xij zzwW4G1pWEUJzzuorLs9?+5c0y6`Fbk#_ekLEVMz|*J78q^X4(DXQurqpUQr6CF z-3WUj)!o=^GUGpm&%dT24UjJNrzPU0Hnu~)CN*`g0v5LqVjeIT7K?F4D(}WnCJJi{*Jd1UXXZIO|jY7#l3ZOdZa3+ zF3xK+BHcJHTYzy#syeaR^0f=3iqAGu>V)+@iUN?=AMik}2SO0_G1)#Q`)nk~v8wKQ zh5YY=1IDZ^n3edbg3xceFu^$PirH3SHwza2p$+BB8q)1TriMq!9?L0Y)jgGps!TjZ zxPb9+>LHx^`^Wp%g{ExF4r*YQe5Jt z0s9~CDJ&?Q)fm`P^pjUeTX!vdtw{3cWb)yT5}qZS@WuL8pvY1B0#{v=hGh6oa(QbA zcX5w+v#cQIX>Xyl~!7yMDUWX zzOz$4I~A0D5~4y1qX#xMwBdX2Agy)JYl2aXjvRh-sGMO?sA z9FzcDd5lYlZoI}747+$=dO1(DY6x<&|5$f+@gznL=fpia!tNc(=fi^&MShW>nkYoJ z{1b)9WQxMo&198P<@&-;SMv<-jmnO^UFwxS>d>JqP;VcVAibGHA(9!2ZiILX!rRKM z4@r2g4At5pm!Gd5l54kOmkM}|zSi&f4NvG_^E*nMA8l#dGcgNZwq{7tBh6c5*vmBm z!9=_XzmZs3hRrBA7>Hl%NxHl#yjy`+?nzhf<#^P^U*3wn7l2Kk!;<=RM2g7q=5_63 zEVptvOK~Fqe1VZKM&*BJO>uayf{%clM@hu{Hhcu+48nI{UjFeig-NtX#4o!1n}dr2^Q2|aIb-b_04oS66@IIWte5U49MdKyhEdCtrkEZ z2RsKGcuN?^yP}p+Y{J>C;E%U@@4fu@$kDG`^TFAuQuD#n@?vuzC7V*X<|ES1Y~!zW zn%q|GM4nC9%ETOp49qH7TY+pc3Zwi-0HZQHhOvstliH%?~iyPUhj9 z&%E#J3S9>eT?bE$1B&||cZ}noVqfg*ANSV-d)t4$V8f0SXWA1^kx;^d-`C=nqw!)J zAi@fo8itD1>b~Ai3zgp`%bWfUqC({NBY^FbIw^J|8YBV`XxF^a9U&6X;~k%e3SS;+ zyjdf5aE8d_%ZyldsI!GpzP}1WQAbA2drWal;tS{&G6lNt>9wkeKX9N2}7BK-8c$e$h&8}ulY+5 z$CV0|-)PJ>8pEy^%DL;r`y2~-j3v9wQe^s9>^0LQn{l;ysk45cf$GPk}x-u z{p?ApsX5m&mFM6)a}MvSvafJoHw}}dea!qL`-`t)M)Y3Owq0jTo#QP18#rn7z=1Is z`V~|o0DWzVM!{~W)Q8v?I2}l33nsf)b}dfO!;0(^02x(Cc^7;wnjROGP-Gl5ifP;s ze;Dc94$q~z=}f#!Lj7Izoq1ho^n~*7;Je{^@iLO#D;#uWvC?i&N6ksI@1QSHu=5x1 zl`ZapkH%klE%W1*oE7Nm?A6EBW=0=_V1reU3f{AiW;%A5b0{ca5yV4i16T1Hw{aA&!qD8z;0sFp+pqt zwKW*-128rc&L(_jD1e%q6$+J5mDp!{bP~~zEifu!5CP}=#BQLOQrCAP(MyD98z$37 zfFC;X2`m_;XaTWtb;vjqN3JK@CnRO?;feT&l)J;^!`_P}xY$6DsDX|h<+G?2h`0`( z>hBr4h1Zpryes~npKt0VmF+mheOr{LL@`}P#}_>^MS|E5JAz4=dUPRxxrysO8Mj|N2o z7_r@LeZFMO;BP^VV1Q0pw_tv-@RYFZgn*X&Ez(d>@2GvmyhAxit=K6)jGe3iKW^?| zLd~UDUd+7QIk(#Nj~fT$H(w6Iksf4heRkcAUYghe)w5f%DoPUy{TC3KC?v!vLlA&$PJW`aM#HNqzWu(WIzkQ?6AMW^tG<(v`zNB0- z^HMl+uJO1Lx5^AC?IY9I3oS2z9)8qcC>T?MG0KJJufpM*-^hisp5hnBD$+|$6muAm zizPH9j$8W(pS3?&hM**4xCV;5$(@LSms)yam(!3^Epa*!Foe z%H{kn*1_D^t%Q<&LBpL%b;P~Y!C!a?&G7z295Y>yV~bn;X(rpjbGncO{7q08oXE|B zI4u+e=OY&2tHZrMuJ~zU^n*aB}G?|r|Oo?A{a;`Fhs__rK*W#FwsDWsz@>GcEO$|Sh zz=ui2{Nb2C!-Bw!3WcdR636Fr#uG>J9DaMEw~-ZIqi zsd2`^Wa%yN`6JzFJUcMAcyLEZri9L;&_BvTuBlB{q>`Q@gI(QYy0q!#ctUEctR!2_2+$4X!gE?_kVLIJ=xC&J(24&+Y#r#1>7A-bGW(q`+gk! zO@5nF?!a`3q>}`1o6ks5DvS& zZ-?-A5}(nKh3KbRPiSm0bpr*Q z=6C74e0u{16R>w&-vw1*kJmP6*K^$+CdE^4(P441)m9N<^E=tuZj)daK8GIhCO{gD zd*SFcb6>T=b6>azjXWKO4f-=upm)01m8h~}uP*(nB};Wd>+#FDg7gNSQIOiVsR(p(GRTS@1 za4+b)B|S0mwpj}2S5MTxR1DCM0{|OtL*5^$5q5H;441ry>7W)9%Yteg{Q!iRs9Mdf zUY28KM~G+h&^~kQBi6aQKzS0&n`ih)-GITD@Y>|6V+fkbqURyo4=BTvb&RW|mB)S9 zW$YHF8hQfXIXzw$kH+zu6^)ed1KJ}n*6N(euMB=Io;el?sAPHjao(C#W(!oP(K{}< zPe1nV*5GhvE$e6tDH{!)?|^~(`|KtY%?|pubp9eO4vL(!#`t7ED;tO7gyI1FPYN#+ zzO;h*GA#pvzvHdz>r6SV-#2Ya*dRx^n*K;HAXpv{7!i!n$C>a9&?_%(Ct-;~8bk1^ zcosJ%q_YtS$Tua0v?6cvdUp!)aM>cTCb^#64gI!tWwaTRoZ3hF-2s$=7UVi?Q+?CE zSCc@-U9XPyrcQ~&NREcU$FT-!lfpB}q_wiPWfoQ=ozD>(r)#@}CYl7I-{sC9rjqQ> z(uJMyGsR<6?Dmm>!yxauU<67Vr|1({)Dt+vFy^#6-*23uXB5@QaYr4W?4cX_tJ@C_dJ3#5fI(RU)Dn|Drx?xNK)t@UPP*l!@n24k+NZgUI2Uy+q_UcZOMH@c?I8o zef@j=Nty86*G=CAILq{Y3IZQ*tG9=rRdgr7^JKyvS)*0C*D^7(;m8@(h-Q=Sc6ncJG<{9E%j+fF7@LwVE$EI8ReH6 z|4RsZu%Tl~(Rk{I$9Kg2{d6R;)gR87$9TGNt+)(}4S3u`m9Jc+_m&*Oon(hB9Y&BC zV<=O|t{KM&)F4x1L=YW(&b;5B(O+k&8l)^j1R3OBvq0|59*2_1!ScEwN8~JLO_#Od-;sSzuU8GB%56S8RfXF_^)Si01GxF*Y&q ziySdBdm}`GNuJ;4z{>fmz~1Fv>CW|= zXi}s|ySX%L5hbIEbT&mK?q>u^`&O)Z^Qt@Ey+Ck)6lZY3)^MENtRldyptd-`B@UFi zFtt0eVlbt$75v4$sJs`@-q2H6Zc{Yd)RC|306a`p;W4mI{B@>K7FC(xg;a~u;iNV! zaOFgb_KIHqfMF<3YJb$E@NtZax#^y1y1(0E(an~&)o;KSQ*Pa`LA_5Ah-kH3*AXy1 zxdJd7hQ&f5);~dHVv@(n=ShhL!HC<;R~DRvmN*u|2oZA0J2Fwpsz!X?kWkMPg%hwb z0P7+|4Y%fU0s|vKTJBWGoR=2foMH;b70=&|r1Dz(?_eABc^-D4$ivu13PkE-cTqAF zg})@)VBy?y4L|3!p}%c_^{|~QpNil;FXgd*BE~EiLt-*z`%_QzoW)mr>{A4a62X~o z|DAtgQgNc`n2F;m__Cqu=bbd`VDhAN1W2pZxQ?*wu9!*sF4{o#>wvqzi4FtrMH3%A zv7}->(t6&#)-V!#$JMM3rH=PS@9egmP=fjLjH9^M1SN7e1eF?K5%NSZtTz0U&PE6E zCX$n$vMD(Ntqq^KyTF}64~Beg=2O%DhJ(TML3Yr|*=!gLKFI#&hr09eEdtdZVEN_2 zF!f{%1A!`u0XE;1v)ClW{J%zhM2zI!$R*;F=^vp!t( zlL)bkI}ug*3i4k0dDOg1#6NQr!0q3NL{0Ipx*<)v9)cmc%UM+;4Xl|w&r7E+)}w46 zM&LGFe%?Rc5aGup6hUVCCcRPuQMi5+Zz|>?KM+CaYG6r5lvB9HFN+mkdc>CH_MkejyYtvY#E zH(BA>j2*!XQa;l@U3!>3;*u5Wc|CmivGs9#X?OPlct1IM{gCMSTn>7Cet7R&zde6E zL;CLJLhzlt{o@>XD(Rf$C-b{Y>5|BeyEeD8YML6JTq&}Ol)^RW--heEIcqlYZ%;qr zHcG|J?mt4fMpAir8c7}o_I;01MzLg!kbjQtm7K+a$(E^uWx3b);!q4Fk`gOJEEM>e zSuMJCa5_E|(Q&!?-Td3TYRW*Kk^cHvk>zHl@Ga1Qvv_sDwH$)95G5f2idDaMI8%Wu zQy`XeT}Pnu$VjCX4NmkoQuwDx)T_?aaWCE}aiz?Pc0?)sR8JEy`=+?_tzbrrcj0tL zxOP@Nh``|#HVy4hhk}G$8ne_74czY`o9TF?O@%_d7Oqz6IQrcChG}1>@_k}XJY(1M z?P8MUxE~PCbk(|IHOfPAb9qJKd1c$1%|=kNNS9rAKeVq=OmY*_-p?0!evdJH9B9_Z z#ZM?{)S7)iImgQer0KGb9uXDNY2zz3g*r@Sx6nT^o6N{R(Q3dh}#r-?58>n)aO>>rdEm<$mMGE{LH^o=lly|!k!oO6^E z)X;hIL|M#0uT^5mzlk0U0!4z*^qa*vvscx(;cnLWZ%^(lL>knJ2E^o9q_%O%WFzg2V6Ir=Y}a zUvPQCwrM6Pbz(C;=J^i%8T^iP0Sna-As9FE10B~ z`nTpo9aZ;sN89H0;!cMN+e5qT%Ut}a7u`+aVVIV7DIILeko>W{KJqLZo2n+ zyT{n)q3A^^_7X%G5M?CaVImd2OtM+^Scg9_WdSh?athh2W7>itUPP4}9M9$d{(QhG zP9*iAQr+m2Dn}?OJ#h@3?%?F;=qQl!X<+YoG5YyImfARDWOx*+h?Pg>u6r?D6m@CT z1Ee`;7@7&y)qE8}4ols9<&^HSscOQj7O_bCB5YIBZq|FAx3i77Iik!H#rp~ZsE`0P zEk$;4tU|Tp->cZitHwvQodE z5E~NF?=AQ^Nv-j|Yn_tbmvUi;`Pa4ROqjC{K#sh;;}1_{B5;@tpAlBLRBQn=D>;P- zA+qQBp95A=0UI8+$ux=dYV={<-Xnm)E^3Y2*F(;})*w-sF&Sck!@o9R5cbZwoK){L z{n}N-YDw4Hi$~_LBW~-y4g<{Gn2(k*$84N-e5`Icjj}moE!K;AWWTH{Y|QL5yCykx zVoWU4I&z^7AI$XZlpV{pVx=5r9YaSA3}!7I&AggXIdZk=(jSUnYiN@qzvckv*0R-{ z`(*2wAr+{N>&*2h+GDij$=j|K7+^`>fBm2=zccfxNZMqJ^fGce2yu9~chFTKr)IDBy#DoV_|WuVq7N>$r(UY5y>I!n@;4#q>%(j@}W z30=q0wxJP65oG|?m=$oB#fYS9QiuT-LK64ZH{a;~&8ej}_q5D)4{K_0vGj~}rqirr z*iC+U^>j54;@#e^jm=%CNUZ?&)c^gj#IAxXO(7bh=5P9<00zy5hoAB}wlI_(pjvD3 z`3}S|YEg73)rS(y%z+GxgBdBAYzmM0KPffU`Cd!}_E=yxyCc9M|8p+YkJ~-Be1AoW zHa|jB=&yY|_dMl-HxDy1c*=#6DNr!9blVm_wtw}O)*DM}6L-z8fL(Wx8~>-RRX zNPa2@udvIim1|Me)ae5eCRC3V7b?n^wFZ}VH8r5)%`6ce1BQU zF&`r;9(}bi>q2X=naf45x=N`|;!RIZuWt>sisNL>&>#QmBOm`^VLwz*wMk245q2{1 zSD^mKpB1_`)FQ0I_naz&8V_vcE6KPP`3K;m_*(x7IKA1MVhtI#~p{ z0@ojF8o8r;E^8PZP7RHy+Nyu7(Z_a@k*S#IvQj!E^w^O^HT-)&=B-AG8IT_55%&H{ za~^xt0R(1)qgT~PXhG+gouYIeTrziYUA|DT8Yv_!$zF zIQ(Ay78Jz@7q@aS=$uBB8KXOgyXf?1?6+2ZXI%xzc`0QQMAKW+neD~(ttlgAzhmU= zUDDEN`!_>zV`stHDbm>H$=}SFflZ8F&!m-0Ie`4Z4>7}wi@>a0TC!`pmiO;oiSJk8 zC7W9cX2#y;^6k+kH$^gTiPtk*9%{volWUk35s-rYLuxSM1uH+r2<$3%FL}}JZ;*YI z-)l&xuj09}BNco@dKZ@$a;etl-Bh)l4!RpN2tOyd3hpypk;jys>V1iSyiBE2FiPIiUCW+l6B_4|K#x zN}Jgd5e{$I#-_W4AKc;BU~c}lFN(iCu|^{pmXb>`$eg@SxhWFfZUn>Of%x_;7SXO; zd=%$lnbO$OtIovviYR}-f-Z9An2`O54D2$GL1P?sg~>83o|6;1W`^RfjKq_YmyKRc z!o|`c(Ld-`Y<0KjF9zBp`D&PpOwID|Avz;`yC)J(hbMmqWadF1p?;USz@z|^D1+X_DyBAH@w)=o z13=IV-~?oIf95(gX;@xOpwcFooYoZ7DCD2$rP=2{_QPePZms<=*ST=D`T_!4W<2!R z?x*ZtqXL4_n&--rQ@&a>$zK0L0=(qOAl&P-;U+s=KCP)R8`!X|E!S(XPRZyUPrh=+v>QmP~p71?v+s|Hiw6 z{3I1u5{{Y3PpdZ}$r_2^dr;KT+0Kg@ci3NZyGIGLyD@W?fbh0X4OY7%M?kLJ&J($q zZh#9@sAY4t=s2LYo^r{vP8PzEI|*gk{qtbSt% z*Y0qxH=H+OROxj2yvE8VO0B&)bS+u~M6)4ncO=p2Xph|4SOGoKWYjYu#U;=PXDd z*b?2%HuhbX`QbfwzeNG&&3etKsnV$}5$0qrmfOy}R+$@?VC3WVvumQ-QOdn3M!jaU z#bFP}X)!bT`~f5FY{F}i=hwsjg0EK4(D)ED9;>u$Ag&&gy}3j67r@zE;O+~rYpNa? zN=Q6>{EVCQ+aU(N0veDXga&bBj&588(T&hm#}Wla&3+I#XcqnvzyCY7z$WfM>Di9nRuT=WM2;!MKmJ2a{$Wp;<0=_l^zq9-GymS$QjbE zH!_cJ%nYf04@iz-!IspNcQrgdp9I8eaiVjaQn6{UeMNY^HS_o16p>H3eavDLd!u#I zvxD8TYFXvCq7kBh(Wpa-bo>KRo)i)zG!VA`!#&{-qMj|0t}11%7-cd*Fx&q8N=A|Y z0RJN92*`vjZ;5yYA7-LF7>*PBl9n&Uz};fuBJ*SM>ADZGxICg_~*Hc$uBXMW;&PSoS{#hb4mXSvp!<=K{D z-}+Zh>r<8z$qnpryxj|Bjp-jqh8$GQziyNA0l%DpyWtkMeU+{2b>nz{`ivD^3|xjy z)P$E{wU~sFnTvRr{sCnnYuKaeB_r5@NqUZusQ?Ovi-FV0U+*2TI7f|4ELQ^b zK&KCrnFAxMySY~=#}2{IMM`8$a}r5gEWWJE6*@Dyc^2Yl>P}QRqh=fVaXo&Py(iSS zA?9qRK~0rp*l#RqzD>e!ZXEU%f+dAw&qEYE2gVRCy4H}P2%C>z`DrcbGI=kwmBf! z`1AhL=73F8--G9Y$#;=pzabk#e2|;@%#jg&z$;6G@J>;D2TnIK_}1;(D|`=u+;)Pr zvCgp<*6i`KHF*AVxKCUeu1fe?V`jY?Tu{jQ<*RzjoG4yE8IVi%_eaD?70Wh`oo-Y| zY=NPE+)4P_n5WZBs#eZ^duoRCAQqIprlBGmq)JP*_}x_%9h3Vwh?TG$0Jzp zSL}-OC07{atTv;!Y*K|+z`0Hb|o%-S@v$qNcjigJBSL6@U@FF`v-B8hUuGhMc z_a^54TCyU>gU~@eu6T2!Q+^K91uF@8%0`~MASLv9nk1u8w~IR(b*B$PT&9#fFFrpf zf(|oxqxJGDNDt#hqGo~(lVn7>l|*Tua!t64Keq~0s&Zkz*omKJ&eh4Mfr?f^4DT-2 zdg7fl72|*NU=pF#=zIvYLFUYFEOW2=J~vW|EBLf~9zf|}2+6Io*=WafXyKOB{LUzr zV~Yv(l1_m3`Sq4`6V)kSGyjm=@~Hd^q{Y!7jye7k`#h1btsrHSsQ#&wOmYk`sP^LK z)<8)gx6cC1s40PCrPcew$%12eV3+K_6v?@hu9PKypJqEFv6cW)-3v^antp}K)&)yE z^4%ceTjoGQ3qhlsYgkSP^S3ZT-|NRplCI6oeSzHoX9&x@s}8bNFC@b zsdt85iYk4W&66h4nZ_#}>1mb&2d7x~jGV-#nSu;Mzz$5l=S^2$Z^A(StKGHin!jl^ zG8`Z#Qblr~BMWSy676`d+_F(t736%(2CVH_g_g6`79RV(i}kZ>hz`x3^CVW=Ys>Ak z?U54FVgqwZx0L!v<%1z9x9`X7qH2ZpI^T{UMizr~%3Bt<=8j~evxG0~)7+Kh*TK!H zL0}|n7Ce(><%=%yU00Q#;p>0h-JD^HK|dZUJViWXAb58J94PDSoi7D7XIBb}t$1F(KlxzC`m>lknsSVB4KJYVNHe6voejDZ#M-7ajg=q-RwkZ^Z0#~V|D^G=ma}?6j zKJdNGGj_|S2X1aH5Hd9ITsa*-b)8CLM5m|Jm%?P^kQ?Flot+z{yyll1F(Y!}4sclaj%I!lYbea(FjH z9JQlvlx_CX8dW7#>C?}6*?O#-J6Iinyt`z2{_FLY?uDftXZttputC&-u+8&HwzUz{ zl4H;%?PnE&#EKZRK_Oa{21NHoJwQ+JoLmo<7K$CHD<43vZU;X{1kQSj7)LnbLQ+n- zX{1$g6KMw0EH1`}oi0^u}b{r1)*@!6)=vKG(Cw z(yxJsTCd+lGN%Sw2f8S7-ZyqADZ+Omd=IJv<4Cc9FX#fQgN>fA|0WO23Sc^E1cMWH z<`y$NX#NAAv7c=nXx=emBhI5iygQmvXViT%+?eKu>@$%b+@zln*H&Hm{6JE}{hQ*6 zUdb@>TSMeOoB-3087$v>5{v@O_K)N|=IVP`N=>G7#P3R#6=LSzZc3x}6CU%u#MwMy z$%8q1KKa_Ok?IZ82#RWI6F~5)|1+hrs1K7DsFK0C&)CV0`{_=Pb%{$QHNZbD#N{8B zGJKLwO6V5?syR=Z33tuuo_|;tvpKB!Dcypwg&{FSJEAKMgCWXTvSbrq7H4%Iqp6_$ zwSyzQFmrNh{4%JoVxxl}zv4(pLj0FOODrCTm zF|A%$LRHP*9# z;WF{y;dsceom&Z0g60$Sn4Ug=m~V@{glHG~O}TdIYT=hrtY_+a5k7p)4AP9lo#Y{FTubFJaLlGh21S;l_F%+m}SJse(^YzVZ@)eN=SF=cYhydod682q{N@Vh66F9Hk z#8_txhfl=h4cmVFc``dT{CtI6FG))h$kulOC{&KKiARcR{q@-k4{qOCUxsBg*mkW*C^lCJB=k+dcIOJ`XVy#1T19)UIS zRWyNd{PT3O1L$J(g{0FcqN7Xsb&fRspL}jOym&Oc3UAF4$1@$ZL%gwEVBCHZYQt4{ z?~)vi?Mo6BY7GkRH^FF5#!;#3dvkOvvJ=eA{xC!(4oNUq-r-G{r#w;)mxEFkd0eTP z%jw}8L+!LhQR>-zK|`hH%DnTb!pe)Ii_O{?eyWTtK(uUwv$a;gwbh3vRe$(2zvBn7 z^Eey9EIMUkVrpPE;tm~d3d#G&1HD(@)SnHOL)#0&%3P$?_Uz71GnigH4rt6%BDrds zSnbJk=Jie!xuOV5YmbA4lRbijBOZC**ckqbGCDo$Pkj$ccIQgq7OrsRf^t2W=ECbNy z>xAhwLtNZ&z3h^);J66!cqSugnI!HqP-1uB0LAf64p&HKWI|1wBY-^d^=+L9dciK@ z7on}|Pn)z5DIC4(F}{LT-m_-S@?X3kr%!eBx|fZtcSSVL+9)jj)xX2;jgecT&|8uX z+9bT|`31a4C^Inz6*2i#&cquq2B!kg5J%|D$~MZp4G*bNt=}E z1Cf1m?D3!thmPJlL2+$<|5VtuN}$={?<42N{?Vzh28bk(Jp#OE_nO1pZTNag`|jJ> zx4p*og~Q2Z89lP9*j|eCifXfP?r}$D;MA@-aDMJy6+6NtFl}?@!LnkquccG)q&DFr z^R)P4^L=#bRLeu<7jFK=>qh{tfXC7` zbPGkbVM1r`Fig82Gb9CEqDGp8J}CM_IXPrXYoWOLWwY3WYU~S6i>2#(c{BgAylhNn zt9k$H)a*U|-6v_BHu83K6%Q|{jh`t=)Sqvb;ZKMa1bw!LUsRLh%Bz@rE!mO%nI*w6 zm_!pvjegxaGre-2{PD_Kn-%DY1#(pkx<$Wd96k+#iaZ~Y!?r7;myFJj7a8+EciAw~ z`ky=96s+pnl~~>`nSO6={;7_sF0J1uB`2aib|hO;pq^Duj!Ht9sRV5n4{*>0)!2!*XG1|A@M4}SpXHUc z#2S7ja`&Fu5s85PN^}+tE9GJ02W_k~I9>>f5wpFZ2k%vEt8?-SlQjy1Xy6667+6q~i$F={x!}sp1-PeM?7wAoEse5gJ~2W|Fs-7(nPuSBSS1*_K^H`a6l^MZFV3Cp*+q06bD4=oHP zJirUcpnSNT95sF^mda=(I9%=9?SJq7-@$k@bRlQ;l-;sW@g$bKQ%Ha^E9_zRgq!YI?DE@qk>Et9=yLym%QG!XdO zQxBy9DHy`SME+!Hp@2)u92Iibog#$Ez|f0?3?WPnN1au4l-$cK&J4jue#yf_bn1Q9 z_~so3QcWYM(;u*v3=@6m`1vi{x1iLr9H^szIjB6zhh?;@X=Ue?z16R+X;uloh_Srg zo{x5La_F|lECmW2eXb|h=-^a+AQ~Dui$=7Ik(1-+r|1O8Mi+RtbBDys0>AtD7qQ3M zX&_+S&WL>6C=ZZQl8B>~1qihU;6$Qt~+hoWt zy{QHabu_$jQ!XPGgmc;}r9KlqO*{{LnziUrc?J~@hY(N|Y}W!l-U5VgjPDHb&7ENZ ze{LqKSG4r*2g%1J`)TL8x>Jk201YC0E+{!83RPbvlesT~>Wd9|s)yAZSQlY;UqwKI z{x7atm9B{Q_kUir$HU@X7d*U*`v;ABQgGjQ#0fi4rh+Y`XuY_8^C<9?(;Twz=a%`3 z-tr+8UQEyA8j_`%He!@;5wyu2C&+jBhFpgAt(6OpsiZ)7gX;{I_k;&E0w+fWoGFo0 zZpVoWc+hwJn6Bx5WWra3hNK>NCNQIz;IiSA_*3=VLc`%R|C)$n2; z%ER`Hox91#f6Y*2W7Lyzqa*{B8P`$C5)~1e;2Q9d{K*(pg`Jc`{h1BHWM?RXz_H?t z1;;(=to9n#nlD&?J-$P<0CG8d^(Fnu$a1{&t5|Z~){!4T0A#<0Diz-Sa;`}C$&>@i zHGUlU9SqNH%G{={{hT`9ybxP=X&D8@B6r|HTHU!i^`_D{uqc6L#g2&DaZdMZ_33=qpq}BtqDO6{W2{r0j%TP4^HTYB!RW;IWdS2GovhRVJ4~%MlDD~B1 z5y)S8-H&E=#Ka@&0NdYjbS1Dp6S|Q7)wW+L7i#Nu`Y16o(rnw#ai?ldyJ|k2mt(8~KnGCJ4 zOkQC&dH?IyZALf=9h&PHgPDJsu`%asZ<&34>n{O(Y(qjQV4+jBt{VlGHQr+>+}9_% z=nEn1fD*~BUQSNY)sVIJ{R0CfbFY74w7(NgI0C5kr;gN7D=Ug)Nr!rObo>5cJ9OG2 zn-c{$t)L~>RIZV%Lzy-c2Z3u%omK{ozjfn|heGU{THBT7tB5f4AXQ>>>(^A>`eq`2 zXr<)-M&BS6z_v@*(Y^%@Qv+&wJSL(NU28P@u4}KGu=vm9WD7_KV^Y1Qi(LMCJ@e@t zO-F*@f#70w2N69u*#CW>fLW^xXI<}}`44C6L*!VUI;ZRcR#T8`$Az&|0om_Kv2JC{ zUW6F&O+y#yQ79?5z02wL7S5x<#?_F7)ZBmR<7uTT0N+>2^@H@_p8!KIL*{~t2>bc9 zc*TAX1>cYDpY^auW{x^bv{wOdU6p(wwbkOuWhUXmxxU0Dq_o`8p0L!A^!7MO9^to6sg+q-q<6_2@ zoU~2`fXW`eMp%4ah%oT#p}srNim|2W&v*S@XyDOPL0p3-0@(&NlGHPKxuX$8d13vSKZ}@(b8?c(rSOI8Pg}eXj(2rD5gPp1LBlS>97SU+V#AsY=`Kck3T{EDzrJxqz&)3 z9whILc?T)9>=N2*ust6tCnL0pFNJ;cI2@!qS_!xoc=xw#LyuYUm z7#Q=ca>R*=inomovYjO5k^I8VeS)WT};ZV1#>0>Tw?^07UlxiCiCsnm2H{cUI}Y_i0Jt5g9<~o z@Nmf+o1?qjReyf?{RG5BkfCb=gFWqnvnce$CKmC6KZ@80W%YjcOGL>a@zWF*?r&2% zfch-8nqfWr1P-W|9DCh3>wj27R+;{^*zsEqyZvgx#bj4hIpW|MtRqz;w@_`&#G2r# zSN3hqcA@~p$~U`EJ0V(`g3Y8?r9nZj8eTfSDA?+3voBcvrxjSQv%QcSPk2My$fXr% zT~D4msk2pjy3rt3%#RrHL&)c!Ki6GFVP$<`Bijpa`J;cn0OFH$(AgMgVBrh6aj0iv z;9XPMg_xd&zpoWEPNtla`_Z?4w+bsig_dz7CFJ8aPPY2eJ#1rsLOoQvKsI8sn6_|9 zwIg=lWHv2>?QZe;x_chms)no?X*!PlVu10%;k z_vbmoOL|9fL(>(6ke+gT*!U;=a3ls5Kv}JRxp}lD@Ze5-4BLYi-W~Iek1C0|5coZh zH=PL+UFK^^hmU4-N2mm^-nhTMEm|9WE?IkBY>%}H`vRobR}lX$b+zkjXrsk0Pftc_ zl3g-tRkGenxG#OH+&O}c#tNugkr#-7W?q#TzRXzv#bD`PDpA}f*2?o?Vp_Y?$$M&5 z)(5JMG9g*Sj5Ff3ajJCuM2@c9@OYvs!{mDuKg{=*QfTr@jf>^XsqOTN4KrPEaM@k@ z`71YrJrs~UHeG6fi@3?;9%(A8GxD}6#ZdiCraLzk?;Og%c%rFSI$+ye5FmXGw zE?eTC-t(>rB3dzA zWEb~{eXP2;tFAnP+W2Ij4J7K<6&g6$%eZq%FHiWz2O@TB!|TV&UWR_1O#fpj^vhYctlGKDWBhT^v??MQ6?gKNra=R*i_MHvFYfD3(*A@ZSESMI+ zvj#l)X>)Y2VgwgksT^j?&g$`PYQb1iOxoZaku`a>kBv)1(vUSb{j_zm^vRLO5@m$g z37y@&#Jk$I0otgJLJm*>+L3tJAtoP0bD@eF*R2nmp2M(8XLhRK1MF|ksfPw8A!Rw1OQ z^8#V#*1x)TK95xXMk5EMf!$D_8TlbPGAJc9dCW;LJ(hFdEj%Jch~RA1M2T6jRv>Z( zj)4gZbLs75?bIhg`r{~e0OyOL>ZA$zk0}DaQ|jqV-MW6~B-R*b{i(9=CbqGNhj)<48|4eBrR7;Km znaC!CNRV_FjJ8YHcUHDv0+iu#?7Ux^%v=>f`^dL8PN1jJoMt^{$5kgxJLk$Lhjghq zB_5u1eFH=a1%CKZh){?YX2yaM#AF&%f{eXnbB2CqL}t}Es>zc-nbB3BzlGt*z!fro zHvgCMAeUfCY3J0S6D-){Dc^BpAOz;Rax$s)pfI^lc_=f)e{C3K%-iNU_~*Ue4F6w--|b#6J)bw~LX1+43yhrFUu}fuLUfam;$v`qd@;YIm0R=h;+UtCgGYpc63kagNosVN#|8cLV=M#CXK{q}bcN*NUrOUWc>F#3o7aYXl(-FONc(yw(z7MP|v z%B(O&aY5LWxq|7B&!WIeHH@_itgLUyf0kpVH{+(Z?8&uy5!dWQCyPW)OHZL7xLY%?+X~gw;vyR-TdCZ)cn$$tcQuGS z*Lx2#Ert~Y*QPMtYgLA$fUdsG{VwNq*L2&dU+1vxEu~j$@&6OoEGW}ND;GJ{r&B7O zQrS_dH0Ljsmu-IxvZ-jb{JcuO+7wO%b*G818ek^yGA3BsR8NydEtZWeKbbRowDU4Ens4uZ zQ5>PoAzqF|)A@qWP~us3GouWtQ#Phg>%bWC8-&#H8NZ?W{7;sVj%t_W;?vQmJ#apw zao__!!whhEl^ouIE3{w$6UGtr|Nq`j+nlfe&-C?gI%RQR<|lrcCH{~G(`oXF%onpc z-r<{D+oONoflM#x_jtVU9>E?DjSREy0Suu0G1ydR)D3Q(t<)dgZ0nn!1tekze3I#D zS8Ig}iw_NojA|0%D3OUHFAgBbWGWRBAf#ekOI+T|^qFq&=oWe$cv%_1R3SP6$(Mftke9qZH!jJAKpol>C>CM>lEuvo zMJRRri72NY4FKjsh72Va#|%&sETltyvKYmeVewpk;r^V1oa;f0i#+*-S?QabfA11~ z75UmuO;QE53+X(JJ46pQE4T1u|MIou3OTBBh14y}UOvSt?Y z2X%}lG(zBduEr{7Ui*G(uThkomOfQ&snb)f*Mc~lM$kuM5Rfd?Gzy;K$AOR=YC@4( zy)+W?gTz4~S^{7kQ16NXvEz|11XMO$)zx95P567*9^Z2c&bOJ~V)kTWE{{P85; zaqi2^@N|YmMM%oEhw{TM#Aguw5`@G8$$cf3d{ezNk_pK7m`+E&u-Zu}IZ{v~jv~Mi zXJQMb3nit8_`rh%jFCbSoC1dD0*!wd4#!z7On{Fk6C{UJxQE9!>SyMX$o{G(NWGxN zn#sNtD>gqtmn0?}tIw4VRqSvv2t}&&iq0k`*+Fvh#Ue{ih`HPw~A39~5-xIhB8WEdn=? zaHhYKSQehag(OkKY)+W6PmPgmj?+uBbiU=tKhzMFjbI)#4rcIL^Gg~<$m4(rEsLo& zHHGYwNXHTedUZO#_xF^F;J_9cKLTg2&i94f37b1%>pALTQ=}rN+qQ74FDp4^@A}Fz zHdfd(N_l_QQtfN#ocEpczH@)xze`Kv@%U&v=Y6*@`gGoJ>As)H({{&eDNpO-bM9^o zxEllR#(=vq;8f^4r9!(K1MbFvyD{Ky3^-h+JyUtW4v*OrdZI9{BtB%8lC7QJmT#Ug2C~TOvO|7i?M%=bekuz=cGK< zQ(%{sr;0j#P|HB_U=q=}^zY_?P5>p(mAi?LVDMOjf7h&=wH@-l>fwO5Dvw3B!tIWR zUhIsv^Jkx3238u$>PKJYlo;;l%Vq7j*Y`#4syKgHlQdY$k|V_mud$D!LmC8-qX-5E zG$ww>8-q-O0AfIDOgBllC(M_@WrET1ha`xpz}(uCF& zvWnP<)6;%zQh_wIeW#|NCbI>bs4ZoI^cSOK;|$*D!#$ZZM~SE<0?6#TF<*|%lipeq6-H*M zHRXshr4S-zDI|ujMNx7KN*y3b%c={z@*s>g4^^NR_N{-NWR)vEf;Y*nvB8}&8CT~R z(wN~cK#994UtVlBC7yhTcy-(wE7_9NUM)@UGu|R5Skh&G3XL%ci-2Eg|E7U0VTJm- z?=MVUQ&jnORqUF_s*yMh-QpS(ZwMq+cxhv6x{pDl+8M(hXke&^q1n9HYDxq84)Fs7 zJxbmX9(8|=0hMpVE_g~NaEz)pV#g@ntMJK>U`eQ_0v)Ch8q4PZ$rt%##>w|n_wqNu z@kC$Kmt|*Ag%wyJ4#o%(q5k->hx}n06hMbQkl`+}zzDMXB^e`+&V?Fq4RHX+0eV#T z@EaI;)B3I~Vs{%=I-3f{c?3DEy1&#morY|tqf>vQCg<@nx9z6fm+uh&r~;R)V!A1| zQo-N^H_Mf=;bgfAz4Edmxy_s`Pls+biDi=neo>5~6-%kylFi?v^x9@C>N@(0pIkPB z;ov}U$s-iN#W@nIQ|#13N*E$6X3|sr116{RM&`8L91I8P1WQM>3&9t(-`Ht{4(WW3 z`Qd*I1_2^dB-_=gZ-;}oG`jj-MXbqull6o1IlV&fWssJ%ynb~MA@onpyW=U5^I84& z1W!1fOsZe*Glu5lU{U?{3{7GbRKL4`VGTLI#q+;o$g5wTM%Y6qnDI|EWQ8JXjPD@3 zfb$TOX?FQ8-^L*fut#g!M-juYW-2~KkW7DTs6Gr}TqGzNY811Y;e4dg4Vu<=co9eA z8baSMLKOKCzOJKZMm-upUi13X?3}6m7A5s8?R2Eh-neQj4ku4$`7#f!VdFS=z}h>gG3Nn~Hxq zhSZ{Bfz7q4S;c@`)X&R=78P^CtwlXk(6p&$GVM0?OqSj4Doze#RNQi|g$OoeRw57M zj<$_;fB9YKhkQfk#i%Lk#yiB%Ao1y(AjaNCbgtCB&e}j#W3^|x(IVt@an$n4! zV8&NT*O=9}PmJ{CYsq74i6qN{-{G}~T$l1 zG1D8k)I>j=0hQKARk(u=UT>M(n|;jp(x4s~&)IE?=puGbl9-`8*GXEa<2%oEfe(=D zTtBJp;~Yv;>X+n6mT5siOrsdLPh!Z0nb9^~i>D7|7}481GqCTgaRO%rz9U_Jv7 z%*8~>yfPHfNC$OE7&PNF48_Y_3b!<4QBUkF_suMi$D85_w>)0#7OSj%z^%^KY3BmF z(xjDDiu<4wRm-xvh%DxtAGQFhBmO*~YeXg0@qx+fS4|;Xq(H$0t)hP;sQT;H5mYbh z*AdduSm+3vrX@PUT$EBdx@M38FMwFA>5$%_RCSP!D_~!xdUFbdQy?C&0`a;jj>ZY4 zS8>=i7-Uj=wd-W9*^};_8XM{j15c!O!tivcFd+kodruwLbzIkR-5m^JPW(34#A=*2*VIxzn=9SGVRPl$^Vj0|EI4bPGG%|Wjzh^h-!LztH_|3^ zLZz`rhdQW+r-`n7u49g>mL2~jhGY~I+#w>Ae8YUS$NcWUi+2|kcC)Am>*>G4s= zJfrLN9b%cU~k%-!|;o;BY%CCHDJlTWnT@vySnkNOgtIc5;LbsS^|hM znb1h(I|6V_W3GPTHBjlUgyQAHacrJ!Q84Tp#7Pa}Fb}&Igklt#62* zf1p>gys37IBK=Zw{&MVe{X!8^c>H~+wv?EZbL4RvRdj!U0vZ23^u@O=kP$#OGar4I zH*7=5#oj*6$(4;~EibT|->yZqWWHO+&M8e#+ZM8~WOGYRfAO}Rn5(#5z#e0@TBQX` zS7~b!D^_6JHq2FMb?2{gLv%s5|&JDm_*7Y*F()DFt^qLCNIYK7@?q?)$QX0=>F zy)din5Z_%ye9bye zv0Yp1(MGTRg{G<+khS&Gq^Mqr&c}fj%5<+`@Ron2`diTtQf3ES$K5t309u3%Y|!)D zEB8*L|Ir$KJM*#A+MU+!wD!BBwLcJi_@XK3f^>P__c*>rYPP%T=%sd6J1+n7^_ldk z*-)*0BJ%3TF`3ZisIf#!qnCMIKOJ=UsyVO$m1TlWRH@-4)32oCIn+n#$`@ULI9WYd zs7!w~Wa_dDICQz(Nxp9FS9r@e6t$XRRZ(djgT2>+xhIL%_g<-A$nO=9Dh0{VW#ksi z$9#Qr8{$G3SW)e>j?gEeqA4SDFOCW37zU>S@~22YdvhBik0bvGF3!*mjQqm$L~NUN z&QKUY5BX|}_NOSNC3#b9O_lr&E#!oeI0%2fx44jy7tQ9Z*ofD3TGtyEF#jQ1Bh&I{ z=-Nc#i*;xQw}~EGSX6Dht5`8zn=qE69au~Evu*Ko!?(lr`PJX8cEX5kNUdT3tGntv ztXn|4yG@}>6v9ceL9FJIS=H2PSW`VYz|&*GEzxD6{|10*Hr^FdmPc!iDvN~XoZx?H zB+Zp{0-!>Yzp&(NNWn}G5->(G>VO}?8vr{ju_D=yW!lQmYMV;irmX7GQMGJYP9=a?}}iPUt5TVIERBh12>3$ZT&`5}!7 zAMEXHcUKatTePyO7io0JxxngQHwE;NZ0RkGgU-%VSp%yv`7!1bi~@h-0Q0xv4?AA3 zx^7_frFJ{=`*e)9%wAKLa(a+ZlAPMh09!KzCZgaXHNfWXGC98Q_`VI_FRg#_(ri|h zu$WK5@gEa1e!1BcZbWYEN(;6re>j6=it_F} zrwB#I{$OvgwS6@DjndEW{<(ks=ePg-`x?FfA0EEj-DlD7|8?MfzI}i2_I&$2dqdw{ z+(sWxu7CR>Waya`~)#Me>INbP))YMQdl;#Zh(ED_dTF+H8`3MRB8iu|1Z?KKX=SvmpDjhJiXEq{V&6TwjKMFrnt}#t{%D*A8t!GQ zpqt7T+W;QZ6Clktr{GRF>g9Z;hRF3Ev((RwWi;nT(#?Yxtjd5;76M*YDlsau5P9;< zF+G=2+UFxhT(v9C5<7nseN8G{QF?Yh5lx=KqNj4nC8fguL?6E&!Vr3xFOnJ4j}`5y zp-_tb+^dxTSG-Gy+%_Nlk8=5F>nu^4tFi}c?aZ}kzrD*q-6vU-BZaZjeu(dd{Z#Z2 zKfN3Z+$mu081}~?wC%vSU1`k9?UVety`Fk))&}U zp}S(r-AQ^uT91DkBgjc1LT@TKT?;`i>aTV<^ek)0QZUP068+tLH^*UnD5Pk}JCBMd z`Yha?3pvTv_GWwicFe!CvF{ia_P!0y;LX8;BmG-mnECG*2AD7Q{lBuOG9MU+L5F(p zA^U)dek6w7(x8&7UuCn%52!`UC4yVancO6-8f&FE#rJ=ABoFQEVW%;2mt1~{q4fw! zzWtW2Err+EeASmbcW~zp?%cthJGgTPXPR>74tD^Z zy=aW-r{IFTkW_n{qzx#`wX~vjL$B~5X>8UOj{;pD47@myX=w#eN{$u) z?W&h`m=UJ6kA9Y$X80+S5AvHFHb1F8bg2YDo?}_@&c%kUXGr&-m%#btvq7Y z{8$yueG8i!xyiMzP%#m9(MjYAuqmomh}9KAbE#Q5oz{Hm_H~mbWL>kgV(n|@SM=la zcHLbXhb}qeTIo)E*2qt}@0fM}1MWQL#%haf3<{UueT>p$M|c0xAr^Q4@#nMAmrDaJ z>A-(oK|mGp-Fa!Dr8W!|j`4A|KdJXWo*xJ=gOt@heEtNm;dKxz5nl76^+)>vlV0;rtkF!LUi5X`<82nod&K zi-{2>PqTD}xXi1R82p&aU+fs6-JSTlXzPWSHuk#{e63Gpm2a&2TRE$$uurXwTS+6< zwxoq!*%QlFADG?a)#lRpPOC@W?+|nUS%rb4<|fH%q4q#@|Q8Z)kM&QM~Jfn2iQ10P|Du#8-mfD7O^p8f6=RZn@$1 z05?y41Ew`e%9%FA1AT}`R2lU*^^t$zvur^;z^`&04UA>4 z_vHOv_uEYYq4XU6fg)CQ-?z=u*KOFRQHLSUeJI_4?Y7Xx8+Jxb2c5S^Ho_&z(+d>l zHj3UH*ZLha^+1lpKCOLD)v#AJYSv0wF|IAQo+GBM-OguBca$HEn!=x)A?SarT%es; zQCfXPhvR*nBa|-}(rK6dc^R9dusCzbD9FcyORi5tF_>Q%V4}=pH4!;p*uoPyTmEHJ zTkf6BNkWpDOXtX@KI-vinob+sHY;{YQ|tWJn*5d;U2}G0^=%&Z-QZU{O>s1&M!)FF z^F>`t*eMylhy9I1>acP2N01*aDs^~vTn;Z{6e_8rN8SeB|6F$Sk-2q0te z9Fr-)9Na*bo(QND=5av1t8yqS1vfV?$t5|S0H}Y1E3^=JBvc8={h>UKhN^E*^r3qd zg(fs6KA;46Gl<)^@`164Ha@WFA=YCjl!H0s-b@x3kELMM!xPUu7z8K+H;`}!I0cBX zIMR9Y&@J?Mu+Uxo9V34xW1$!WLAS_@Ir7!CFTjW2&o7jdm};SdF3bS>JBESiEKNZr z*2y9EH!jI%%xCIo3Nzi(nDSYH1~IWT!c$COkPhfluRcfS$7u5nry${pw{0jW5M#q9T8uOi&~^@!|22`1A`v zC*U1q;2H)oVsbTHlB^iRQvwC}8G>=lbu&Q#D4(H7eJ8|G#MB2A-9KS8jy&|Mj~K^9 z8cc_mgizw4p{l@!0C8{QsZ-$A3|bnIp62e$HL^pvvgAbMQWd5a9U>?cJ`U8<4*iWN#5Vgkc=^@-#wo9MAQG4^m1F_O^zD zQ_T#@86Ad$$`i+vT^=ldOhU>JYGx|qv#FecrJOb@j~6LMFdK>q3qEG4$}k7NlcQK zW%M953Ke$92~{Tq2lg;X8J$1fMzh7>b?9? zv4}$5fO_(+P!h^-Ph`l8t?kip@HQr%W+b^nl7CI*q>dJ8ogN$B(eci}a3$}vXY@t@XJh2S!Qxzkx=&Zsl=Y`vrv%FV*ZTms4Z7ICA zBhhA3G&^teAtifnYc@0(e21!9P}t0kDLLBqln5D{eza7xx{0p^R>zcDLb|pci59f2 zt0hvs+v3XPWsCKciB`+c`@40{v_w#Mn)s>#W&$r`f~8G=RaMc@8d@3Y4Go~fwn=8H z?Jh{wns!G1ycW{B+f-p`ohYtCEo$#kr}U$?^$b;N^{B3n89Qd&Co|SYqL#b(VKecE zcB=TIDdO-sf{`~9Y^Bq|Vp_e!*`mDm1jl$oUPF+PmxdtR0b@!78LyvBPbj^L!=cXq2q!03LW++0*S!Qy2bV)AB$4?h;_JBOCv^kGd2U+Fw$V&o2`U%oN#pM>C z%japyjSq$MLF3@*k{li%0X~C7A1NA#YkEe0@v#4Yi#jSA8jYUmIgpKtbp}=WOQKBa ziC-;BH235|iQbL19WBmd#?7O}@|4t`EXq+2fxg)+$Mq)+0(z6U@&B0}w~5M+4`$B9gvOuaYg-Q#zYX zj4$yZHLmg8KmLr}VBfq6eY>&ij_%vb1B z4=jz^GPFgBrbMSx5z8UhU|D&o>cB=)zd@pZ&SOoU>H^dKY=QXW?oiZh_c9i$FKB~| zK9LJN&*Cw>fl;vNChc`qt1#TU)5jNg>19*AY4r);Azm4wq=g{TO{_x-b&a}|Bdl)` zl#REQ{7I-Wuf3(N{4&tevJ_++;7r#gaS#AZGVgvZv}7~byqlm*kg4;(D6nBj!Z}=j zNXP#%0?_l~2y!IamH9kG<7^0GhN@u);1o;|Pb*#$l)aOp)d@}~I3Kv+w2k<*QoJV@ z?rH7ep4!KUbTOW4n{Y9n>c%W_NW?y0vGK$&2+I%+UTmt3xiIQ7n z7jBgo_@POn*G(xGsxy6emquno>$VW3owYX=<>>5PKousTosh~=W*U#uHus~fUxul$|@%!RyEGR4T=!(=sbi%yBMbacX=9aU}at*fC-?HuiUjFVW zc$W@YK%8V&kC0?E+V+(`E)#BJwrh{dI@_a?Z`-oFA7W=~YoRKA^Yr>`;<@&{b_KL( zzrCHNZfUK_dS&dGA7b#bpNcA1sPYzSyM~Lq&6&OP>kw_OhCQ z$*ST_@^!0XO>bNhsXJh$0LhyNAVO-KV63l*#DwEH0$9*7fgTdLA1Yw)QNPESvJNBK zW5m)jskjPIE@6WK-{RnZ4|#1yBbT>0_<)J|^B|50&widz@5+2_beugrLkvaN=m@iM z93^p{TB4t<>$Y;ENL7dW$tXKi)zjCZW_i{+G?IMH$1U`>n-YK|7~wF$h;Z>J?wC8T zs-+dfkxR{Ap8(Sv6fGBh6*Tl`gR2>#MHt&kx=ah44><%L%kgL-$E zwK}NR4`+SRl;q_z#JqDbCSAFXmu6v?wn2;u-`(ji0+a5#KSr93rA73mgo>`Qmo{`x z6@8Cs2ryT9VHk)B$3ZR|3ydOsjhGQg2@)SnkqRXwxoehxU(BOqf_+3h1bh_o*@g?$ zX%V@iTd>vJW-#wQKvH6tJbM52bY6ZN>!f120OUfwS=k+;7OVwGw<#` zhJKPmQb(eH9VYfGl~Xc8kWtc~dC4KNJC?XkH&C40^s$BgCzlAQGg`c(?B-=%V76qN zg%p!=%0Fv{Bdc2<-l=;xO$iN-yx8|h<1XY@4h=A_H=R+ea?VF!;FfGvn8Z?FB%v~3C9@(9VeP|{rJ zpu~fP5|4~?j5asxu0$`0C(koF@eNtCf@?elPoAakmnk2zP(PwLXVk6lU>N@Wx=fG&)}Dt_&Tq5NteAa4S_1+|1S>=E`S z4|oVJnoeC8goq5V?XoU-iysoV<9LTq*2 zUrIld4_G5ylXeS?Hf@JQ79!KL)`l`{i)#PgHeds;b=fnM>sy)C8`Tw8B0W|urTOAwnY8Rf38a8UTM&-rxMH)gD=@QNhANW%^@Debi{1at=-W(GWO=8v` zhWW8G%=7zMf5+PhFG#$qrr2!k;@&zsJyMlZ7w5GZk!~E9Ex@=VRh`&u`Pv0i#b+BS zb;9}{MFGg`4|t%~10jg|m~0=DeKwNgSXKADLjHHb0b|w{%u0MzLFhMKm|z@t#cZpv zn*|I1(1!A54e53vQ^TWwWRK+(vg)2nMO7xAB3!_DIQ03R@mR&d ziK1Bd2Z&>soq`x3-#ksDvRbqC!Qb9rA~+R=pHbE(3@YGT`mD(CjGC;}@mI@(Dk^e* z$3*;2Bz9C98{}OW^Bj;V1VPciaq86Kcy#>=nix|)D20S8{@53P+}C;drJ~}4)8>2l z6D;CP)i6enm8(FSldlZ=CN%-Qr+!Ha{M)#>hF4R2r1JV2@Q3rN@g;+>dD2$j=f@Fq zyi(LBz(Gx1NV`J=j-F-{kD^ z3D}yOpMY+|JPp@T0n(AjNJgS!1mOMePiytIx>>3YjnN zNVgWk*ydix;os|huGm5s0}5PH=tI`b40wfIkq0;YcoDF_NV;1T{jy1FqIC=^(WI9Y>eAy5RqZK8x>5l19rQ!r(B z5Zp+6Hxc-M+LqRiq3H>Y$WKA#H-kJ$>PjmuP$GCq*YcdBr_BRLiku&Q>KAZn$pRN} z*&hG=0#{=eG&fhV7jSv6`jz9}rCcc%yp)OX(x&FiZaMCq8@(h7>Av@_(c4=P#jIg7 zy)Uz`^2VFQWZ)6#&kv7JW(U$gcVifYFug`%AFLIBC|V>ijeHR2%MZL=dG(>U>z$sD zsD)jUpX2DOI7mG;LzTA642E78I+6p&ikvD=>!TtrU?~nt0Iod7B}6w~;|hjdyf3|+ zCt5WGIoW@#JG*!iBZqV19vxx#j^y*v#NyC-krR9VO0>wzTb;m<2CeGoGA zrZ~J;!AC&Oqa@;e8$JSZ2H`s}FaLO%!X#QG;ul}pGzZqT=TaO&Q?qC>jJ%dkI++JB zyiJGEk&g*nX44f3kMCx8^M8M$!{tx^zmw$laGKy*wwwfaGjMlAc7B^qlV!U$t&Eg^ z_HD6Ld_T=z%*6*aeN+DJb>1TmTdT%ToTIHC!R9*=^k=**C-(c(S}oD;iX>KXZ~Y;| z_U>E2&V!xOY|?Du@o>^aI+|Vv^)kp(2FaDpGVMQFQ~#MZ(;ptZYE7-q3xPJvt*${) zT>|*=*aQn|FSysh!TM&p9Eo-8@-obSGF=AbaRc6=QM6VIppOHdgAKeTjN@HV%P2PC z>{jr{TfO&Q{(I!;*RA>BY*eZF;AwfWxsQ@fDO~drX=k?a*E&sZD|RB!CTwM5jzb1! zl`Qgs2joF$tgad-kUKO*j!k2BT(PLAo7}rbW2pcmz>u&(hEs5x7jSP&2HoQ#bBneP h1?#<^eO9C+>3z8Wl3vMv{~rJV|Nl$Ks5N?Z1pr*ScEkVx diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 3c523b7e1d23cf55fb0ed576e0de43c1c06948b7..a5ee333336c36b8f2c70aec147d319b4939b67be 100644 GIT binary patch delta 4012 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 S+y4as0RR88+CFb>@c;nC?DAOv delta 4012 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 SxBm+O0RR7!RnoF;@c;mei|xe# diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index a52ea990c9be4efcd3279e63df26b0f1b61aa772..f26d842fa9dd7380b3e7ccfc63a9d6416afc2af1 100644 GIT binary patch delta 21 dcmdm-vpHu%C*$#rT? Date: Fri, 22 Jul 2022 13:28:40 +0200 Subject: [PATCH 05/19] Update CHANGELOG.md Updates CHANGELOG.md with the two new PRs 9044 and 9055 --- CHANGELOG.md | 577 ++++++++++----------------------------------------- 1 file changed, 108 insertions(+), 469 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f11ddd583..8bd084505 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,479 +1,119 @@ # Lotus changelog +# v1.17.0-rc4 / 2022-07-22 -# v1.17.0-rc3 / 2022-07-13 +This is the fourth release candidate of the OPTIONAL release 1.17.0. This feature release introduces a lot of new sealing and scheduler improvements, and many other functionalities and bug fixes. -This is the third release candidate of the OPTIONAL release 1.17.0. +## New features -Note that: due to circumstances, we have decided to reset the code freeze to the latest master for this release and restart the testing flow. This also means we are skipping the feature release of June, and have everthing in the July feature release. +- feat: worker: lotus-worker run --no-default ([filecoin-project/lotus#8672](https://github.com/filecoin-project/lotus/pull/8672)) + - Makes it very easy to spin up workers that make the compute tasks opt-in, instead of the default opt-out. Also makes it very easy to create storage-only workers. [Link to the documentation](https://lotus.filecoin.io/storage-providers/seal-workers/seal-workers/#run-the-worker) +- feat: sched: Per worker concurrent task count limits ([filecoin-project/lotus#8725](https://github.com/filecoin-project/lotus/pull/8725)) + - Set the maximum number of tasks running it parallel on workers by exporting env-variables: `[short task type]_[sector size]_MAX_CONCURRENT=[limit]`. [Link to documentation](https://lotus.filecoin.io/storage-providers/seal-workers/seal-workers/#limit-tasks-run-in-parallel) +- feat: sched: Finalize* move selectors ([filecoin-project/lotus#8710](https://github.com/filecoin-project/lotus/pull/8710)) + - Allows you to force all Finalize tasks to run on workers with local access to both long-term storage and the sealing path containing the sector. +- feat: sched: Add scheduler interfaces, configurable assigner ([filecoin-project/lotus#8700](https://github.com/filecoin-project/lotus/pull/8700)) + - Introduce a new simpler worker assigning logic which will attempt to assign tasks to as many workers as possible and ignore worker utilization. [Link to documentation](https://lotus.filecoin.io/storage-providers/advanced-configurations/sealing/#worker-assigning-logic) +- feat: bench: simple sealing operations commands ([filecoin-project/lotus#8373](https://github.com/filecoin-project/lotus/pull/8373)) + - Allows you to only test the performance of a single task. [Read the documentation](https://lotus.filecoin.io/storage-providers/operate/benchmarks/#single-task-benchmark). +- feat: miner cli: sealing data-cid command ([filecoin-project/lotus#8715](https://github.com/filecoin-project/lotus/pull/8715)) + - Makes it possible to compute data CIDs on lotus workers. +- feat: precommits info ([filecoin-project/lotus#8696](https://github.com/filecoin-project/lotus/pull/8696)) + - Check the on-chain precommit info with the `lotus-miner sectors precommits` command. +- feat: dagstore: add dagstore register-shard command ([filecoin-project/lotus#8645](https://github.com/filecoin-project/lotus/pull/8645)) + - If you have broken indexes in your market’s datastore, you can try to recover it by using `lotus-miner dagstore register-shard`. [Link to documentation](https://lotus.filecoin.io/kb/dagstore-register/) +- feat: Implement cli command for compactPartitions ([filecoin-project/lotus#8637](https://github.com/filecoin-project/lotus/pull/8637)) + - Remove dead sectors from partitions and reduce the number of partitions used if possible with the `lotus-miner sectors compact-partitions`command. [Link to documentation](https://lotus.filecoin.io/storage-providers/operate/daily-chores/#compacting-partitions) +- feat: recovery: Config for maximum partition count per message ([filecoin-project/lotus#8986](https://github.com/filecoin-project/lotus/pull/8986) + - Adds config for setting the maximum amount of partitions to declare in a DeclareFaultsRecovered message [Link to documentation](https://lotus.filecoin.io/storage-providers/seal-workers/post-workers/#multiple-partitions) +- feat: wdpost: Config for maximum partition count per message ([filecoin-project/lotus#8982](https://github.com/filecoin-project/lotus/pull/8982)) + - Adds config for setting the maximum amount of partitions to prove in a SubmitWindowPoSt message [Link to documentation](https://lotus.filecoin.io/storage-providers/seal-workers/post-workers/#multiple-partitions) +- feat: sealer: Config for disabling builtin PoSt / PoSt pre-checks ([filecoin-project/lotus#8959](https://github.com/filecoin-project/lotus/pull/8959)) + - Adds the ability to fully disable PoSt tasks on the `lotus-miner` and disabling windowPoSt pre-checks. [Link to documentation](https://lotus.filecoin.io/storage-providers/advanced-configurations/workers/#post-computations) + +## Improvements -Detailed Changelog will be added later! +- feat: wdpost: Ignore faults in lotus-miner proving compute window-post ([filecoin-project/lotus#8737](https://github.com/filecoin-project/lotus/pull/8737)) +- feat: cli: Nicer net stat ([filecoin-project/lotus#8797](https://github.com/filecoin-project/lotus/pull/8797)) +- feat: networking: add healthz and livez endpoints ([filecoin-project/lotus#8692](https://github.com/filecoin-project/lotus/pull/8692)) +- feat: Snap Deals full unseal ([filecoin-project/lotus#8478](https://github.com/filecoin-project/lotus/pull/8478)) +- feat: cli: Hide sector nums in 'proving deadline' by default ([filecoin-project/lotus#8952](https://github.com/filecoin-project/lotus/pull/8952)) +- feat: networking: disconnect cmd ([filecoin-project/lotus#8955](https://github.com/filecoin-project/lotus/pull/8955)) +- feat: dagstore: Add DestroyShard() in dagstore wrapper ([filecoin-project/lotus#9010](https://github.com/filecoin-project/lotus/pull/9010)) -- github.com/filecoin-project/lotus: - - build: merge: release v1.17.0 to master ([filecoin-project/lotus#9017](https://github.com/filecoin-project/lotus/pull/9017)) - - change 1475 bootstrap peer ([filecoin-project/lotus#9008](https://github.com/filecoin-project/lotus/pull/9008)) - - feat: dagstore: Add DestroyShard() in dagstore wrapper ([filecoin-project/lotus#9010](https://github.com/filecoin-project/lotus/pull/9010)) - - build: merge: v1.16.1 to master ([filecoin-project/lotus#9014](https://github.com/filecoin-project/lotus/pull/9014)) - - chore: market: Upgrade to `go-car` `2.4.1` ([filecoin-project/lotus#8985](https://github.com/filecoin-project/lotus/pull/8985)) - - fix: Delegate storage auth on market nodes ([filecoin-project/lotus#8978](https://github.com/filecoin-project/lotus/pull/8978)) - - Docs: readme: use proper hwloc dependency for Fedora ([filecoin-project/lotus#8999](https://github.com/filecoin-project/lotus/pull/8999)) - - chore: stop using the deprecated github.com/libp2p/go-libp2p-yamux (#8998) ([filecoin-project/lotus#8998](https://github.com/filecoin-project/lotus/pull/8998)) - - chore: update and fix libp2p ([filecoin-project/lotus#8996](https://github.com/filecoin-project/lotus/pull/8996)) - - fix incorrect usage of peer.IDFromString (should be peer.Decode) ([filecoin-project/lotus#8993](https://github.com/filecoin-project/lotus/pull/8993)) - - remove mock file - - feat: recovery: Config for maximum partition count per message ([filecoin-project/lotus#8986](https://github.com/filecoin-project/lotus/pull/8986)) - - feat: wdpost: Config for maximum partition count per message ([filecoin-project/lotus#8982](https://github.com/filecoin-project/lotus/pull/8982)) - - deps: update go-fil-markets to v1.23.0 ([filecoin-project/lotus#8976](https://github.com/filecoin-project/lotus/pull/8976)) - - feat: msig cli: Check for existing signers in add-propose ([filecoin-project/lotus#8833](https://github.com/filecoin-project/lotus/pull/8833)) - - feat: shed: migrate-nv16 ([filecoin-project/lotus#8942](https://github.com/filecoin-project/lotus/pull/8942)) - - fix: lotus-stats: actor code string ([filecoin-project/lotus#8977](https://github.com/filecoin-project/lotus/pull/8977)) - - sealer: Config for disabling builtin PoSt / PoSt pre-checks ([filecoin-project/lotus#8959](https://github.com/filecoin-project/lotus/pull/8959)) - - feat: cli: Hide sector nums in 'proving deadline' by default ([filecoin-project/lotus#8952](https://github.com/filecoin-project/lotus/pull/8952)) - - ux: print absolute time for proving period start in proving cli ([filecoin-project/lotus#8954](https://github.com/filecoin-project/lotus/pull/8954)) - - ux: cli: add compute description ([filecoin-project/lotus#8963](https://github.com/filecoin-project/lotus/pull/8963)) - - chore:networking:disconnect cmd ([filecoin-project/lotus#8955](https://github.com/filecoin-project/lotus/pull/8955)) - - go mod tidy - - Update deps - - chore: state: clarify state tree versioning in comment ([filecoin-project/lotus#8947](https://github.com/filecoin-project/lotus/pull/8947)) - - Feat: api: Api call to get actor cids works for versions < 16 ([filecoin-project/lotus#8941](https://github.com/filecoin-project/lotus/pull/8941)) - - chore: market: upgrade index-provider and related dependencies ([filecoin-project/lotus#8945](https://github.com/filecoin-project/lotus/pull/8945)) - - PoC: FVM Debug Dual Execution ([filecoin-project/lotus#8841](https://github.com/filecoin-project/lotus/pull/8841)) - - fix appimage build ([filecoin-project/lotus#8931](https://github.com/filecoin-project/lotus/pull/8931)) - - build: chore: releases back to master ([filecoin-project/lotus#8929](https://github.com/filecoin-project/lotus/pull/8929)) - - fix: readme: Update install instructions link ([filecoin-project/lotus#8460](https://github.com/filecoin-project/lotus/pull/8460)) - - docs: update ./documentation/en/README.md ([filecoin-project/lotus#8887](https://github.com/filecoin-project/lotus/pull/8887)) - - deps: upgrade go-fil-markets to v1.22.0 ([filecoin-project/lotus#8905](https://github.com/filecoin-project/lotus/pull/8905)) - - Fix: cli: Break out of retrieval if provider cancels ([filecoin-project/lotus#8912](https://github.com/filecoin-project/lotus/pull/8912)) - - feat: shed: print out actor code CIDs in manifest cid checker ([filecoin-project/lotus#8911](https://github.com/filecoin-project/lotus/pull/8911)) - - Make cli deal command get Block Delay specific to build ([filecoin-project/lotus#8896](https://github.com/filecoin-project/lotus/pull/8896)) - - fix: fvm: make exectraces match legacyVM some more ([filecoin-project/lotus#8889](https://github.com/filecoin-project/lotus/pull/8889)) - - Add a reentrant multisig test ([filecoin-project/lotus#8816](https://github.com/filecoin-project/lotus/pull/8816)) - - chore: deps: Update to go-state-types v0.1.10 ([filecoin-project/lotus#8883](https://github.com/filecoin-project/lotus/pull/8883)) - - fix: deps: Update butterfly artifacts ([filecoin-project/lotus#8881](https://github.com/filecoin-project/lotus/pull/8881)) - - chore: sealing pipeline: Remove adapter code (storage refactors part 2) ([filecoin-project/lotus#8871](https://github.com/filecoin-project/lotus/pull/8871)) - - build: deps: add uninstall make target ([filecoin-project/lotus#8814](https://github.com/filecoin-project/lotus/pull/8814)) - - fix: ux: Check for client deal addrs on-chain ([filecoin-project/lotus#8830](https://github.com/filecoin-project/lotus/pull/8830)) - - update release template ([filecoin-project/lotus#7715](https://github.com/filecoin-project/lotus/pull/7715)) - - build: bump master version to v1.17.1-dev ([filecoin-project/lotus#8875](https://github.com/filecoin-project/lotus/pull/8875)) - - chore: backport: v1.16.0 bundle to master ([filecoin-project/lotus#8872](https://github.com/filecoin-project/lotus/pull/8872)) - - feat: update go-fil-markets to v1.21.0 ([filecoin-project/lotus#8856](https://github.com/filecoin-project/lotus/pull/8856)) - - chore: storage refactors part 1 ([filecoin-project/lotus#8858](https://github.com/filecoin-project/lotus/pull/8858)) - - feat: shed: report the "user version" ([filecoin-project/lotus#8864](https://github.com/filecoin-project/lotus/pull/8864)) - - chore: fix imports conflict ([filecoin-project/lotus#8863](https://github.com/filecoin-project/lotus/pull/8863)) - - chore: Fix imports ([filecoin-project/lotus#8859](https://github.com/filecoin-project/lotus/pull/8859)) - - chore: backport: release v1.16.0 back to master ([filecoin-project/lotus#8855](https://github.com/filecoin-project/lotus/pull/8855)) - - fix: format error log ([filecoin-project/lotus#8854](https://github.com/filecoin-project/lotus/pull/8854)) - - fix: build: really make macos compatible (#8853) ([filecoin-project/lotus#8853](https://github.com/filecoin-project/lotus/pull/8853)) - - fix: build: fix pack script and add calibrationnet to bundle ([filecoin-project/lotus#8852](https://github.com/filecoin-project/lotus/pull/8852)) - - Add new proofs version type ([filecoin-project/lotus#8848](https://github.com/filecoin-project/lotus/pull/8848)) - - feat: refactor: actor bundling system (#8838) ([filecoin-project/lotus#8838](https://github.com/filecoin-project/lotus/pull/8838)) - - refactor: remove old BlockSyncProtocolID ([filecoin-project/lotus#8820](https://github.com/filecoin-project/lotus/pull/8820)) - - chore: deps: Update to go-address v1.0.0 ([filecoin-project/lotus#8826](https://github.com/filecoin-project/lotus/pull/8826)) - - Revert "deps: update go-libp2p-pubsub to v0.7.0" ([filecoin-project/lotus#8842](https://github.com/filecoin-project/lotus/pull/8842)) - - Feat: migration: Implement function to migrate actors with only code changes ([filecoin-project/lotus#8843](https://github.com/filecoin-project/lotus/pull/8843)) - - feat: Add rate limiting to the lotus gateway ([filecoin-project/lotus#8517](https://github.com/filecoin-project/lotus/pull/8517)) - - gofmt - - fix: build: fix 2k build params ([filecoin-project/lotus#8835](https://github.com/filecoin-project/lotus/pull/8835)) - - Merge nv16 changes into master ([filecoin-project/lotus#8810](https://github.com/filecoin-project/lotus/pull/8810)) - - chore: improve error message when maxPrice is too low ([filecoin-project/lotus#8818](https://github.com/filecoin-project/lotus/pull/8818)) - - Fix: PaychGetRestartAfterAddFundsMsg may stuck in forever waiting ([filecoin-project/lotus#8829](https://github.com/filecoin-project/lotus/pull/8829)) - - fix: paych: Print "waiting for confirmation.." ([filecoin-project/lotus#8823](https://github.com/filecoin-project/lotus/pull/8823)) - - feat: conformance & tvx: support ReportConsensusFault messages ([filecoin-project/lotus#8302](https://github.com/filecoin-project/lotus/pull/8302)) - - fix: build: genesis miner network version ([filecoin-project/lotus#8756](https://github.com/filecoin-project/lotus/pull/8756)) - - deps: update go-libp2p@v0.19.4 ([filecoin-project/lotus#8799](https://github.com/filecoin-project/lotus/pull/8799)) - - feat: lotus-shed get remote peer hello message ([filecoin-project/lotus#8787](https://github.com/filecoin-project/lotus/pull/8787)) - - feat: cli: Nicer net stat ([filecoin-project/lotus#8797](https://github.com/filecoin-project/lotus/pull/8797)) - - fix: bench: consistency in description ([filecoin-project/lotus#8777](https://github.com/filecoin-project/lotus/pull/8777)) - - deps: update go-libp2p-pubsub to v0.7.0 ([filecoin-project/lotus#8770](https://github.com/filecoin-project/lotus/pull/8770)) - - feat: only enable rcmgr by default in full nodes ([filecoin-project/lotus#8769](https://github.com/filecoin-project/lotus/pull/8769)) - - chore: bundle: remove wrongly committed bundle cars ([filecoin-project/lotus#8762](https://github.com/filecoin-project/lotus/pull/8762)) - - Revert "VM: Refactor pricelist to be based on network versions" ([filecoin-project/lotus#8758](https://github.com/filecoin-project/lotus/pull/8758)) - - feat: bench: simple sealing operations commands ([filecoin-project/lotus#8373](https://github.com/filecoin-project/lotus/pull/8373)) - - feat: networking: add healthz and livez endpoints ([filecoin-project/lotus#8692](https://github.com/filecoin-project/lotus/pull/8692)) - - fix: worker: don't log normal storage stat calls ([filecoin-project/lotus#8744](https://github.com/filecoin-project/lotus/pull/8744)) - - fix: worker: don't check params with --no-default when not needed ([filecoin-project/lotus#8741](https://github.com/filecoin-project/lotus/pull/8741)) - - feat: add create ledger wallet address by account index command ([filecoin-project/lotus#8657](https://github.com/filecoin-project/lotus/pull/8657)) - - fix: rpc: readd rpc.discover aliases; lotus-gateway openrpc ([filecoin-project/lotus#8738](https://github.com/filecoin-project/lotus/pull/8738)) - - feat: wdpost: Ignore faults in lotus-miner proving compute window-post ([filecoin-project/lotus#8737](https://github.com/filecoin-project/lotus/pull/8737)) - - fix: post workers: check proving params on startup ([filecoin-project/lotus#8736](https://github.com/filecoin-project/lotus/pull/8736)) - - feat: sched: Per worker concurrent task count limits ([filecoin-project/lotus#8725](https://github.com/filecoin-project/lotus/pull/8725)) - - feat: sched: Finalize* move selectors ([filecoin-project/lotus#8710](https://github.com/filecoin-project/lotus/pull/8710)) - - feat: sched: Add scheduler interfaces, configurable assigner ([filecoin-project/lotus#8700](https://github.com/filecoin-project/lotus/pull/8700)) - - feat: miner cli: sealing data-cid command ([filecoin-project/lotus#8715](https://github.com/filecoin-project/lotus/pull/8715)) - - Snap Deals full unseal ([filecoin-project/lotus#8478](https://github.com/filecoin-project/lotus/pull/8478)) - - deps: libp2p: update to the latest golibp2p tag ([filecoin-project/lotus#8704](https://github.com/filecoin-project/lotus/pull/8704)) - - fix: deps: restore butterfly network genesis from v1.14.4 ([filecoin-project/lotus#8708](https://github.com/filecoin-project/lotus/pull/8708)) - - build: version: bump the version to v1.15.4-rc1 ([filecoin-project/lotus#8646](https://github.com/filecoin-project/lotus/pull/8646)) - - ci: deps: Use testground-github-action from testground org ([filecoin-project/lotus#8490](https://github.com/filecoin-project/lotus/pull/8490)) - - feat: worker: lotus-worker run --no-default ([filecoin-project/lotus#8672](https://github.com/filecoin-project/lotus/pull/8672)) - - docs:sealing:fix default miner config comments ([filecoin-project/lotus#8689](https://github.com/filecoin-project/lotus/pull/8689)) - - fix: verifreg: update deprecation log ([filecoin-project/lotus#8690](https://github.com/filecoin-project/lotus/pull/8690)) - - fix: vm: support raw blocks in chain export ([filecoin-project/lotus#8691](https://github.com/filecoin-project/lotus/pull/8691)) - - feat: precommits info ([filecoin-project/lotus#8696](https://github.com/filecoin-project/lotus/pull/8696)) - - Implement cli command for compactPartitions ([filecoin-project/lotus#8637](https://github.com/filecoin-project/lotus/pull/8637)) - - feat: dagstore: add dagstore register-shard command ([filecoin-project/lotus#8645](https://github.com/filecoin-project/lotus/pull/8645)) - - stores: Deduplicate parallel stat requests ([filecoin-project/lotus#8589](https://github.com/filecoin-project/lotus/pull/8589)) -- github.com/filecoin-project/go-address (v0.0.6 -> v1.0.0): - - add more checks and define constants ([filecoin-project/go-address#31](https://github.com/filecoin-project/go-address/pull/31)) - - enforce that the trailing bits of an address string are standard ([filecoin-project/go-address#28](https://github.com/filecoin-project/go-address/pull/28)) - - sync: update CI config files ([filecoin-project/go-address#29](https://github.com/filecoin-project/go-address/pull/29)) - - chore: fix test on 32bit and non-cgo platforms ([filecoin-project/go-address#30](https://github.com/filecoin-project/go-address/pull/30)) -- github.com/filecoin-project/go-data-transfer (v1.15.1 -> v1.15.2): - - chore(deps): update libp2p v0.19.4 (#341) ([filecoin-project/go-data-transfer#341](https://github.com/filecoin-project/go-data-transfer/pull/341)) - - Fix transfer message bindnode wrap passing pointer to pointer - - Log less important messages at debug level (#334) ([filecoin-project/go-data-transfer#334](https://github.com/filecoin-project/go-data-transfer/pull/334)) - - fix(message): do not EncodeToNode selectors (#326) ([filecoin-project/go-data-transfer#326](https://github.com/filecoin-project/go-data-transfer/pull/326)) - - ci(circle): update to non-legacy image (#328) ([filecoin-project/go-data-transfer#328](https://github.com/filecoin-project/go-data-transfer/pull/328)) - - Merge branch 'release/v1.15.1' -- github.com/filecoin-project/go-fil-markets (v1.20.1-v16-2 -> v1.23.1): - - release: v1.23.1 - - Upgrade to `go-car` `2.4.1` (#733) ([filecoin-project/go-fil-markets#733](https://github.com/filecoin-project/go-fil-markets/pull/733)) - - release: v1.23.0 (#732) ([filecoin-project/go-fil-markets#732](https://github.com/filecoin-project/go-fil-markets/pull/732)) - - feat: update deps (#731) ([filecoin-project/go-fil-markets#731](https://github.com/filecoin-project/go-fil-markets/pull/731)) - - release: v1.22.2 (#729) ([filecoin-project/go-fil-markets#729](https://github.com/filecoin-project/go-fil-markets/pull/729)) - - Upgrade to go-ipfs-blockstore `v1.2.0` (#728) ([filecoin-project/go-fil-markets#728](https://github.com/filecoin-project/go-fil-markets/pull/728)) - - release: v1.22.1 (#727) ([filecoin-project/go-fil-markets#727](https://github.com/filecoin-project/go-fil-markets/pull/727)) - - Upgrade index-provider and related dependencies (#722) ([filecoin-project/go-fil-markets#722](https://github.com/filecoin-project/go-fil-markets/pull/722)) - - release: v1.22.0 (#726) ([filecoin-project/go-fil-markets#726](https://github.com/filecoin-project/go-fil-markets/pull/726)) - - migrate provider deal proposal label to the new format (#721) ([filecoin-project/go-fil-markets#721](https://github.com/filecoin-project/go-fil-markets/pull/721)) - - release: v1.21.0 (#720) ([filecoin-project/go-fil-markets#720](https://github.com/filecoin-project/go-fil-markets/pull/720)) - - Use new go-state-types state accessors (#711) (#719) ([filecoin-project/go-fil-markets#719](https://github.com/filecoin-project/go-fil-markets/pull/719)) - - chore: update go-car dependency (#709) ([filecoin-project/go-fil-markets#709](https://github.com/filecoin-project/go-fil-markets/pull/709)) - - fix:close ask/dealstatus stream (#710) ([filecoin-project/go-fil-markets#710](https://github.com/filecoin-project/go-fil-markets/pull/710)) - - fix: fire storage deal provider ready event after startup completes (#708) ([filecoin-project/go-fil-markets#708](https://github.com/filecoin-project/go-fil-markets/pull/708)) - - release: v1.20.3 (#703) ([filecoin-project/go-fil-markets#703](https://github.com/filecoin-project/go-fil-markets/pull/703)) - - validate deal proposal (#702) ([filecoin-project/go-fil-markets#702](https://github.com/filecoin-project/go-fil-markets/pull/702)) - - FIP 0027 integration (#694) ([filecoin-project/go-fil-markets#694](https://github.com/filecoin-project/go-fil-markets/pull/694)) - - Update index provider library (#698) ([filecoin-project/go-fil-markets#698](https://github.com/filecoin-project/go-fil-markets/pull/698)) - - feat: add offset to ListLocalDealsPage (#695) ([filecoin-project/go-fil-markets#695](https://github.com/filecoin-project/go-fil-markets/pull/695)) - - feat: provider deals pagination (#692) ([filecoin-project/go-fil-markets#692](https://github.com/filecoin-project/go-fil-markets/pull/692)) - - better answer message on ErrNotFound (#690) ([filecoin-project/go-fil-markets#690](https://github.com/filecoin-project/go-fil-markets/pull/690)) - - api to fetch a deal state (#691) ([filecoin-project/go-fil-markets#691](https://github.com/filecoin-project/go-fil-markets/pull/691)) - - release: v1.20.1 ([filecoin-project/go-fil-markets#689](https://github.com/filecoin-project/go-fil-markets/pull/689)) -- github.com/filecoin-project/go-indexer-core (v0.2.8 -> v0.2.16): - - Use sth with bad key recovery (#58) ([filecoin-project/go-indexer-core#58](https://github.com/filecoin-project/go-indexer-core/pull/58)) - - Update storethehash to get index recovery fix - - Update to storethehash with panic fix - - Update storethehash dependency - - update .github/workflows/go-check.yml - - update .github/workflows/go-test.yml - - update .github/workflows/automerge.yml - - Upgrade storethehash - - Sth with file fixer (#53) ([filecoin-project/go-indexer-core#53](https://github.com/filecoin-project/go-indexer-core/pull/53)) - - oops - - Use the new storethehash with index GC - - Update storethehash -- github.com/filecoin-project/go-legs (v0.3.10 -> v0.4.4): - - New version - - Update libp2p dependencies - - Put tests of non-exported functions into internal_test.go - - Compare with error instance instead of err string - - Fix derived protocol ID so there are no double slashes - - Update deps - - Bump version for rate limiter and test changes - - Simplify rate limiter configuration (#130) ([filecoin-project/go-legs#130](https://github.com/filecoin-project/go-legs/pull/130)) - - Bump version in preparation of rolling out http addr fix - - Learn HTTP publisher address from announce message - - Bump version - - Fix equality check during segmented sync - - Bump version in prep for releasing segmented sync feature - - Implement the ability to sync a DAG in segments of configurable depth - - Update version (#125) ([filecoin-project/go-legs#125](https://github.com/filecoin-project/go-legs/pull/125)) - - Fix rate limit burst refresh for graphsync (#124) ([filecoin-project/go-legs#124](https://github.com/filecoin-project/go-legs/pull/124)) - - Retry on rate limit error during HTTP sync - - Option for publisher to allow/reject data transfers (#122) ([filecoin-project/go-legs#122](https://github.com/filecoin-project/go-legs/pull/122)) - - Revert "Fix derived protocol ID so there are no double slashes" - - Fix derived protocol ID so there are no double slashes - - Do not let async goroutines build up (#119) ([filecoin-project/go-legs#119](https://github.com/filecoin-project/go-legs/pull/119)) - - Add ability to get subscriber http peerstore (#116) ([filecoin-project/go-legs#116](https://github.com/filecoin-project/go-legs/pull/116)) - - sync: update CI config files (#114) ([filecoin-project/go-legs#114](https://github.com/filecoin-project/go-legs/pull/114)) - - Better error if we cannot query head for sync (#115) ([filecoin-project/go-legs#115](https://github.com/filecoin-project/go-legs/pull/115)) - - Update version - - Update go-data-transfer and go-graphsync deps - - Fix out of date cborgen and regenerate voucher serialization - - Upgrade to the latest graphsync and datatransfer - - Implement rate limiting for subscribers (#111) ([filecoin-project/go-legs#111](https://github.com/filecoin-project/go-legs/pull/111)) -- github.com/filecoin-project/index-provider (v0.5.0 -> v0.8.1): - - Bump version in preparation for release - - Ignore staticcheck erros in generated cbor-gen - - Upgrade to tagged release of `go-data-transfer` - - Cache links of a root entry instead of resolving them on the fly - - Do not bother restoring cache when purge cache is set - - Upgrade dependencies - - Policy to allow/block indexers from syncing with provider (#230) ([filecoin-project/index-provider#230](https://github.com/filecoin-project/index-provider/pull/230)) - - Bump version to `0.8.0` in preparation for release - - Recover from corrupted cached chunks gracefully - - Smaller default MultihashIterator implementation (#228) ([filecoin-project/index-provider#228](https://github.com/filecoin-project/index-provider/pull/228)) - - Restore TAG in makefile after discussion - - Do not assume build system has bash shell - - Make linksystem less noisy - - add a getter to metadata ([filecoin-project/index-provider#221](https://github.com/filecoin-project/index-provider/pull/221)) - - Upgrade to go-legs `0.3.13` - - Remove nested `cmd` module now that go mod is upgraded to `1.17` - - Bump version to `0.7.0` in preparation for release - - Fix bug where no publisher caused panic when previous root is present - - Bump github.com/ipld/go-codec-dagpb from 1.3.0 to 1.3.1 (#215) ([filecoin-project/index-provider#215](https://github.com/filecoin-project/index-provider/pull/215)) - - Bump github.com/ipfs/go-ipfs from 0.11.0 to 0.12.1 in /cmd - - allow option specifying provider addrinfo ([filecoin-project/index-provider#214](https://github.com/filecoin-project/index-provider/pull/214)) - - sync: update CI config files (#210) ([filecoin-project/index-provider#210](https://github.com/filecoin-project/index-provider/pull/210)) - - Fix encoding of error in logs when instantiating publisher - - Bump version to `0.6.0` - - New announce command to announce latest advertisement - - Add `list car` command and refactor CAR admin server handlers - - Remove dependency to `go-ipfs-blocksutil` used only for testing - - Upgrade index provider to sti with bindnode schema - - Replace IPLD accumulate with IPLD schema file - - Update version and go-logs and storetheindex dependencies - - Remove temporary fixed by depending on head of main in sti - - Support multiple metadata transport protocols - - Fix incomplete sentence in README (#197) ([filecoin-project/index-provider#197](https://github.com/filecoin-project/index-provider/pull/197)) - - Rename `Callback` to a more specific name: `MultihashLister` - - Fix intermittently failing tests that use gossipsub - - Re-implement engine tests and re-enable all tests - - Refactor `config` package to `cmd` since that's where it is used - - Print ad chain stats and retry when syncing ads -- github.com/filecoin-project/specs-actors/v8 (v8.0.0 -> v8.0.1): - - don't panic during migration (#1598) ([filecoin-project/specs-actors#1598](https://github.com/filecoin-project/specs-actors/pull/1598)) -- github.com/filecoin-project/storetheindex (v0.3.5 -> v0.4.17): - - Update version and go-legs with new libp2p - - Add command to import providers from another indexer (#574) ([filecoin-project/storetheindex#574](https://github.com/filecoin-project/storetheindex/pull/574)) - - Update storetheindex/storetheindex in `dev` environment - - Update config with logging and missing settings - - Update config with logging and missing settings - - Update dev config with logging and missing settings - - More config items (#569) ([filecoin-project/storetheindex#569](https://github.com/filecoin-project/storetheindex/pull/569)) - - Deploy latest to `dev` environment (#567) ([filecoin-project/storetheindex#567](https://github.com/filecoin-project/storetheindex/pull/567)) - - Log levels are configurable in config file and reloadable (#564) ([filecoin-project/storetheindex#564](https://github.com/filecoin-project/storetheindex/pull/564)) - - Update storetheindex/storetheindex in `prod` environment - - Bump version to release reframe upgrade - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - update dependency on delegated routing; this change moves Reframe queries from the URL to the HTTP body ([filecoin-project/storetheindex#563](https://github.com/filecoin-project/storetheindex/pull/563)) - - Fix `/reframe` routing through CloudFront in `prod` - - Update storetheindex/storetheindex in `prod` environment - - Only log first bad multihash error to prevent log flooding. - - Create new version tag - - Deploy latest to `dev` environment (#557) ([filecoin-project/storetheindex#557](https://github.com/filecoin-project/storetheindex/pull/557)) - - Ignore invalid multihashes (#555) ([filecoin-project/storetheindex#555](https://github.com/filecoin-project/storetheindex/pull/555)) - - Skip ads with context deleted later in chain (#553) ([filecoin-project/storetheindex#553](https://github.com/filecoin-project/storetheindex/pull/553)) - - Do not create a PR in CD branches if there is no commit - - Add `INDEXER_WATCH_CONFIG` env var back to avoid race condition - - Do not trigger rolling deployment when indexer config changes - - Enable automatic config reload - - Deploy latest to `dev` environment (#548) ([filecoin-project/storetheindex#548](https://github.com/filecoin-project/storetheindex/pull/548)) - - Reload policy and rate limit settings without restarting daemon (#529) ([filecoin-project/storetheindex#529](https://github.com/filecoin-project/storetheindex/pull/529)) - - Assert ongoing announce does not deadlock ingestion (#546) ([filecoin-project/storetheindex#546](https://github.com/filecoin-project/storetheindex/pull/546)) - - Update storetheindex/storetheindex in `prod` environment - - Bump version to release CPU contention fix and corrupt key skip - - Update storetheindex/storetheindex in `dev` environment - - Use sth with bad key recovery (#543) ([filecoin-project/storetheindex#543](https://github.com/filecoin-project/storetheindex/pull/543)) - - Update storetheindex/storetheindex in `dev` environment - - Defer handling of announce until ad chain processing is finished - - Increase CPU resources in `prod` to `3.5` - - Increase CPU limit in `dev` to `3.5` - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Move changes in prod config from #528 to combine deployment - - Update storetheindex/storetheindex in `prod` environment - - update dep on delgated routing to v0.2.1 (#538) ([filecoin-project/storetheindex#538](https://github.com/filecoin-project/storetheindex/pull/538)) - - add metrics to reframe endpoint (#536) ([filecoin-project/storetheindex#536](https://github.com/filecoin-project/storetheindex/pull/536)) - - Move changes in dev config from #528 to combine deployment - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Update version and deps (#533) ([filecoin-project/storetheindex#533](https://github.com/filecoin-project/storetheindex/pull/533)) - - Ignore multihash entries that are too short (#530) ([filecoin-project/storetheindex#530](https://github.com/filecoin-project/storetheindex/pull/530)) - - Deploy latest to `dev` environment (#527) ([filecoin-project/storetheindex#527](https://github.com/filecoin-project/storetheindex/pull/527)) - - Upgrade go-legs to fix HTTP publisher address issue - - Use `http.Client` instead of `cleanhttp` in `retryablehttp` - - Re-allow all peers on `prod` and separate the config from `base` - - Update storetheindex/storetheindex in `prod` environment - - Update storetheindex/storetheindex in `dev` environment - - Allow other randomly selected peer IDs in `dev` - - Update storetheindex/storetheindex in `dev` environment - - Bump version in preparation to release segmented sync - - Reduce verbose logging of HTTP sync requests - - Deploy latest to `dev` environment (#509) ([filecoin-project/storetheindex#509](https://github.com/filecoin-project/storetheindex/pull/509)) - - Fix bug where tail of chain is synced twice - - Retry HTTP sync requests - - Use concrete `go-legs` version with segmented sync - - Deploy latest to `dev` environment (#499) ([filecoin-project/storetheindex#499](https://github.com/filecoin-project/storetheindex/pull/499)) - - Sync ads and entries in configurable segments - - Update config document for version 2 - - Improve test stability by asserting multihashes are eventually indexed - - Remove overriding std in/err in E2E test - - Fix intermittent test failures - - Update storetheindex/storetheindex in `prod` environment - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Create new version tag - - Add memory optimized `r5a.2xlarge` workers to `dev` - - Configure rate limit (#488) ([filecoin-project/storetheindex#488](https://github.com/filecoin-project/storetheindex/pull/488)) - - Cleanup policy evaluation (#479) ([filecoin-project/storetheindex#479](https://github.com/filecoin-project/storetheindex/pull/479)) - - Add logging around announce messages (#481) ([filecoin-project/storetheindex#481](https://github.com/filecoin-project/storetheindex/pull/481)) - - Fix invalid json in dev config - - Only whitelist ingestion from a specific provider in `dev` for testing - - Use larger instance types and override config in dev to limit providers - - Upgrade indexer config base layer (#441) ([filecoin-project/storetheindex#441](https://github.com/filecoin-project/storetheindex/pull/441)) - - Define dedicated KMS keys used to encrypt autoretrieve secrets - - Allow `put` via cloudfront sitting in front of `cid.contact` - - Add a Reframe API server at HTTP `/reframe`. ([filecoin-project/storetheindex#464](https://github.com/filecoin-project/storetheindex/pull/464)) - - Allow GitHub Actions from ARG autoretrieve repo to publish to ECR - - GitOps deployment of dev-v2 cluster (#449) ([filecoin-project/storetheindex#449](https://github.com/filecoin-project/storetheindex/pull/449)) - - Onboard `autoretrieve` as a temporary tenant of sti `dev` cluster - - Stop deployment to `fil-dev` and `fil-prod` via CircleCI - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - update doc with current codes - - Add encrypted credentials to access GitHub for `index-observer` - - Add `index-observer` to dev cluster manifests - - Configure flux cd for `index-observer` on `dev` cluster - - Define `index-observer` ECR repo and CI to build and push images - - use default cidlink length (#450) ([filecoin-project/storetheindex#450](https://github.com/filecoin-project/storetheindex/pull/450)) - - Point `cid.contact` to `prod` CloudFront distribution - - Disable autoscaler in prod to investigate the selection policy - - Configure Promtail to forward host and container logs to PL loki - - Increase memory and CPU for indexer on `prod` - - Fix version written by init (#435) ([filecoin-project/storetheindex#435](https://github.com/filecoin-project/storetheindex/pull/435)) - - Update link to config documentation - - Create config file description - - Update README.md (#434) ([filecoin-project/storetheindex#434](https://github.com/filecoin-project/storetheindex/pull/434)) - - Log and config update (#429) ([filecoin-project/storetheindex#429](https://github.com/filecoin-project/storetheindex/pull/429)) - - Update storetheindex/storetheindex in `dev` environment - - Fix regex replacement in automated PR creation template - - Configure image update automation for `prod` - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Scale up `dev` to 2 instances - - Point infra.cid.contact to `prod` running in sti AWS account - - Update kustomization.yaml - - Deploy the latest release to `prod` environment - - Announce handling (#418) ([filecoin-project/storetheindex#418](https://github.com/filecoin-project/storetheindex/pull/418)) - - Update storethehash to get index recovery fix - - Deploy latest to `dev` environment (#400) ([filecoin-project/storetheindex#400](https://github.com/filecoin-project/storetheindex/pull/400)) - - If no value for "indexer" CLI flag, then read from config (#407) ([filecoin-project/storetheindex#407](https://github.com/filecoin-project/storetheindex/pull/407)) - - Configure resources for `dev` amd `prod` - - Write `prod` metrics to a dedicated AWS managed prometheus - - Create pl-grafana IAM user to integrate with PL Grafana - - Spread indexer instances across AZs when possible - - Publish containers to ECR repo when a release is created - - Define base promtail kustomization used for log forwarding - - Send metrics to AWS managed prometheus via private link - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Update to core with storehash panic filx (#387) ([filecoin-project/storetheindex#387](https://github.com/filecoin-project/storetheindex/pull/387)) - - Use new flag names in commands - - Set up remote write for dev metrics to aws managed prometheus - - Upgrade monitoring manifests now that K8S clusters are on 1.22 - - Upgrade dev cluster to 1.22 - - Reduce iops per GiB for storage classes to unblock deployment - - Update storetheindex/storetheindex in `dev` environment - - Quote glob format to select tags - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Skip dev CD job if PR it should create exists already - - Don't override image in prod until auto deploy is set up - - Update version - - Use `io2` storage class for `prod` instances - - support a list of peers from which we accept advertisements for other providers (#344) ([filecoin-project/storetheindex#344](https://github.com/filecoin-project/storetheindex/pull/344)) - - Add AWS EBS CSI to dev cluster manifests - - Use io2 storage class for indexer pods in `dev` - - Update storetheindex/storetheindex in `dev` environment - - Fix ECR build still running on sti bot pushes to `deploy` directory - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Remove skip message from image update automation - - Specify pod disruption budget for storetheindex - - Add readiness probe to base storetheindex K8S manifests - - Fix wrong publisher address when using HTTP (#357) ([filecoin-project/storetheindex#357](https://github.com/filecoin-project/storetheindex/pull/357)) - - Update storetheindex/storetheindex in `dev` environment - - Update storetheindex/storetheindex in `dev` environment - - Do not publish to ECR if pusher is `sti-bot` - - Update storetheindex/storetheindex in `dev` environment - - Configure automated image deployment for `dev` environment - - Configure private ECR repo for storetheindex in `common` infra - - Revert "Remove redundant private ECR repo" - - Remove redundant private ECR repo - - Create GitHub Actions credentials and set container publish to ECR - - Bump github.com/ipfs/go-ipfs from 0.11.0 to 0.12.1 - - Configure EBS CSI controller to run on all nodes - - Define production infrastructure in `us-east-2` - - Add README on how to interact with `sops` encrypted secrets - - Define prod kustomization overlay - - Upgrade storethehash - - Use storethehash with corrupted file fixer (#339) ([filecoin-project/storetheindex#339](https://github.com/filecoin-project/storetheindex/pull/339)) - - Use storethehash that has index GC - - Bump chart version to include templated readiness probe - - Add `io2` storage class to dev cluster - - Restructure identity settings to allow per instance key - - Specify remote build for `monitoring` in HTTP but different format - - Update version.json (#333) ([filecoin-project/storetheindex#333](https://github.com/filecoin-project/storetheindex/pull/333)) - - Update version.json (#332) ([filecoin-project/storetheindex#332](https://github.com/filecoin-project/storetheindex/pull/332)) - - Fix `MalformedYAMLError` when kustomization uses HTTPS to clone repo - - Set up K8S monitoring - - Allow Kyle to interact with dev KMS - - sync: update CI config files (#317) ([filecoin-project/storetheindex#317](https://github.com/filecoin-project/storetheindex/pull/317)) - - Fix out of bounds panic in registery - - Add `cluster-autoscaler` to list of cluster level kustomizations - - Set up cluster-autoscaler on `dev` - - Cache 404s in cloudfront (#314) ([filecoin-project/storetheindex#314](https://github.com/filecoin-project/storetheindex/pull/314)) - - Added users cmharden and steveFraser to kms.tf and aws-auth.yaml (#313) ([filecoin-project/storetheindex#313](https://github.com/filecoin-project/storetheindex/pull/313)) - - Set up caching layer for dev endpoint using CloudFront - - Give Kyle access to `dev` cluster - - Update version - - Fix pprof handlers - - Update dependencies - - Add comments and tests for ad signature - - Set up `dev.cid.contact` with all things manged by K8S - - Store publisher address with publisher ID (#298) ([filecoin-project/storetheindex#298](https://github.com/filecoin-project/storetheindex/pull/298)) - - Define base kustomization and dev overlay for storetheindex - - Define KMS key to encrypt secrets used by storetheindex - - Allow the ability to configure private key via file - - Install `nginx` ingress controller on dev K8S cluster - - Replace target CD branch to `main` - - Define base and dev overlay K8S manifests - - Define terraform infrastructure for dev EKS cluster - - Fix `.gitignore` to not ignore all directories named `storetheindex` - - Add PR Template (#292) ([filecoin-project/storetheindex#292](https://github.com/filecoin-project/storetheindex/pull/292)) - - Fix find latency metric (#284) ([filecoin-project/storetheindex#284](https://github.com/filecoin-project/storetheindex/pull/284)) - - About doc (#283) ([filecoin-project/storetheindex#283](https://github.com/filecoin-project/storetheindex/pull/283)) - - Bump version to `0.4.0` after bindnode merge (#281) ([filecoin-project/storetheindex#281](https://github.com/filecoin-project/storetheindex/pull/281)) - - More efficient batch processing of multihashes (#282) ([filecoin-project/storetheindex#282](https://github.com/filecoin-project/storetheindex/pull/282)) - - Fix goroutine leak in go-statemachine (#280) ([filecoin-project/storetheindex#280](https://github.com/filecoin-project/storetheindex/pull/280)) - - Use IPLD bindnode and reduce boilerplate code in ingest schema - - Update version and go-legs - - Build docker image using go1.18 - - Fix a goroutine leak in go-libp2p-swarm - - Limit number of open connection to the http server (#273) ([filecoin-project/storetheindex#273](https://github.com/filecoin-project/storetheindex/pull/273)) - - Remove recursion depth limits for sync (#270) ([filecoin-project/storetheindex#270](https://github.com/filecoin-project/storetheindex/pull/270)) - - Fair share ingest workers (#259) ([filecoin-project/storetheindex#259](https://github.com/filecoin-project/storetheindex/pull/259)) - - Drop support for Go 1.16 (#267) ([filecoin-project/storetheindex#267](https://github.com/filecoin-project/storetheindex/pull/267)) - - Set the maximum acceptable length for advertisement metadata - - Revert "Skip e2e tests until provider side is upgraded." - - Add indexer ecosystem diagram and source ([filecoin-project/storetheindex#264](https://github.com/filecoin-project/storetheindex/pull/264)) - - Skip e2e tests until provider side is upgraded. - - Replace `v0.Metadata` with `[]byte` - - Don't optimistically delete an Ad (#258) ([filecoin-project/storetheindex#258](https://github.com/filecoin-project/storetheindex/pull/258)) - - Use go1.17 for docker build - - Set latestsynchandler on go legs (#256) ([filecoin-project/storetheindex#256](https://github.com/filecoin-project/storetheindex/pull/256)) - - Update to latest legs and update version - - don't be as aggressive about using :3000 / :3001 on client request (#254) ([filecoin-project/storetheindex#254](https://github.com/filecoin-project/storetheindex/pull/254)) - - Create creating-an-index-provider.md (#253) ([filecoin-project/storetheindex#253](https://github.com/filecoin-project/storetheindex/pull/253)) - - add cors headers to find interface (#252) ([filecoin-project/storetheindex#252](https://github.com/filecoin-project/storetheindex/pull/252)) - - Update dependencies and version - - Reduce log volume and log progress (#246) ([filecoin-project/storetheindex#246](https://github.com/filecoin-project/storetheindex/pull/246)) - - Indexer auto-syncs after period of no contact with publisher (#247) ([filecoin-project/storetheindex#247](https://github.com/filecoin-project/storetheindex/pull/247)) - - Only increase error metric on error - - Remove readBeforeErr hack now that cbor-gen bug is fixed +## Bug Fixes +- fix: format error log ([filecoin-project/lotus#8854](https://github.com/filecoin-project/lotus/pull/8854)) +- fix: build: really make macos compatible (#8853) ([filecoin-project/lotus#8853](https://github.com/filecoin-project/lotus/pull/8853)) +- fix: build: fix pack script and add calibrationnet to bundle ([filecoin-project/lotus#8852](https://github.com/filecoin-project/lotus/pull/8852)) +- fix: build: fix 2k build params ([filecoin-project/lotus#8835](https://github.com/filecoin-project/lotus/pull/8835)) +- Fix: PaychGetRestartAfterAddFundsMsg may stuck in forever waiting ([filecoin-project/lotus#8829](https://github.com/filecoin-project/lotus/pull/8829)) +- fix: paych: Print "waiting for confirmation.." ([filecoin-project/lotus#8823](https://github.com/filecoin-project/lotus/pull/8823)) +- fix: build: genesis miner network version ([filecoin-project/lotus#8756](https://github.com/filecoin-project/lotus/pull/8756)) +- fix: bench: consistency in description ([filecoin-project/lotus#8777](https://github.com/filecoin-project/lotus/pull/8777)) +- fix: worker: don't log normal storage stat calls ([filecoin-project/lotus#8744](https://github.com/filecoin-project/lotus/pull/8744)) +- fix: worker: don't check params with --no-default when not needed ([filecoin-project/lotus#8741](https://github.com/filecoin-project/lotus/pull/8741)) +- fix: post workers: check proving params on startup ([filecoin-project/lotus#8736](https://github.com/filecoin-project/lotus/pull/8736)) +- fix: rpc: readd rpc.discover aliases; lotus-gateway openrpc ([filecoin-project/lotus#8738](https://github.com/filecoin-project/lotus/pull/8738)) +- fix: verifreg: update deprecation log ([filecoin-project/lotus#8690](https://github.com/filecoin-project/lotus/pull/8690)) +- fix: vm: support raw blocks in chain export ([filecoin-project/lotus#8691](https://github.com/filecoin-project/lotus/pull/8691)) +- fix: deps: restore butterfly network genesis from v1.14.4 ([filecoin-project/lotus#8708](https://github.com/filecoin-project/lotus/pull/8708)) +- fix: msig cli: Check for existing signers in add-propose ([filecoin-project/lotus#8833](https://github.com/filecoin-project/lotus/pull/8833)) +- fix: cli: Break out of retrieval if provider cancels ([filecoin-project/lotus#8912](https://github.com/filecoin-project/lotus/pull/8912)) +- fix: appimage build ([filecoin-project/lotus#8931](https://github.com/filecoin-project/lotus/pull/8931)) +- fix: Make cli deal command get Block Delay specific to build ([filecoin-project/lotus#8896](https://github.com/filecoin-project/lotus/pull/8896)) +- fix: deps: update FFI to fix a slow memory leak ([filecoin-project/lotus#9044](https://github.com/filecoin-project/lotus/pull/9044)) +- fix: sealing: hacky sealing fix backport ([filecoin-project/lotus#9055](https://github.com/filecoin-project/lotus/pull/9055)) + +## Dependency Updates + +- github.com/filecoin-project/go-address (v0.0.6 -> v1.0.0) +- github.com/filecoin-project/go-fil-markets (v1.20.1 -> v1.23.1) +- github.com/filecoin-project/go-indexer-core (v0.2.8 -> v0.2.9) +- github.com/filecoin-project/go-data-transfer (v1.15.1 -> v1.15.2) +- github.com/filecoin-project/go-legs (v0.3.7 -> v0.4.4) +- github.com/filecoin-project/go-state-types (v0.1.8 -> v0.1.10) +- github.com/filecoin-project/index-provider (v0.5.0 -> v0.8.1) +- github.com/filecoin-project/specs-actors (v0.9.14 -> v0.9.15) +- github.com/filecoin-project/specs-actors/v3 (v3.1.1 -> v3.1.2) +- github.com/filecoin-project/specs-actors/v4 (v4.0.1 -> v4.0.2) +- github.com/filecoin-project/specs-actors/v5 (v5.0.4 -> v5.0.6) +- github.com/filecoin-project/specs-actors/v6 (v6.0.1 -> v6.0.2) +- github.com/filecoin-project/specs-actors/v7 (v7.0.0 -> v7.0.1) +- github.com/filecoin-project/specs-actors/v8 (null -> v8.0.1) +- github.com/filecoin-project/specs-storage (v0.2.4 -> v0.4.1) +- github.com/filecoin-project/storetheindex (v0.3.5 -> v0.4.17) +- chore: update and fix libp2p ([filecoin-project/lotus#8996](https://github.com/filecoin-project/lotus/pull/8996)) + +## Others + +- chore: storage refactors part 1 ([filecoin-project/lotus#8858](https://github.com/filecoin-project/lotus/pull/8858)) +- chore: fix imports conflict ([filecoin-project/lotus#8863](https://github.com/filecoin-project/lotus/pull/8863)) +- chore: Fix imports ([filecoin-project/lotus#8859](https://github.com/filecoin-project/lotus/pull/8859)) +- chore: backport: release v1.16.0 back to master ([filecoin-project/lotus#8855](https://github.com/filecoin-project/lotus/pull/8855)) +- chore: improve error message when maxPrice is too low ([filecoin-project/lotus#8818](https://github.com/filecoin-project/lotus/pull/8818)) +- chore: bundle: remove wrongly committed bundle cars ([filecoin-project/lotus#8762](https://github.com/filecoin-project/lotus/pull/8762)) +- chore: storage refactors part 1 ([filecoin-project/lotus#8858](https://github.com/filecoin-project/lotus/pull/8858)) +- chore: sealing pipeline: Remove adapter code (storage refactors part 2) ([filecoin-project/lotus#8871](https://github.com/filecoin-project/lotus/pull/8871)) +- deps: libp2p: update to the latest golibp2p tag ([filecoin-project/lotus#8704](https://github.com/filecoin-project/lotus/pull/8704)) +- feat: shed: report the "user version" ([filecoin-project/lotus#8864](https://github.com/filecoin-project/lotus/pull/8864)) +- feat: Add rate limiting to the lotus gateway ([filecoin-project/lotus#8517](https://github.com/filecoin-project/lotus/pull/8517)) +- feat: lotus-shed get remote peer hello message ([filecoin-project/lotus#8787](https://github.com/filecoin-project/lotus/pull/8787)) +- feat: refactor: actor bundling system (#8838) ([filecoin-project/lotus#8838](https://github.com/filecoin-project/lotus/pull/8838)) +- feat: add create ledger wallet address by account index command ([filecoin-project/lotus#8657](https://github.com/filecoin-project/lotus/pull/8657)) +- feat: conformance & tvx: support ReportConsensusFault messages ([filecoin-project/lotus#8302](https://github.com/filecoin-project/lotus/pull/8302)) +- feat: migration: Implement function to migrate actors with only code changes ([filecoin-project/lotus#8843](https://github.com/filecoin-project/lotus/pull/8843)) +- feat: only enable rcmgr by default in full nodes ([filecoin-project/lotus#8769](https://github.com/filecoin-project/lotus/pull/8769)) +- docs:sealing:fix default miner config comments ([filecoin-project/lotus#8689](https://github.com/filecoin-project/lotus/pull/8689)) +- ci: deps: Use testground-github-action from testground org ([filecoin-project/lotus#8490](https://github.com/filecoin-project/lotus/pull/8490)) +- ux: print absolute time for proving period start in proving cli ([filecoin-project/lotus#8954](https://github.com/filecoin-project/lotus/pull/8954)) +- fix incorrect usage of peer.IDFromString (should be peer.Decode) ([filecoin-project/lotus#8993](https://github.com/filecoin-project/lotus/pull/8993)) +- fix: Delegate storage auth on market nodes ([filecoin-project/lotus#8978](https://github.com/filecoin-project/lotus/pull/8978)) +- Add new proofs version type ([filecoin-project/lotus#8848](https://github.com/filecoin-project/lotus/pull/8848)) +- refactor: remove old BlockSyncProtocolID ([filecoin-project/lotus#8820](https://github.com/filecoin-project/lotus/pull/8820)) +- stores: Deduplicate parallel stat requests ([filecoin-project/lotus#8589](https://github.com/filecoin-project/lotus/pull/8589)) +- change 1475 bootstrap peer ([filecoin-project/lotus#9008](https://github.com/filecoin-project/lotus/pull/9008)) + Contributors | Contributor | Commits | Lines ± | Files Changed | @@ -530,7 +170,6 @@ Contributors | Daniel N | 1 | +1/-1 | 1 | | BMZ | 1 | +1/-1 | 1 | - # 1.16.1 / 2022-07-07 This is an OPTIONAL PATCH releases for storage providers who have failed to publish `SubmitWindowedPoSt` due to out of gas error. The error log looks like `/wdpost_run.go:xxx estimating gas {"error": "estimating gas used: message execution failed: exit SysErrOutOfGas(7)...`. From 04fce8a5faf4f110a1e836d1d56322ea7be38990 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Sun, 24 Jul 2022 22:16:16 -0700 Subject: [PATCH 06/19] Fix snap publishing flow, publish assets independently --- .circleci/config.yml | 71 +++++++++++++++---- .circleci/template.yml | 71 +++++++++++++++---- ...ild-bundle.sh => build-appimage-bundle.sh} | 23 ------ scripts/build-arch-bundle | 46 ++++++++++++ ...ish-release.sh => publish-arch-release.sh} | 14 ++++ 5 files changed, 172 insertions(+), 53 deletions(-) rename scripts/{build-bundle.sh => build-appimage-bundle.sh} (52%) create mode 100755 scripts/build-arch-bundle rename scripts/{publish-release.sh => publish-arch-release.sh} (92%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 914fa2ffd..dad86860a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -115,7 +115,7 @@ jobs: command: | git --no-pager diff go.mod go.sum git --no-pager diff --quiet go.mod go.sum - build-all: + build-linux: executor: golang steps: - install-deps @@ -536,6 +536,19 @@ jobs: publish: description: publish binary artifacts executor: ubuntu + parameters: + linux: + default: false + description: publish linux binaries? + type: boolean + darwin: + default: false + description: publish darwin binaries? + type: boolean + appimage: + default: false + description: publish appimage binaries? + type: boolean steps: - run: name: Install git jq curl @@ -546,12 +559,21 @@ jobs: - install_ipfs - attach_workspace: at: "." - - run: - name: Create bundles - command: ./scripts/build-bundle.sh - - run: - name: Publish release - command: ./scripts/publish-release.sh + - when: + condition: << parameters.linux >> + steps: + - run: ./scripts/build-arch-bundle.sh linux + - run: ./scripts/publish-arch-release.sh linux + - when: + condition: << parameters.darwin>> + steps: + - run: ./scripts/build-arch-bundle.sh darwin + - run: ./scripts/publish-arch-release.sh darwin + - when: + condition: << parameters.appimage >> + steps: + - run: ./scripts/build-appimage-bundle.sh + - run: ./scripts/publish-arch-release.sh appimage publish-snapcraft: description: build and push snapcraft @@ -568,11 +590,6 @@ jobs: - run: name: install snapcraft command: sudo snap install snapcraft --classic - - run: - name: create snapcraft config file - command: | - mkdir -p ~/.config/snapcraft - echo "$SNAPCRAFT_LOGIN_FILE" | base64 -d > ~/.config/snapcraft/snapcraft.cfg - run: name: build snap command: snapcraft --use-lxd @@ -1020,7 +1037,7 @@ workflows: only: - master - build-debug - - build-all: + - build-linux: filters: tags: only: @@ -1042,6 +1059,18 @@ workflows: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - build-appimage: + filters: + branches: + only: + - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + - publish: + name: publish-macos + darwin: true + requires: + - build-macos filters: branches: ignore: @@ -1050,9 +1079,21 @@ workflows: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish: + name: publish-linux + linux: true + requires: + - build-linux + filters: + branches: + ignore: + - /.*/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + - publish: + name: publish-appimage + appimage: true requires: - - build-all - - build-macos - build-appimage filters: branches: diff --git a/.circleci/template.yml b/.circleci/template.yml index 482eb72bf..ff5beeff1 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -115,7 +115,7 @@ jobs: command: | git --no-pager diff go.mod go.sum git --no-pager diff --quiet go.mod go.sum - build-all: + build-linux: executor: golang steps: - install-deps @@ -536,6 +536,19 @@ jobs: publish: description: publish binary artifacts executor: ubuntu + parameters: + linux: + default: false + description: publish linux binaries? + type: boolean + darwin: + default: false + description: publish darwin binaries? + type: boolean + appimage: + default: false + description: publish appimage binaries? + type: boolean steps: - run: name: Install git jq curl @@ -546,12 +559,21 @@ jobs: - install_ipfs - attach_workspace: at: "." - - run: - name: Create bundles - command: ./scripts/build-bundle.sh - - run: - name: Publish release - command: ./scripts/publish-release.sh + - when: + condition: << parameters.linux >> + steps: + - run: ./scripts/build-arch-bundle.sh linux + - run: ./scripts/publish-arch-release.sh linux + - when: + condition: << parameters.darwin>> + steps: + - run: ./scripts/build-arch-bundle.sh darwin + - run: ./scripts/publish-arch-release.sh darwin + - when: + condition: << parameters.appimage >> + steps: + - run: ./scripts/build-appimage-bundle.sh + - run: ./scripts/publish-arch-release.sh appimage publish-snapcraft: description: build and push snapcraft @@ -568,11 +590,6 @@ jobs: - run: name: install snapcraft command: sudo snap install snapcraft --classic - - run: - name: create snapcraft config file - command: | - mkdir -p ~/.config/snapcraft - echo "$SNAPCRAFT_LOGIN_FILE" | base64 -d > ~/.config/snapcraft/snapcraft.cfg - run: name: build snap command: snapcraft --use-lxd @@ -800,7 +817,7 @@ workflows: only: - master - build-debug - - build-all: + - build-linux: filters: tags: only: @@ -822,6 +839,18 @@ workflows: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - build-appimage: + filters: + branches: + only: + - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + - publish: + name: publish-macos + darwin: true + requires: + - build-macos filters: branches: ignore: @@ -830,9 +859,21 @@ workflows: only: - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - publish: + name: publish-linux + linux: true + requires: + - build-linux + filters: + branches: + ignore: + - /.*/ + tags: + only: + - /^v\d+\.\d+\.\d+(-rc\d+)?$/ + - publish: + name: publish-appimage + appimage: true requires: - - build-all - - build-macos - build-appimage filters: branches: diff --git a/scripts/build-bundle.sh b/scripts/build-appimage-bundle.sh similarity index 52% rename from scripts/build-bundle.sh rename to scripts/build-appimage-bundle.sh index fe1c88611..0d6f8ab40 100755 --- a/scripts/build-bundle.sh +++ b/scripts/build-appimage-bundle.sh @@ -1,11 +1,6 @@ #!/usr/bin/env bash set -ex -ARCHS=( - "darwin" - "linux" -) - REQUIRED=( "ipfs" "sha512sum" @@ -31,24 +26,6 @@ PID="$!" trap "kill -9 ${PID}" EXIT sleep 30 -for ARCH in "${ARCHS[@]}" -do - mkdir -p "${ARCH}/lotus" - pushd "${ARCH}" - for BINARY in "${BINARIES[@]}" - do - cp "../../${ARCH}/${BINARY}" "lotus/" - chmod +x "lotus/${BINARY}" - done - - tar -zcvf "../lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz" lotus - popd - rm -rf "${ARCH}" - - sha512sum "lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz" > "lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz.sha512" - - ipfs add -q "lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz" > "lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz.cid" -done cp "../appimage/Lotus-${CIRCLE_TAG}-x86_64.AppImage" . sha512sum "Lotus-${CIRCLE_TAG}-x86_64.AppImage" > "Lotus-${CIRCLE_TAG}-x86_64.AppImage.sha512" ipfs add -q "Lotus-${CIRCLE_TAG}-x86_64.AppImage" > "Lotus-${CIRCLE_TAG}-x86_64.AppImage.cid" diff --git a/scripts/build-arch-bundle b/scripts/build-arch-bundle new file mode 100755 index 000000000..27b4218f5 --- /dev/null +++ b/scripts/build-arch-bundle @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +set -ex + +ARCH=$1 + +REQUIRED=( + "ipfs" + "sha512sum" +) +for REQUIRE in "${REQUIRED[@]}" +do + command -v "${REQUIRE}" >/dev/null 2>&1 || echo >&2 "'${REQUIRE}' must be installed" +done + +mkdir bundle +pushd bundle + +BINARIES=( + "lotus" + "lotus-miner" + "lotus-worker" +) + +export IPFS_PATH=`mktemp -d` +ipfs init +ipfs daemon & +PID="$!" +trap "kill -9 ${PID}" EXIT +sleep 30 + +mkdir -p "${ARCH}/lotus" +pushd "${ARCH}" +for BINARY in "${BINARIES[@]}" +do + cp "../../${ARCH}/${BINARY}" "lotus/" + chmod +x "lotus/${BINARY}" +done + +tar -zcvf "../lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz" lotus +popd +rm -rf "${ARCH}" + +sha512sum "lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz" > "lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz.sha512" + +ipfs add -q "lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz" > "lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz.cid" +popd diff --git a/scripts/publish-release.sh b/scripts/publish-arch-release.sh similarity index 92% rename from scripts/publish-release.sh rename to scripts/publish-arch-release.sh index 22572de60..b47ad53fe 100755 --- a/scripts/publish-release.sh +++ b/scripts/publish-arch-release.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash set -e +ARCH=$1 + pushd bundle # make sure we have a token set, api requests won't work otherwise @@ -61,23 +63,35 @@ fi RELEASE_UPLOAD_URL=`echo "${RELEASE_RESPONSE}" | jq -r '.upload_url' | cut -d'{' -f1` echo "Preparing to send artifacts to ${RELEASE_UPLOAD_URL}" +if [ $ARCH = 'linux' ]; then artifacts=( "lotus_${CIRCLE_TAG}_linux-amd64.tar.gz" "lotus_${CIRCLE_TAG}_linux-amd64.tar.gz.cid" "lotus_${CIRCLE_TAG}_linux-amd64.tar.gz.sha512" +) +elif [ $ARCH = 'darwin' ]; then +artifacts=( "lotus_${CIRCLE_TAG}_darwin-amd64.tar.gz" "lotus_${CIRCLE_TAG}_darwin-amd64.tar.gz.cid" "lotus_${CIRCLE_TAG}_darwin-amd64.tar.gz.sha512" +) +elif [ $ARCH = 'appimage' ]; then +artifacts=( "Lotus-${CIRCLE_TAG}-x86_64.AppImage" "Lotus-${CIRCLE_TAG}-x86_64.AppImage.cid" "Lotus-${CIRCLE_TAG}-x86_64.AppImage.sha512" ) +else + echo "$1 is not a supported architecture to publish a release for" 1>&2 + exit 1 +fi for RELEASE_FILE in "${artifacts[@]}" do echo "Uploading ${RELEASE_FILE}..." curl \ --request POST \ + --fail \ --header "Authorization: token ${GITHUB_TOKEN}" \ --header "Content-Type: application/octet-stream" \ --data-binary "@${RELEASE_FILE}" \ From 1d55066029dd1ba2cb1fe5f86a5805fcb01eea58 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Sun, 24 Jul 2022 22:20:35 -0700 Subject: [PATCH 07/19] Removed unused array --- scripts/build-appimage-bundle.sh | 6 ------ 1 file changed, 6 deletions(-) diff --git a/scripts/build-appimage-bundle.sh b/scripts/build-appimage-bundle.sh index 0d6f8ab40..d99b459b9 100755 --- a/scripts/build-appimage-bundle.sh +++ b/scripts/build-appimage-bundle.sh @@ -13,12 +13,6 @@ done mkdir bundle pushd bundle -BINARIES=( - "lotus" - "lotus-miner" - "lotus-worker" -) - export IPFS_PATH=`mktemp -d` ipfs init ipfs daemon & From 3feb9167cbbdbfd36be30abb05490cc9cb92f096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 1 Aug 2022 16:58:05 +0200 Subject: [PATCH 08/19] feat: wdpost: Envvar for limiting recovering sectors --- storage/wdpost/wdpost_run_faults.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/storage/wdpost/wdpost_run_faults.go b/storage/wdpost/wdpost_run_faults.go index 60352e8b8..b5a52c1ed 100644 --- a/storage/wdpost/wdpost_run_faults.go +++ b/storage/wdpost/wdpost_run_faults.go @@ -2,6 +2,8 @@ package wdpost import ( "context" + "os" + "strconv" "github.com/ipfs/go-cid" "go.opencensus.io/trace" @@ -19,6 +21,18 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) +var recoveringSectorLimit int64 = 0 + +func init() { + if rcl := os.Getenv("LOTUS_RECOVERING_SECTOR_LIMIT"); rcl != "" { + var err error + recoveringSectorLimit, err = strconv.ParseInt(rcl, 10, 64) + if err != nil { + log.Errorw("parsing LOTUS_RECOVERING_SECTOR_LIMIT", "error", err) + } + } +} + // declareRecoveries identifies sectors that were previously marked as faulty // for our miner, but are now recovered (i.e. are now provable again) and // still not reported as such. @@ -90,6 +104,11 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 Sectors: recovered, }) + if recoveringSectorLimit > 0 && int64(totalRecoveries) >= recoveringSectorLimit { + log.Errorw("reached recovering sector limit, not all sectors will be marked as recovered") + break + } + totalRecoveries++ } From 0b5d2abc3d9c9d648070b03b0e028f3c19db633d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 1 Aug 2022 17:15:26 +0200 Subject: [PATCH 09/19] feat: mpool: Include gaslimit in error msg in ValidForBlockInclusion --- chain/types/message.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/types/message.go b/chain/types/message.go index 5b2aad47e..547d4c353 100644 --- a/chain/types/message.go +++ b/chain/types/message.go @@ -196,7 +196,7 @@ func (m *Message) ValidForBlockInclusion(minGas int64, version network.Version) } if m.GasLimit > build.BlockGasLimit { - return xerrors.New("'GasLimit' field cannot be greater than a block's gas limit") + return xerrors.Errorf("'GasLimit' field cannot be greater than a block's gas limit (%d > %d)", m.GasLimit, build.BlockGasLimit) } // since prices might vary with time, this is technically semantic validation From c42d43bf44992206bd20af8e1a5162388b2078b4 Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 1 Aug 2022 14:29:46 -0400 Subject: [PATCH 10/19] fix: sector counter for recovery --- storage/wdpost/wdpost_run_faults.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/storage/wdpost/wdpost_run_faults.go b/storage/wdpost/wdpost_run_faults.go index b5a52c1ed..32f0d96a6 100644 --- a/storage/wdpost/wdpost_run_faults.go +++ b/storage/wdpost/wdpost_run_faults.go @@ -58,7 +58,7 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 var batchedRecoveryDecls [][]miner.RecoveryDeclaration batchedRecoveryDecls = append(batchedRecoveryDecls, []miner.RecoveryDeclaration{}) - totalRecoveries := 0 + totalSectorsToRecover := uint64(0) for partIdx, partition := range partitions { unrecovered, err := bitfield.SubtractBitField(partition.FaultySectors, partition.RecoveringSectors) @@ -104,15 +104,17 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 Sectors: recovered, }) - if recoveringSectorLimit > 0 && int64(totalRecoveries) >= recoveringSectorLimit { - log.Errorw("reached recovering sector limit, not all sectors will be marked as recovered") + totalSectorsToRecover += recoveredCount + + if recoveringSectorLimit > 0 && int64(totalSectorsToRecover) >= recoveringSectorLimit { + log.Errorf("reached recovering sector limit %d, only marking %d sectors for recovery now", + recoveringSectorLimit, + totalSectorsToRecover) break } - - totalRecoveries++ } - if totalRecoveries == 0 { + if totalSectorsToRecover == 0 { if faulty != 0 { log.Warnw("No recoveries to declare", "deadline", dlIdx, "faulty", faulty) } @@ -120,6 +122,7 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 return nil, nil, nil } + log.Infof("attempting recovery declarations for %d sectors", totalSectorsToRecover) var msgs []*types.SignedMessage for _, recovery := range batchedRecoveryDecls { params := &miner.DeclareFaultsRecoveredParams{ @@ -141,7 +144,6 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 if err := s.prepareMessage(ctx, msg, spec); err != nil { return nil, nil, err } - sm, err := s.api.MpoolPushMessage(ctx, msg, &api.MessageSendSpec{MaxFee: abi.TokenAmount(s.feeCfg.MaxWindowPoStGasFee)}) if err != nil { return nil, nil, xerrors.Errorf("pushing message to mpool: %w", err) From 795924b872696277aeb3f84532b242c8b4c031e0 Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 2 Aug 2022 21:30:18 +0200 Subject: [PATCH 11/19] v1.17.0 prep v1.17.0 prep --- CHANGELOG.md | 47 +++++++++++++-------------- build/openrpc/full.json.gz | Bin 28036 -> 28033 bytes build/openrpc/gateway.json.gz | Bin 4893 -> 4889 bytes build/openrpc/miner.json.gz | Bin 13875 -> 13871 bytes build/openrpc/worker.json.gz | Bin 4764 -> 4760 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 9 files changed, 27 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bd084505..bdd6ef8b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Lotus changelog -# v1.17.0-rc4 / 2022-07-22 +# v1.17.0 / 2022-08-02 -This is the fourth release candidate of the OPTIONAL release 1.17.0. This feature release introduces a lot of new sealing and scheduler improvements, and many other functionalities and bug fixes. +This is an optional release of Lotus. This feature release introduces a lot of new sealing and scheduler improvements, and many other functionalities and bug fixes. ## New features @@ -21,7 +21,7 @@ This is the fourth release candidate of the OPTIONAL release 1.17.0. This featur - feat: precommits info ([filecoin-project/lotus#8696](https://github.com/filecoin-project/lotus/pull/8696)) - Check the on-chain precommit info with the `lotus-miner sectors precommits` command. - feat: dagstore: add dagstore register-shard command ([filecoin-project/lotus#8645](https://github.com/filecoin-project/lotus/pull/8645)) - - If you have broken indexes in your market’s datastore, you can try to recover it by using `lotus-miner dagstore register-shard`. [Link to documentation](https://lotus.filecoin.io/kb/dagstore-register/) + - If you have broken indexes in your market’s dagstore, you can try to recover it by using `lotus-miner dagstore register-shard`. [Link to documentation](https://lotus.filecoin.io/kb/dagstore-register/) - feat: Implement cli command for compactPartitions ([filecoin-project/lotus#8637](https://github.com/filecoin-project/lotus/pull/8637)) - Remove dead sectors from partitions and reduce the number of partitions used if possible with the `lotus-miner sectors compact-partitions`command. [Link to documentation](https://lotus.filecoin.io/storage-providers/operate/daily-chores/#compacting-partitions) - feat: recovery: Config for maximum partition count per message ([filecoin-project/lotus#8986](https://github.com/filecoin-project/lotus/pull/8986) @@ -30,6 +30,7 @@ This is the fourth release candidate of the OPTIONAL release 1.17.0. This featur - Adds config for setting the maximum amount of partitions to prove in a SubmitWindowPoSt message [Link to documentation](https://lotus.filecoin.io/storage-providers/seal-workers/post-workers/#multiple-partitions) - feat: sealer: Config for disabling builtin PoSt / PoSt pre-checks ([filecoin-project/lotus#8959](https://github.com/filecoin-project/lotus/pull/8959)) - Adds the ability to fully disable PoSt tasks on the `lotus-miner` and disabling windowPoSt pre-checks. [Link to documentation](https://lotus.filecoin.io/storage-providers/advanced-configurations/workers/#post-computations) +- feat: add create ledger wallet address by account index command ([filecoin-project/lotus#8657](https://github.com/filecoin-project/lotus/pull/8657)) ## Improvements @@ -38,8 +39,19 @@ This is the fourth release candidate of the OPTIONAL release 1.17.0. This featur - feat: networking: add healthz and livez endpoints ([filecoin-project/lotus#8692](https://github.com/filecoin-project/lotus/pull/8692)) - feat: Snap Deals full unseal ([filecoin-project/lotus#8478](https://github.com/filecoin-project/lotus/pull/8478)) - feat: cli: Hide sector nums in 'proving deadline' by default ([filecoin-project/lotus#8952](https://github.com/filecoin-project/lotus/pull/8952)) +- feat: Add rate limiting to the lotus gateway ([filecoin-project/lotus#8517](https://github.com/filecoin-project/lotus/pull/8517)) - feat: networking: disconnect cmd ([filecoin-project/lotus#8955](https://github.com/filecoin-project/lotus/pull/8955)) - feat: dagstore: Add DestroyShard() in dagstore wrapper ([filecoin-project/lotus#9010](https://github.com/filecoin-project/lotus/pull/9010)) +- feat: shed: report the "user version" ([filecoin-project/lotus#8864](https://github.com/filecoin-project/lotus/pull/8864)) +- feat: lotus-shed get remote peer hello message ([filecoin-project/lotus#8787](https://github.com/filecoin-project/lotus/pull/8787)) +- feat: only enable rcmgr by default in full nodes ([filecoin-project/lotus#8769](https://github.com/filecoin-project/lotus/pull/8769)) +- feat: refactor: actor bundling system (#8838) ([filecoin-project/lotus#8838](https://github.com/filecoin-project/lotus/pull/8838)) +- feat: migration: Implement function to migrate actors with only code changes ([filecoin-project/lotus#8843](https://github.com/filecoin-project/lotus/pull/8843)) +- feat: conformance & tvx: support ReportConsensusFault messages ([filecoin-project/lotus#8302](https://github.com/filecoin-project/lotus/pull/8302)) +- ux: print absolute time for proving period start in proving cli ([filecoin-project/lotus#8954](https://github.com/filecoin-project/lotus/pull/8954)) +- chore: storage refactors part 1 ([filecoin-project/lotus#8858](https://github.com/filecoin-project/lotus/pull/8858)) +- chore: sealing pipeline: Remove adapter code (storage refactors part 2) ([filecoin-project/lotus#8871](https://github.com/filecoin-project/lotus/pull/8871)) +- refactor: remove old BlockSyncProtocolID ([filecoin-project/lotus#8820](https://github.com/filecoin-project/lotus/pull/8820)) ## Bug Fixes @@ -53,15 +65,21 @@ This is the fourth release candidate of the OPTIONAL release 1.17.0. This featur - fix: bench: consistency in description ([filecoin-project/lotus#8777](https://github.com/filecoin-project/lotus/pull/8777)) - fix: worker: don't log normal storage stat calls ([filecoin-project/lotus#8744](https://github.com/filecoin-project/lotus/pull/8744)) - fix: worker: don't check params with --no-default when not needed ([filecoin-project/lotus#8741](https://github.com/filecoin-project/lotus/pull/8741)) +- fix: Deduplicate parallel stat requests ([filecoin-project/lotus#8589](https://github.com/filecoin-project/lotus/pull/8589)) +- fix: Delegate storage auth on market nodes ([filecoin-project/lotus#8978](https://github.com/filecoin-project/lotus/pull/8978)) - fix: post workers: check proving params on startup ([filecoin-project/lotus#8736](https://github.com/filecoin-project/lotus/pull/8736)) - fix: rpc: readd rpc.discover aliases; lotus-gateway openrpc ([filecoin-project/lotus#8738](https://github.com/filecoin-project/lotus/pull/8738)) +- fix: change 1475 bootstrap peer ([filecoin-project/lotus#9008](https://github.com/filecoin-project/lotus/pull/9008)) - fix: verifreg: update deprecation log ([filecoin-project/lotus#8690](https://github.com/filecoin-project/lotus/pull/8690)) - fix: vm: support raw blocks in chain export ([filecoin-project/lotus#8691](https://github.com/filecoin-project/lotus/pull/8691)) - fix: deps: restore butterfly network genesis from v1.14.4 ([filecoin-project/lotus#8708](https://github.com/filecoin-project/lotus/pull/8708)) +- fix: improve error message when maxPrice is too low ([filecoin-project/lotus#8818](https://github.com/filecoin-project/lotus/pull/8818)) - fix: msig cli: Check for existing signers in add-propose ([filecoin-project/lotus#8833](https://github.com/filecoin-project/lotus/pull/8833)) +- Add new proofs version type ([filecoin-project/lotus#8848](https://github.com/filecoin-project/lotus/pull/8848)) +- fix: Make cli deal command get Block Delay specific to build ([filecoin-project/lotus#8896](https://github.com/filecoin-project/lotus/pull/8896)) - fix: cli: Break out of retrieval if provider cancels ([filecoin-project/lotus#8912](https://github.com/filecoin-project/lotus/pull/8912)) - fix: appimage build ([filecoin-project/lotus#8931](https://github.com/filecoin-project/lotus/pull/8931)) -- fix: Make cli deal command get Block Delay specific to build ([filecoin-project/lotus#8896](https://github.com/filecoin-project/lotus/pull/8896)) +- fix: incorrect usage of peer.IDFromString (should be peer.Decode) ([filecoin-project/lotus#8993](https://github.com/filecoin-project/lotus/pull/8993)) - fix: deps: update FFI to fix a slow memory leak ([filecoin-project/lotus#9044](https://github.com/filecoin-project/lotus/pull/9044)) - fix: sealing: hacky sealing fix backport ([filecoin-project/lotus#9055](https://github.com/filecoin-project/lotus/pull/9055)) @@ -83,36 +101,17 @@ This is the fourth release candidate of the OPTIONAL release 1.17.0. This featur - github.com/filecoin-project/specs-actors/v8 (null -> v8.0.1) - github.com/filecoin-project/specs-storage (v0.2.4 -> v0.4.1) - github.com/filecoin-project/storetheindex (v0.3.5 -> v0.4.17) +- deps: libp2p: update to the latest golibp2p tag ([filecoin-project/lotus#8704](https://github.com/filecoin-project/lotus/pull/8704)) - chore: update and fix libp2p ([filecoin-project/lotus#8996](https://github.com/filecoin-project/lotus/pull/8996)) ## Others -- chore: storage refactors part 1 ([filecoin-project/lotus#8858](https://github.com/filecoin-project/lotus/pull/8858)) - chore: fix imports conflict ([filecoin-project/lotus#8863](https://github.com/filecoin-project/lotus/pull/8863)) - chore: Fix imports ([filecoin-project/lotus#8859](https://github.com/filecoin-project/lotus/pull/8859)) - chore: backport: release v1.16.0 back to master ([filecoin-project/lotus#8855](https://github.com/filecoin-project/lotus/pull/8855)) -- chore: improve error message when maxPrice is too low ([filecoin-project/lotus#8818](https://github.com/filecoin-project/lotus/pull/8818)) - chore: bundle: remove wrongly committed bundle cars ([filecoin-project/lotus#8762](https://github.com/filecoin-project/lotus/pull/8762)) -- chore: storage refactors part 1 ([filecoin-project/lotus#8858](https://github.com/filecoin-project/lotus/pull/8858)) -- chore: sealing pipeline: Remove adapter code (storage refactors part 2) ([filecoin-project/lotus#8871](https://github.com/filecoin-project/lotus/pull/8871)) -- deps: libp2p: update to the latest golibp2p tag ([filecoin-project/lotus#8704](https://github.com/filecoin-project/lotus/pull/8704)) -- feat: shed: report the "user version" ([filecoin-project/lotus#8864](https://github.com/filecoin-project/lotus/pull/8864)) -- feat: Add rate limiting to the lotus gateway ([filecoin-project/lotus#8517](https://github.com/filecoin-project/lotus/pull/8517)) -- feat: lotus-shed get remote peer hello message ([filecoin-project/lotus#8787](https://github.com/filecoin-project/lotus/pull/8787)) -- feat: refactor: actor bundling system (#8838) ([filecoin-project/lotus#8838](https://github.com/filecoin-project/lotus/pull/8838)) -- feat: add create ledger wallet address by account index command ([filecoin-project/lotus#8657](https://github.com/filecoin-project/lotus/pull/8657)) -- feat: conformance & tvx: support ReportConsensusFault messages ([filecoin-project/lotus#8302](https://github.com/filecoin-project/lotus/pull/8302)) -- feat: migration: Implement function to migrate actors with only code changes ([filecoin-project/lotus#8843](https://github.com/filecoin-project/lotus/pull/8843)) -- feat: only enable rcmgr by default in full nodes ([filecoin-project/lotus#8769](https://github.com/filecoin-project/lotus/pull/8769)) - docs:sealing:fix default miner config comments ([filecoin-project/lotus#8689](https://github.com/filecoin-project/lotus/pull/8689)) - ci: deps: Use testground-github-action from testground org ([filecoin-project/lotus#8490](https://github.com/filecoin-project/lotus/pull/8490)) -- ux: print absolute time for proving period start in proving cli ([filecoin-project/lotus#8954](https://github.com/filecoin-project/lotus/pull/8954)) -- fix incorrect usage of peer.IDFromString (should be peer.Decode) ([filecoin-project/lotus#8993](https://github.com/filecoin-project/lotus/pull/8993)) -- fix: Delegate storage auth on market nodes ([filecoin-project/lotus#8978](https://github.com/filecoin-project/lotus/pull/8978)) -- Add new proofs version type ([filecoin-project/lotus#8848](https://github.com/filecoin-project/lotus/pull/8848)) -- refactor: remove old BlockSyncProtocolID ([filecoin-project/lotus#8820](https://github.com/filecoin-project/lotus/pull/8820)) -- stores: Deduplicate parallel stat requests ([filecoin-project/lotus#8589](https://github.com/filecoin-project/lotus/pull/8589)) -- change 1475 bootstrap peer ([filecoin-project/lotus#9008](https://github.com/filecoin-project/lotus/pull/9008)) Contributors diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index b07d5b7a32e11a78873e52727b155b948d3e1577..18b16911bd71ada61a60c4c4c2be76c3db220b01 100644 GIT binary patch literal 28033 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 literal 28036 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 delta 4811 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 delta 13856 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 BHSPca delta 4675 zcmV-J61?r0C7dOYgn#A4HFRk$OAAEjw&_V{H%}6Q3zqdaY$3zOr1Q}P~zDB}C~?=$z9!H`~2O?iF>H27M2rZ0{Te7&f8k2knf5|I5JX0*~4* zoYDx`-}a0)8RrF;m=o8T{(Hf7tYD z={UAak;(F`**{^nobul}3TrxRCTk88{QWIi-;(d&ze}>@Ef)*uuB0lwdea$3gO486p>n9r$ZS;f}EM5rXw9ZTdbEy~IcrAxb~5?MD1 zs`!DxZ-12f0%p*XG6?=V$@wSxPuj~@#L70Zx6kjhvqTg6VuY0WMnD6afp9dr6j-t|gsGb4nfW?DTZzC+QgW z;&d9ah7-rNnOvt9V<4v!%buJrphuB=3LSjvxPSJK)&I>9>CEi^_`Ro&2CPk4?!gRe zj7?7J5#}ml9z`rdJ&Z+!wKhc}wvCE7L_T-eRuXgytIE42HBpKe>AJH>D_pm5-NJR( z;kq?tnD4rOC2(RPUe_Jw%5mNA!MllVTV)xLZ*Uo}}g3J!?#+bHaza z?SGqTNz5~{dku1eiezAF8Os4?eMBtH*t>>>S}Nx)`=e(+)Y@&eL%_&6SU_-ObY z|J61TCw1_JZHhQVJt0C5BJ@y!5G6IgIciq}uggXjvNl>t>m(0B3zL}?6Uw8m|D?`1 zLCix`lWSo=puL3>Y*Vn!*TyzArGO$}0)H+16I~+5!Unu{Oh|cGEON`>U%uGBxrAiK zO$G9VXp9;Zw75LNASl9{qzDg#^dWf=-QgvDK14jPub#l3aqt~Mnt8{x% z-+q0z=i-L|UIDzX4S4l#Iq-&Ku^-|FnU4jvL8(n+?52$ZTw7+U0$c^S3UC$RdVf4{ z?Wy_T`UMf>LK z=ajkisqHS12_`E5!Qa8AT^T?ywtr1zfOn5`Y|H^BCT2}!bu5+^#RhwO;y~jbnVVWz zXT1lIm;i#WEY%!(^G-4t|0JCKE<@Wr%th7r=OnX6) z=OyUCR9ujz&_)SD!QeEu+&XMz8(mC|8r%b@D2=QY z@6h?G6YwkKdr^BToed)&yMKWb*?*19ap3#wKv`MZig9a~vhIk*AGO;jgNI%x;@u*T+)R|Awt7vakok5J!{Q{WK=B!E8YA~i=t|v%> zLbVMJpB_JakXrNAN;wlv!%hh&%}H8?oo;ZzH@z(?Fwf%u`m~}fsekl8#8UqE>eJjH z|20Sd`tZS5^?U3%tSvW%J|8+KQ=5|ju`Kx?N~OO6Whu+p2zy^G^0q0Ci-ClaHu4=+o^WL|vv{H^bF%-m zJ-VrisVR7X){^1n`Ha{uxJd7LKelhj7uR0!>x=*ECMm#Osw&6!=;?!U`smL+oycsJa5D21Eo|0QRndpC^cDU{ zKKOEReNC~2f5M>4x_+7q=rWYFu(!y0^yT7OI#Xon6ZBAC4P%=aOV>q&N@vPimbxiX zhT3r0SCZ0fo`2OSP`sYBOlnG|t}@UDdUvSm39-8UuF~(S1Fc`HWZT-5T<5W&_G zCba$_&wt;L)>oYZ97XHXAkZqUPeVY9v_1v^hP_x|dfKfQ05Xq`4FFXIdVT0qx0{}IRT@AB<=7g(Z4$zcvSpZN)(C4kJ2W-SsY7REm zwH}}j7;tfLF2}a5Mv`x*l*W1AmCYf(a=!uqom~A}%E2LLx3C;zDmM zE;RMeRnGDLT}2=E2L041htF!9zvN?l8UT(fP1f}vQ<`iD=$O)EV?M`}Chg6SD^1#= zA6J^JD?g?**^tgLrOC!{jwembJ3B6FCUE~I82V7@X-Yquq%}@ewi>g`WA~M=I_l|a zSAS2ksKl(Te%UHIa8*%zBW0+o!&Jv<16>=AdYV3{o2!(FC-^xRKW~lBr~P}YbUx$m z+obck{{N7;eU6v~futh>KxK&ZeHb7Y*Ud>TK&Nxj`U^Vgl8Re@F3JzEQ zy0M@Z^{*jr-=O+u7=O#uKMe})QvU=h*nbbm4eo1L`rqz~eLY7D;ER1dVqcHg*CY1z z9BW@s4j70%KF=~!5PN)Dyv0H6@ezA`#2%jjB3v{>#Pg2@x<@OqkZ`1#g4pUKw)(uJ zrG!>#z1Zq=@Jt~wNf0O?P(Yx7KmmaQZwv*Ng#8lkpWFSnW@m-iO(b>`iQPmk(tr7O z?FIFY^iUfTb=&C%?4PJEn4r(8O`|4n-PhbxYC0Y80@N7mC=qJ1j7C*EW#nT_Mj4behZJ6Pfc( zf4RhF=lZ&wiY5yxvHDGEe1CSHmNVbrgNzK>T>ow-z$yav6g>K^240X~2D9*nIx|dY zt-#|PkucpYaf14QN1;o-TXLW$*)%#cJn=UbuAr*K78<#tYB&DB4l`3ng=Y4EE`vqw z;0m+s%w?yorAy$QHyYUNjIrro8@c_hN546zk2wN0HI2+~`?KB%DSxJwFKb#E>h$he zWbQ?U$+E`S1TL%ILxeI{=OJr)5~P_h;$(znK+|-Q=OGi|O=%r)PML$8+U^3GV6p-b z{EgfINFW&7CNjXg$2m6U0233lCbBvfON(NIy*+WDagWSREz}S7Kw<(2zOqzv=*>IH zNp3xtS;ja}NULhN*nd-uOgly5{)Plw7WDazcQ9dApN}xBIfR)tQIO`A*uEgmZ=3)K()H}beD;5dECfAt?QiZ!CVwaMPvz!i{qfb-OGswC zo2F9LH$~vHtrVN5T4t_oAnX}!uDWaB&*{`dl#P_C%hDD8iGttzukJ@BR_XSjzGq#R z7XT{&_O$_QUo8UIh5f+0A34ZW1gCIy7pcNTc zEULj*#X&wAsMlm_}TyHf=R793b`;Dcd$sOQ7<6@u2-zkiN^ccW!2Coe=9a*{;ptx zJkMWUW{-W0ga*YAD3d}@V|!}tIjCfeP2LsfSW}vU{A6#56=nhcrQn~nkZL>EKRtf< z(9F*Cy>_3ME!CD<`wMSvcKK7Vxnr@piff-+@Tlk*H|sJr4F}^xb(Y8JjklHajcB|Z zcyiVmbbk@#T#)mZOwLEWUF4j1-)Ai6{-5w zNkm%2x|tv%Em3(xtE#S}(4-%r3e0;F2Z~@(W z4}Z`(imU>900r+(BkSmZKWqx<9I}6~2RuY6CbL_zfGa@ZJpvF+(IfDXVH48>)CSDG z!x^NA{XwC3516`}ORL6D9ayhcGAgE_G1d?r%PPJlsBAO6f^%@fuUI~srhk$xui+$f z7f-ibOlD>FlPu?8Bg%+XY)Q4vi~Q(NC4YoSoON91VO?)dtNR7tcmD;w`_F;zldcBv>D0>Nbi2Tz1|v?4PiyVF+*xJ7owv@|lUvnPM2?Y`Hv zz4Fk}sNl1sVArs}y2)uhv7GxaoLmzJnkF(ottdJtCi=1Y{wR9mS8#=YBLBOi+`S>a zJr9JBwV3F2dPY3O=O?ZJCp7hPm=5Y8&@ZO!dMfB{VNg!Nu;jQZ;fR zUr|?WpErb~T6d@`dn0K}6|!5f)BPL7^j}MiD5pwp^5rUJVF+xK?a&BVygdGV_1ji8 zv25es14}}&1?U{P2tXGB60FsEz+DpJukanHv2QIT)mI17dVRP4{{R30|NqlPqVOvk F0RTvr9>)Lx diff --git a/build/version.go b/build/version.go index 5b0688405..481730c42 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.17.0-rc4" +const BuildVersion = "1.17.0" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index d5d8f9a4a..8f9c1316e 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.17.0-rc4 + 1.17.0 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 0e729cd88..d4d50088c 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.17.0-rc4 + 1.17.0 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 230ee02f5..bfda48e00 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.17.0-rc4 + 1.17.0 COMMANDS: daemon Start a lotus daemon process From 0ac4dec694ede0f54ed8c894f504391ca4c68157 Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 2 Aug 2022 21:42:08 +0200 Subject: [PATCH 12/19] Add PR 9106 to the changelog Add PR 9106 to the changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bdd6ef8b7..3705ace40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ This is an optional release of Lotus. This feature release introduces a lot of n - feat: refactor: actor bundling system (#8838) ([filecoin-project/lotus#8838](https://github.com/filecoin-project/lotus/pull/8838)) - feat: migration: Implement function to migrate actors with only code changes ([filecoin-project/lotus#8843](https://github.com/filecoin-project/lotus/pull/8843)) - feat: conformance & tvx: support ReportConsensusFault messages ([filecoin-project/lotus#8302](https://github.com/filecoin-project/lotus/pull/8302)) +- feat: wdpost: Envvar for limiting recovering sectors ([filecoin-project/lotus#9106](https://github.com/filecoin-project/lotus/pull/9106)) - ux: print absolute time for proving period start in proving cli ([filecoin-project/lotus#8954](https://github.com/filecoin-project/lotus/pull/8954)) - chore: storage refactors part 1 ([filecoin-project/lotus#8858](https://github.com/filecoin-project/lotus/pull/8858)) - chore: sealing pipeline: Remove adapter code (storage refactors part 2) ([filecoin-project/lotus#8871](https://github.com/filecoin-project/lotus/pull/8871)) From a7e525584810aaee9e2db376ee131bd46e0ee759 Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 2 Aug 2022 22:03:25 +0200 Subject: [PATCH 13/19] Add callout for Boost Add callout for Boost --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3705ace40..908276fe5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ This is an optional release of Lotus. This feature release introduces a lot of new sealing and scheduler improvements, and many other functionalities and bug fixes. +PSA: Markets related features, enhancements and fixes is now lower priority for Lotus, and is going to be in the hands of ([Boost](https://boost.filecoin.io)), built by the amazing ([Bedrock team](https://www.notion.so/pl-strflt/Bedrock-2e956d5d8143432080a1d84435ccf0ff)). You can find Lotus mission scope in the ([Lotus Roadmap])(https://www.notion.so/Lotus-8352bbb6c321431abd8790a7a3401ed3#805c645f592840ad893c272723362d3d)) + ## New features - feat: worker: lotus-worker run --no-default ([filecoin-project/lotus#8672](https://github.com/filecoin-project/lotus/pull/8672)) From 0568f6c875837fcb03956fb8ab2e8a0851ae16b3 Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 2 Aug 2022 22:05:10 +0200 Subject: [PATCH 14/19] Fix Lotus mission scope link Fix Lotus mission scope link --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 908276fe5..021b15188 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This is an optional release of Lotus. This feature release introduces a lot of new sealing and scheduler improvements, and many other functionalities and bug fixes. -PSA: Markets related features, enhancements and fixes is now lower priority for Lotus, and is going to be in the hands of ([Boost](https://boost.filecoin.io)), built by the amazing ([Bedrock team](https://www.notion.so/pl-strflt/Bedrock-2e956d5d8143432080a1d84435ccf0ff)). You can find Lotus mission scope in the ([Lotus Roadmap])(https://www.notion.so/Lotus-8352bbb6c321431abd8790a7a3401ed3#805c645f592840ad893c272723362d3d)) +PSA: Markets related features, enhancements and fixes is now lower priority for Lotus, and is going to be in the hands of ([Boost](https://boost.filecoin.io)), built by the amazing ([Bedrock team](https://www.notion.so/pl-strflt/Bedrock-2e956d5d8143432080a1d84435ccf0ff)). You can find Lotus mission scope in the (([Lotus Roadmap])(https://www.notion.so/Lotus-8352bbb6c321431abd8790a7a3401ed3#805c645f592840ad893c272723362d3d)) ## New features From 61b0fa9d9e513791794ec072366f472554cba98b Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 2 Aug 2022 22:07:48 +0200 Subject: [PATCH 15/19] Properly fix Lotus link Properly fix Lotus link --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 021b15188..d1f7fda5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This is an optional release of Lotus. This feature release introduces a lot of new sealing and scheduler improvements, and many other functionalities and bug fixes. -PSA: Markets related features, enhancements and fixes is now lower priority for Lotus, and is going to be in the hands of ([Boost](https://boost.filecoin.io)), built by the amazing ([Bedrock team](https://www.notion.so/pl-strflt/Bedrock-2e956d5d8143432080a1d84435ccf0ff)). You can find Lotus mission scope in the (([Lotus Roadmap])(https://www.notion.so/Lotus-8352bbb6c321431abd8790a7a3401ed3#805c645f592840ad893c272723362d3d)) +PSA: Markets related features, enhancements and fixes is now lower priority for Lotus, and is going to be in the hands of ([Boost](https://boost.filecoin.io)), built by the amazing ([Bedrock team](https://www.notion.so/pl-strflt/Bedrock-2e956d5d8143432080a1d84435ccf0ff)). You can find Lotus mission scope in the ([Lotus Roadmap](https://www.notion.so/Lotus-8352bbb6c321431abd8790a7a3401ed3#805c645f592840ad893c272723362d3d)) ## New features From 36d311aa4f3cc66fa198438fbed52b625e39b3d7 Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Tue, 2 Aug 2022 16:49:14 -0400 Subject: [PATCH 16/19] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1f7fda5a..c0ace16e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This is an optional release of Lotus. This feature release introduces a lot of new sealing and scheduler improvements, and many other functionalities and bug fixes. -PSA: Markets related features, enhancements and fixes is now lower priority for Lotus, and is going to be in the hands of ([Boost](https://boost.filecoin.io)), built by the amazing ([Bedrock team](https://www.notion.so/pl-strflt/Bedrock-2e956d5d8143432080a1d84435ccf0ff)). You can find Lotus mission scope in the ([Lotus Roadmap](https://www.notion.so/Lotus-8352bbb6c321431abd8790a7a3401ed3#805c645f592840ad893c272723362d3d)) +PSA: Markets related features, enhancements and fixes is now lower priority for Lotus, and is going to be in the hands of ([Boost](https://boost.filecoin.io)), built by the amazing ([Bedrock team](https://www.notion.so/pl-strflt/Bedrock-2e956d5d8143432080a1d84435ccf0ff)). You can find Lotus mission scope [here](https://www.notion.so/Lotus-8352bbb6c321431abd8790a7a3401ed3#805c645f592840ad893c272723362d3d)) ## New features From f210aeafdde2f4a18ec46606151ca94987161407 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 2 Aug 2022 12:29:01 -0400 Subject: [PATCH 17/19] fix: post: restrict recoveries per deadline --- storage/wdpost/wdpost_run_faults.go | 32 ++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/storage/wdpost/wdpost_run_faults.go b/storage/wdpost/wdpost_run_faults.go index 32f0d96a6..59cb9b441 100644 --- a/storage/wdpost/wdpost_run_faults.go +++ b/storage/wdpost/wdpost_run_faults.go @@ -2,6 +2,7 @@ package wdpost import ( "context" + "math" "os" "strconv" @@ -21,12 +22,12 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -var recoveringSectorLimit int64 = 0 +var recoveringSectorLimit uint64 = 0 func init() { if rcl := os.Getenv("LOTUS_RECOVERING_SECTOR_LIMIT"); rcl != "" { var err error - recoveringSectorLimit, err = strconv.ParseInt(rcl, 10, 64) + recoveringSectorLimit, err = strconv.ParseUint(rcl, 10, 64) if err != nil { log.Errorw("parsing LOTUS_RECOVERING_SECTOR_LIMIT", "error", err) } @@ -92,6 +93,31 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 continue } + // rules to follow if we have indicated that we don't want to recover more than X sectors in a deadline + if recoveringSectorLimit > 0 { + // something weird happened, break because we can't recover any more + if recoveringSectorLimit < totalSectorsToRecover { + log.Warnf("accepted more recoveries (%d) than recoveringSectorLimit (%d)", totalSectorsToRecover, recoveringSectorLimit) + break + } + + maxNewRecoverable := recoveringSectorLimit - totalSectorsToRecover + + // we need to trim the recover bitfield + if recoveredCount > maxNewRecoverable { + recoverySlice, err := recovered.All(math.MaxUint64) + if err != nil { + log.Errorw("failed to slice recovery bitfield, breaking out of recovery loop", err) + break + } + + log.Warnf("only adding %d sectors to respect recoveringSectorLimit %d", maxNewRecoverable, recoveringSectorLimit) + + recovered = bitfield.NewFromSet(recoverySlice[0:maxNewRecoverable]) + recoveredCount = maxNewRecoverable + } + } + // respect user config if set if s.maxPartitionsPerRecoveryMessage > 0 && len(batchedRecoveryDecls[len(batchedRecoveryDecls)-1]) >= s.maxPartitionsPerRecoveryMessage { @@ -106,7 +132,7 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 totalSectorsToRecover += recoveredCount - if recoveringSectorLimit > 0 && int64(totalSectorsToRecover) >= recoveringSectorLimit { + if recoveringSectorLimit > 0 && totalSectorsToRecover >= recoveringSectorLimit { log.Errorf("reached recovering sector limit %d, only marking %d sectors for recovery now", recoveringSectorLimit, totalSectorsToRecover) From 5e98b8a0d62b7772f932a1ec867bee9c19868498 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 2 Aug 2022 15:28:43 -0400 Subject: [PATCH 18/19] add a test for Post max sectors recovery --- .circleci/config.yml | 6 +- ...k_config_test.go => wdpost_config_test.go} | 114 ++++++++++++++++++ storage/wdpost/wdpost_run_faults.go | 20 +-- 3 files changed, 127 insertions(+), 13 deletions(-) rename itests/{wdpost_check_config_test.go => wdpost_config_test.go} (61%) diff --git a/.circleci/config.yml b/.circleci/config.yml index dad86860a..b4d7f87be 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -976,9 +976,9 @@ workflows: target: "./itests/verifreg_test.go" - test: - name: test-itest-wdpost_check_config - suite: itest-wdpost_check_config - target: "./itests/wdpost_check_config_test.go" + name: test-itest-wdpost_config + suite: itest-wdpost_config + target: "./itests/wdpost_config_test.go" - test: name: test-itest-wdpost_dispute diff --git a/itests/wdpost_check_config_test.go b/itests/wdpost_config_test.go similarity index 61% rename from itests/wdpost_check_config_test.go rename to itests/wdpost_config_test.go index cc10af04f..61b64387d 100644 --- a/itests/wdpost_check_config_test.go +++ b/itests/wdpost_config_test.go @@ -186,3 +186,117 @@ func TestWindowPostNoPreChecks(t *testing.T) { sectors = p.MinerPower.RawBytePower.Uint64() / uint64(ssz) require.Equal(t, nSectors+kit.DefaultPresealsPerBootstrapMiner-2+1, int(sectors)) // -2 not recovered sectors + 1 just pledged } + +func TestWindowPostMaxSectorsRecoveryConfig(t *testing.T) { + oldVal := wdpost.RecoveringSectorLimit + defer func() { + wdpost.RecoveringSectorLimit = oldVal + }() + wdpost.RecoveringSectorLimit = 1 + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + client, miner, ens := kit.EnsembleMinimal(t, + kit.LatestActorsAt(-1), + kit.MockProofs()) + ens.InterconnectAll().BeginMining(2 * time.Millisecond) + + nSectors := 10 + + miner.PledgeSectors(ctx, nSectors, 0, nil) + + maddr, err := miner.ActorAddress(ctx) + require.NoError(t, err) + di, err := client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + mid, err := address.IDFromAddress(maddr) + require.NoError(t, err) + + t.Log("Running one proving period") + waitUntil := di.Open + di.WPoStProvingPeriod + t.Logf("End for head.Height > %d", waitUntil) + + ts := client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) + t.Logf("Now head.Height = %d", ts.Height()) + + p, err := client.StateMinerPower(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + ssz, err := miner.ActorSectorSize(ctx, maddr) + require.NoError(t, err) + + require.Equal(t, p.MinerPower, p.TotalPower) + require.Equal(t, p.MinerPower.RawBytePower, types.NewInt(uint64(ssz)*uint64(nSectors+kit.DefaultPresealsPerBootstrapMiner))) + + t.Log("Drop some sectors") + + // Drop 2 sectors from deadline 2 partition 0 (full partition / deadline) + parts, err := client.StateMinerPartitions(ctx, maddr, 2, types.EmptyTSK) + require.NoError(t, err) + require.Greater(t, len(parts), 0) + + secs := parts[0].AllSectors + n, err := secs.Count() + require.NoError(t, err) + require.Equal(t, uint64(2), n) + + // Drop the partition + err = secs.ForEach(func(sid uint64) error { + return miner.StorageMiner.(*impl.StorageMinerAPI).IStorageMgr.(*mock.SectorMgr).MarkFailed(storiface.SectorRef{ + ID: abi.SectorID{ + Miner: abi.ActorID(mid), + Number: abi.SectorNumber(sid), + }, + }, true) + }) + require.NoError(t, err) + + di, err = client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + t.Log("Go through another PP, wait for sectors to become faulty") + waitUntil = di.Open + di.WPoStProvingPeriod + t.Logf("End for head.Height > %d", waitUntil) + + ts = client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) + t.Logf("Now head.Height = %d", ts.Height()) + + p, err = client.StateMinerPower(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + require.Equal(t, p.MinerPower, p.TotalPower) + + sectors := p.MinerPower.RawBytePower.Uint64() / uint64(ssz) + require.Equal(t, nSectors+kit.DefaultPresealsPerBootstrapMiner-2, int(sectors)) // -2 just removed sectors + + t.Log("Make the sectors recoverable") + + err = secs.ForEach(func(sid uint64) error { + return miner.StorageMiner.(*impl.StorageMinerAPI).IStorageMgr.(*mock.SectorMgr).MarkFailed(storiface.SectorRef{ + ID: abi.SectorID{ + Miner: abi.ActorID(mid), + Number: abi.SectorNumber(sid), + }, + }, false) + }) + require.NoError(t, err) + + di, err = client.StateMinerProvingDeadline(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + waitUntil = di.Open + di.WPoStProvingPeriod + 200 + t.Logf("End for head.Height > %d", waitUntil) + + ts = client.WaitTillChain(ctx, kit.HeightAtLeast(waitUntil)) + t.Logf("Now head.Height = %d", ts.Height()) + + p, err = client.StateMinerPower(ctx, maddr, types.EmptyTSK) + require.NoError(t, err) + + require.Equal(t, p.MinerPower, p.TotalPower) + + sectors = p.MinerPower.RawBytePower.Uint64() / uint64(ssz) + require.Equal(t, nSectors+kit.DefaultPresealsPerBootstrapMiner-1, int(sectors)) // -1 not recovered sector +} diff --git a/storage/wdpost/wdpost_run_faults.go b/storage/wdpost/wdpost_run_faults.go index 59cb9b441..22186b551 100644 --- a/storage/wdpost/wdpost_run_faults.go +++ b/storage/wdpost/wdpost_run_faults.go @@ -22,12 +22,12 @@ import ( "github.com/filecoin-project/lotus/chain/types" ) -var recoveringSectorLimit uint64 = 0 +var RecoveringSectorLimit uint64 = 0 func init() { if rcl := os.Getenv("LOTUS_RECOVERING_SECTOR_LIMIT"); rcl != "" { var err error - recoveringSectorLimit, err = strconv.ParseUint(rcl, 10, 64) + RecoveringSectorLimit, err = strconv.ParseUint(rcl, 10, 64) if err != nil { log.Errorw("parsing LOTUS_RECOVERING_SECTOR_LIMIT", "error", err) } @@ -94,14 +94,14 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 } // rules to follow if we have indicated that we don't want to recover more than X sectors in a deadline - if recoveringSectorLimit > 0 { + if RecoveringSectorLimit > 0 { // something weird happened, break because we can't recover any more - if recoveringSectorLimit < totalSectorsToRecover { - log.Warnf("accepted more recoveries (%d) than recoveringSectorLimit (%d)", totalSectorsToRecover, recoveringSectorLimit) + if RecoveringSectorLimit < totalSectorsToRecover { + log.Warnf("accepted more recoveries (%d) than RecoveringSectorLimit (%d)", totalSectorsToRecover, RecoveringSectorLimit) break } - maxNewRecoverable := recoveringSectorLimit - totalSectorsToRecover + maxNewRecoverable := RecoveringSectorLimit - totalSectorsToRecover // we need to trim the recover bitfield if recoveredCount > maxNewRecoverable { @@ -111,9 +111,9 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 break } - log.Warnf("only adding %d sectors to respect recoveringSectorLimit %d", maxNewRecoverable, recoveringSectorLimit) + log.Warnf("only adding %d sectors to respect RecoveringSectorLimit %d", maxNewRecoverable, RecoveringSectorLimit) - recovered = bitfield.NewFromSet(recoverySlice[0:maxNewRecoverable]) + recovered = bitfield.NewFromSet(recoverySlice[:maxNewRecoverable]) recoveredCount = maxNewRecoverable } } @@ -132,9 +132,9 @@ func (s *WindowPoStScheduler) declareRecoveries(ctx context.Context, dlIdx uint6 totalSectorsToRecover += recoveredCount - if recoveringSectorLimit > 0 && totalSectorsToRecover >= recoveringSectorLimit { + if RecoveringSectorLimit > 0 && totalSectorsToRecover >= RecoveringSectorLimit { log.Errorf("reached recovering sector limit %d, only marking %d sectors for recovery now", - recoveringSectorLimit, + RecoveringSectorLimit, totalSectorsToRecover) break } From c1c3e3e551b758b0e9b2f039c916f922624d9ce0 Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 3 Aug 2022 13:09:32 +0200 Subject: [PATCH 19/19] Add 9111 to the changelog Add 9111 to the changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0ace16e4..cfdab9572 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This is an optional release of Lotus. This feature release introduces a lot of new sealing and scheduler improvements, and many other functionalities and bug fixes. -PSA: Markets related features, enhancements and fixes is now lower priority for Lotus, and is going to be in the hands of ([Boost](https://boost.filecoin.io)), built by the amazing ([Bedrock team](https://www.notion.so/pl-strflt/Bedrock-2e956d5d8143432080a1d84435ccf0ff)). You can find Lotus mission scope [here](https://www.notion.so/Lotus-8352bbb6c321431abd8790a7a3401ed3#805c645f592840ad893c272723362d3d)) +PSA: Markets related features, enhancements and fixes is now lower priority for Lotus, and is going to be in the hands of [Boost](https://boost.filecoin.io), built by the amazing [Bedrock team](https://www.notion.so/pl-strflt/Bedrock-2e956d5d8143432080a1d84435ccf0ff). You can find Lotus mission scope [here](https://www.notion.so/Lotus-8352bbb6c321431abd8790a7a3401ed3#805c645f592840ad893c272723362d3d) ## New features @@ -51,6 +51,7 @@ PSA: Markets related features, enhancements and fixes is now lower priority for - feat: migration: Implement function to migrate actors with only code changes ([filecoin-project/lotus#8843](https://github.com/filecoin-project/lotus/pull/8843)) - feat: conformance & tvx: support ReportConsensusFault messages ([filecoin-project/lotus#8302](https://github.com/filecoin-project/lotus/pull/8302)) - feat: wdpost: Envvar for limiting recovering sectors ([filecoin-project/lotus#9106](https://github.com/filecoin-project/lotus/pull/9106)) +- fix: post: restrict recoveries per deadline ([filecoin-project/lotus#9111](https://github.com/filecoin-project/lotus/pull/9111)) - ux: print absolute time for proving period start in proving cli ([filecoin-project/lotus#8954](https://github.com/filecoin-project/lotus/pull/8954)) - chore: storage refactors part 1 ([filecoin-project/lotus#8858](https://github.com/filecoin-project/lotus/pull/8858)) - chore: sealing pipeline: Remove adapter code (storage refactors part 2) ([filecoin-project/lotus#8871](https://github.com/filecoin-project/lotus/pull/8871))