瀏覽代碼

Merge branch 'Joystream:master' into patch-16

IgreX 3 年之前
父節點
當前提交
9fef3c0eaf
共有 98 個文件被更改,包括 13108 次插入1443 次删除
  1. 0 1
      .gitignore
  2. 3 0
      .gitmodules
  3. 29 24
      bounties/README.md
  4. 229 241
      bounties/bounties-status.json
  5. 24 0
      bounties/reports/weekly-bounty-report/07_11_2021_weekly_report_bounty_24.md
  6. 24 0
      bounties/reports/weekly-bounty-report/14_11_2021_weekly_report_bounty_24.md
  7. 24 0
      bounties/reports/weekly-bounty-report/21_11_2021_weekly_report_bounty_24.md
  8. 24 0
      bounties/reports/weekly-bounty-report/31_10_2021_weekly_report_bounty_24.md
  9. 19 0
      bounties/reports/weekly-bounty-report/Bounty_18_weekly_report_01_11_2021_07_11_2021.md
  10. 19 0
      bounties/reports/weekly-bounty-report/Bounty_18_weekly_report_08_11_2021_14_11_2021.md
  11. 20 0
      bounties/reports/weekly-bounty-report/Bounty_18_weekly_report_15_11_2021_21_11_2021.md
  12. 19 0
      bounties/reports/weekly-bounty-report/Bounty_18_weekly_report_25_10_2021_31_10_2021.md
  13. 31 0
      contributions/tech/bounty_10_revised_rules_draft.md
  14. 5 0
      contributions/tech/council-report-generator/cli/.gitignore
  15. 25 0
      contributions/tech/council-report-generator/cli/package.json
  16. 130 0
      contributions/tech/council-report-generator/cli/report-template.md
  17. 83 0
      contributions/tech/council-report-generator/cli/src/index.ts
  18. 460 0
      contributions/tech/council-report-generator/cli/src/report-functions.ts
  19. 124 0
      contributions/tech/council-report-generator/cli/src/types.ts
  20. 2 2
      contributions/tech/report-generator/.gitignore
  21. 27 13
      contributions/tech/report-generator/README.md
  22. 5 2
      contributions/tech/report-generator/package.json
  23. 43 30
      contributions/tech/report-generator/report-template.md
  24. 859 691
      contributions/tech/report-generator/src/StatisticsCollector.ts
  25. 83 38
      contributions/tech/report-generator/src/generator.ts
  26. 1 0
      contributions/tech/report-generator/src/lib
  27. 208 215
      contributions/tech/report-generator/src/types.ts
  28. 3 3
      contributions/tech/report-generator/tsconfig.json
  29. 7 0
      contributions/tech/substrate_polkadot_content_list/polkadot_substrate_content_list.csv
  30. 188 0
      council/kpi/27_CC_1_Free_Editing_Tools.md
  31. 40 0
      council/kpi/Community_Feedback_Part_1.md
  32. 57 0
      council/kpi/Community_Feedback_Part_2.md
  33. 52 0
      council/kpi/KPI 29.II-5 - Research Boardroom.md
  34. 44 0
      council/kpi/KPI_29_II_5_Research_Boardroom.md
  35. 39 0
      council/kpi/KPI_Position_Analyst_Bounty.md
  36. 60 69
      council/kpi/sumer/26.I-5/draft_kpi_presentation.json
  37. 二進制
      council/kpi/sumer/27.I-5/KPIs.bmpr
  38. 44 0
      council/kpi/sumer/27.OP-1/report.md
  39. 416 0
      council/reports/sumer-reports/Sumer_Council27_Report_26_10_2021.md
  40. 398 0
      council/reports/sumer-reports/Sumer_Council28_Report_02_11_2021.md
  41. 373 0
      council/reports/sumer-reports/Sumer_Council29_Report_09_11_2021.md
  42. 373 0
      council/reports/sumer-reports/Sumer_Council30_Report_16-11-2021.md
  43. 2 2
      council/tokenomics/antioch-3/Council_Round1_118800-277199_Tokenomics_Report.md
  44. 2 2
      council/tokenomics/antioch-3/Council_Round2_277200-377999_Tokenomics_Report.md
  45. 2 2
      council/tokenomics/antioch-3/Council_Round3_378000-478799_Tokenomics_Report.md
  46. 2 2
      council/tokenomics/antioch-3/Council_Round4_478800-579599_Tokenomics_Report.md
  47. 2 2
      council/tokenomics/antioch-3/Council_Round5_579600-680399_Tokenomics_Report.md
  48. 2 2
      council/tokenomics/antioch-3/Council_Round6_680400-781199_Tokenomics_Report.md
  49. 3 3
      council/tokenomics/sumer-4/Council_Round10_1083600-1184399_Tokenomics_Report.md
  50. 3 3
      council/tokenomics/sumer-4/Council_Round11_1184400-1285199_Tokenomics_Report.md
  51. 3 3
      council/tokenomics/sumer-4/Council_Round12_1285200-1385999_Tokenomics_Report.md
  52. 3 3
      council/tokenomics/sumer-4/Council_Round13_1386000-1486799_Tokenomics_Report.md
  53. 3 3
      council/tokenomics/sumer-4/Council_Round14_1486800-1587599_Tokenomics_Report.md
  54. 3 3
      council/tokenomics/sumer-4/Council_Round15_1587600-1688399_Tokenomics_Report.md
  55. 3 3
      council/tokenomics/sumer-4/Council_Round16_1688400-1789199_Tokenomics_Report.md
  56. 3 3
      council/tokenomics/sumer-4/Council_Round17_1789200-1889999_Tokenomics_Report.md
  57. 3 3
      council/tokenomics/sumer-4/Council_Round18_1890000-1990799_Tokenomics_Report.md
  58. 3 3
      council/tokenomics/sumer-4/Council_Round19_1990800-2091599_Tokenomics_Report.md
  59. 3 3
      council/tokenomics/sumer-4/Council_Round20_2091600-2192399_Tokenomics_Report.md
  60. 3 3
      council/tokenomics/sumer-4/Council_Round21_2192400-2293199_Tokenomics_Report.md
  61. 3 3
      council/tokenomics/sumer-4/Council_Round22_2293200-2393999_Tokenomics_Report.md
  62. 3 3
      council/tokenomics/sumer-4/Council_Round23_2394000-2494799_Tokenomics_Report.md
  63. 3 3
      council/tokenomics/sumer-4/Council_Round24_2494800-2595599_Tokenomics_Report.md
  64. 3 3
      council/tokenomics/sumer-4/Council_Round25_2595600-2696399_Tokenomics_Report.md
  65. 3 3
      council/tokenomics/sumer-4/Council_Round26_2696400-2782799_Tokenomics_Report.md
  66. 166 0
      council/tokenomics/sumer-4/Council_Round27_2782800-2883599_Tokenomics_Report.md
  67. 169 0
      council/tokenomics/sumer-4/Council_Round28_2883600-2984399_Tokenomics_Report.md
  68. 167 0
      council/tokenomics/sumer-4/Council_Round29_2984400-3085199_Tokenomics_Report.md
  69. 163 0
      council/tokenomics/sumer-4/Council_Round30_3085200-3185999_Tokenomics_Report.md
  70. 3 3
      council/tokenomics/sumer-4/Council_Round7_781200-881999_Tokenomics_Report.md
  71. 3 3
      council/tokenomics/sumer-4/Council_Round8_882000-982799_Tokenomics_Report.md
  72. 3 3
      council/tokenomics/sumer-4/Council_Round9_982800-1083599_Tokenomics_Report.md
  73. 109 0
      governance/Storage_WG_OKR_2.md
  74. 2 1
      governance/continuously_updated_files.md
  75. 38 20
      governance/council_member_discord_usernames.md
  76. 6 3
      governance/jsg_requests.md
  77. 220 18
      governance/spending_proposal_categories.csv
  78. 88 0
      joystream-api/.gitignore
  79. 44 0
      joystream-api/Readme.md
  80. 45 0
      joystream-api/package.json
  81. 0 0
      joystream-api/report/.gitkeep
  82. 24 0
      joystream-api/report/unknownSources.log
  83. 544 0
      joystream-api/src/joystream-lib/api.ts
  84. 132 0
      joystream-api/src/joystream-lib/types.ts
  85. 549 0
      joystream-api/src/mintingAndBurning.ts
  86. 558 0
      joystream-api/src/types.ts
  87. 72 0
      joystream-api/tsconfig.json
  88. 15 0
      joystream-api/tslint.json
  89. 3259 0
      joystream-api/yarn.lock
  90. 74 0
      working-groups/curator-group/Weekly_Curator_Working_Group_Report_28.md
  91. 74 0
      working-groups/curator-group/Weekly_Curator_Working_Group_Report_29.md
  92. 74 0
      working-groups/curator-group/Weekly_Curator_Working_Group_Report_30.md
  93. 74 0
      working-groups/curator-group/Weekly_Curator_Working_Group_Report_31.md
  94. 758 0
      working-groups/operations-group/README.md
  95. 250 0
      working-groups/storage-group/report_21.md
  96. 248 0
      working-groups/storage-group/report_22.md
  97. 248 0
      working-groups/storage-group/report_23.md
  98. 252 0
      working-groups/storage-group/report_24.md

+ 0 - 1
.gitignore

@@ -1,5 +1,4 @@
 .DS_Store
 node_modules/
 dist/
-lib/
 .idea/*

+ 3 - 0
.gitmodules

@@ -0,0 +1,3 @@
+[submodule "lib"]
+	path = contributions/tech/report-generator/src/lib
+	url = https://git.joystreamstats.live/Operations/joystream-lib

+ 29 - 24
bounties/README.md

@@ -2,30 +2,35 @@
 
 ## Bounty Status
 
-| ID | Title                        | Issue | Opened   | Reward | Forum Thread                                             | Status/Grading     | PR  | Proposal                                             |
-|----|------------------------------|-------|----------|--------|----------------------------------------------------------|--------------------|-----|------------------------------------------------------|
-| 1  | Update Telegram Bot          | #23   | 23.09.20 | $300   | [118](https://testnet.joystream.org/#/forum/threads/118) | $300 - 01.11.20    | #36 | [32](https://testnet.joystream.org/#/proposals/historical/32)   |
-| 2  | Testing of 'polkadot-js'     | #32   | 23.09.20 | $200   | [129](https://testnet.joystream.org/#/forum/threads/129) | $200 - 05.01.20    | #67 | [87](https://testnet.joystream.org/#/proposals/historical/87)   |
-| 3  | Improve Telegram Bot(s)      | #41   | 08.11.20 | $225   | [130](https://testnet.joystream.org/#/forum/threads/130) | $25 - 05.12.20     | #47 | [49](https://testnet.joystream.org/#/proposals/historical/49)   |
-| 4  | Improve Telegram Bot(s)      | #51   | 05.12.20 | $225   | [158](https://testnet.joystream.org/#/forum/threads/158) | Complete    | NA  | NA                                                   |
-| 5  | JS Telegram Sticker pack     | #52   | 05.12.20 | $400   | [169](https://testnet.joystream.org/#/forum/threads/169) | $300          | NA  | NA                                                   |
-| 6  | Increase Validator Research  | #71   | 17.01.21 | $200   | [186](https://testnet.joystream.org/#/forum/threads/186) | $200 - 13.02.21    | #77 | [116](https://testnet.joystream.org/#/proposals/historical/116) |
-| 7  | Joystream Player Loading     | #85   | 15.02.21 | $400   | [214](https://testnet.joystream.org/#/forum/threads/214) | Withdrawn - No interest | NA  | NA                                              |
-| 8  | Ledger on Joystream          | #86   | 15.02.21 | $300   | [215](https://testnet.joystream.org/#/forum/threads/215) | $450 - 13.05.21    | #171| [56])(https://testnet.joystream.org/#/proposals/56)  |
-| 9  | Repo/Docs Improvements       | #87   | 15.02.21 | $400   | [216](https://testnet.joystream.org/#/forum/threads/216) | Weekly Bounty          | NA  | NA                                                   |
-| 10 | Upload Public Domain Content | #88   | 15.02.21 | $5*    | [217](https://testnet.joystream.org/#/forum/threads/217) | Closed        | NA  | NA                                                   |
-| 11 | Design Community Repo Banner | #89   | 15.02.21 | $250   | [218](https://testnet.joystream.org/#/forum/threads/218) | $300 - 13.05.21    | NA  | NA                                                   |
-| 12 | Deploy Reliable Endpoints | #101   | 12.03.21 | $200   | [324](https://testnet.joystream.org/#/forum/threads/324) | Completed       | NA  | NA                                                   |
-| 13 | Research Discord Bots | #123   | 12.03.21 | $200   | [326](https://testnet.joystream.org/#/forum/threads/326) | $450          | #131, #133   | NA                                                   |
-| 14 | Polkadot/Substrate Videos | #143   | 19.04.21 | $50   | [358](https://testnet.joystream.org/#/forum/threads/358) | Discontinued - Pending Payouts | #157  | [35](https://testnet.joystream.org/#/proposals/35), [37](https://testnet.joystream.org/#/proposals/37), [37](https://testnet.joystream.org/#/proposals/37), [40](https://testnet.joystream.org/#/proposals/40), [41](https://testnet.joystream.org/#/proposals/41) |                                                   |
-| 15 | Transcribe Community Updates | #143   | 20.04.21 | $400   | [363](https://testnet.joystream.org/#/forum/threads/363) | $375 - 15.06.2021  | #199 | [166](https://testnet.joystream.org/#/proposals/166)            |
-|16|Translation of Community Update Videos| #144|10.04.21|$400|[510](https://testnet.joystream.org/#/forum/threads/510)|Open|NA|NA|
-| 17 | Discord Video Bot | #151   | 20.04.21 | $100   | [362](https://testnet.joystream.org/#/forum/threads/362) | Completed   | NA  | NA                         |
-| 18 | Original Video Bounty | #162   | 29.05.21 | up to $200  | [422](https://testnet.joystream.org/#/forum/threads/422) | Open   | NA  | NA                         |
-| 19 | Validator Logging Tool | #161   | 20.04.21 | $400   | [381](https://testnet.joystream.org/#/forum/threads/381) | Completed          | #242  | [382](https://testnet.joystream.org/#/proposals/382 )      |
-| 20 | Github Bounty Guide | #220 | 04.07.21 | $350| [492](https://testnet.joystream.org/#/forum/threads/492)| Announced | NA | NA |
-| 21 | Website Translation | #212 | 28.06.21 | $500 | [493](https://testnet.joystream.org/#/forum/threads/493)| Announced | NA | NA |
-| 23 | Runtime Update Explanation | #289 | 14.08.21 | $65 | [541](https://testnet.joystream.org/#/forum/threads/541) | Announced | NA | NA |
+| ID | Title                                  | Issue | Opened     | Reward        | Forum Thread                                                              | Status/Grading                   | PR                                                                                                                                                                                         | Proposal                                                        |
+| -- | -------------------------------------- | ----- | ---------- | ------------- | ------------------------------------------------------------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------- |
+| 1  | Update Telegram Bot                    | #23   | 23.09.20   | $300          | [118](https://testnet.joystream.org/#/forum/threads/118)                  | Closed ($300 - 01.11.20)         | #36                                                                                                                                                                                        | [32](https://testnet.joystream.org/#/proposals/historical/32)   |
+| 2  | Testing of 'polkadot-js'               | #32   | 23.09.20   | $200          | [129](https://testnet.joystream.org/#/forum/threads/129)                  | Closed ($200 - 05.01.20)         | #67                                                                                                                                                                                        | [87](https://testnet.joystream.org/#/proposals/historical/87)   |
+| 3  | Improve Telegram Bot(s)                | #41   | 08.11.20   | $225          | [130](https://testnet.joystream.org/#/forum/threads/130)                  | Closed ($25 - 05.12.20)          | #47                                                                                                                                                                                        | [49](https://testnet.joystream.org/#/proposals/historical/49)   |
+| 4  | Improve Telegram Bot(s)                | #51   | 05.12.20   | $225          | [158](https://testnet.joystream.org/#/forum/threads/158)                  | Completed                        | NA                                                                                                                                                                                         | NA                                                              |
+| 5  | JS Telegram Sticker pack               | #52   | 05.12.20   | $400          | [169](https://testnet.joystream.org/#/forum/threads/169)                  | Closed ($300)                    | NA                                                                                                                                                                                         | NA                                                              |
+| 6  | Increase Validator Research            | #71   | 17.01.21   | $200          | [186](https://testnet.joystream.org/#/forum/threads/186)                  | Closed ($200 - 13.02.21)         | #77                                                                                                                                                                                        | [116](https://testnet.joystream.org/#/proposals/historical/116) |
+| 7  | Joystream Player Loading               | #85   | 15.02.21   | $400          | [214](https://testnet.joystream.org/#/forum/threads/214)                  | Closed (Withdrawn - No interest) | NA                                                                                                                                                                                         | NA                                                              |
+| 8  | Ledger on Joystream                    | #86   | 15.02.21   | $300          | [215](https://testnet.joystream.org/#/forum/threads/215)                  | Closed ($450 - 13.05.21)         | #171                                                                                                                                                                                       | [56](https://testnet.joystream.org/#/proposals/56)              |
+| 9  | Repo/Docs Improvements                 | #87   | 15.02.21   | $400          | [216](https://testnet.joystream.org/#/forum/threads/216)                  | Weekly Bounty                    | NA                                                                                                                                                                                         | NA                                                              |
+| 10 | Upload Public Domain Content           | #88   | 15.02.21   | $5\*          | [217](https://testnet.joystream.org/#/forum/threads/217)                  | Closed                           | NA                                                                                                                                                                                         | NA                                                              |
+| 12 | Deploy Reliable Endpoints              | #101  | 12.03.21   | $200          | [324](https://testnet.joystream.org/#/forum/threads/324)                  | Completed                        | NA                                                                                                                                                                                         | NA                                                              |
+| 11 | Design Community Repo Banner           | #89   | 15.02.21   | $250          | [218](https://testnet.joystream.org/#/forum/threads/218)                  | Closed ($300 - 13.05.21)         | NA                                                                                                                                                                                         | NA                                                              |
+| 13 | Research Discord Bots                  | #123  | 12.03.21   | $200          | [326](https://testnet.joystream.org/#/forum/threads/326)                  | Closed ($450)                    | #131, #133                                                                                                                                                                                 | NA                                                              |
+| 14 | Polkadot/Substrate Videos              | #142  | 19.04.21   | $50           | [358](https://testnet.joystream.org/#/forum/threads/358)                  | Closed                           | #157                                                                                                                                                                                       | 35, 37, 37, 40, 41                                              |
+| 15 | Transcribe Community Updates           | #143  | 20.04.21   | $400          | [363](https://testnet.joystream.org/#/forum/threads/363)                  | Closed ($375 - 15.06.2021)       | #199                                                                                                                                                                                       | [166](https://testnet.joystream.org/#/proposals/166)            |
+| 16 | Translation of Community Update Videos | #144  | 10.04.21   | $400          | [510](https://testnet.joystream.org/#/forum/threads/510)                  | Open                             | NA                                                                                                                                                                                         | NA                                                              |
+| 17 | Discord Video Bot                      | #151  | 20.04.21   | $100          | [362](https://testnet.joystream.org/#/forum/threads/362)                  | Completed                        | NA                                                                                                                                                                                         | NA                                                              |
+| 18 | Original Video Bounty                  | #162  | 29.05.21   | $500          | [422](https://testnet.joystream.org/#/forum/threads/422)                  | Open                             | [319](https://github.com/Joystream/community-repo/pull/319/commits/0fd40e7e94309692498cdb9091091f564a9230ce#diff-59b5bc29d3b0e5d2bab3949de2276d339293551606ba4ae62f956a39ee4eb11d)         | [488](https://testnet.joystream.org/#/proposals/488)            |
+| 19 | Validator Logging Tool                 | #161  | 20.04.21   | $400          | [381](https://testnet.joystream.org/#/forum/threads/381)                  | Completed                        | #242                                                                                                                                                                                       | [382](https://testnet.joystream.org/#/proposals/382)            |
+| 20 | Github Bounty Guide                    | #220  | 04.07.21   | $350          | [492](https://testnet.joystream.org/#/forum/threads/492)                  | Closed                           | NA                                                                                                                                                                                         | NA                                                              |
+| 21 | Website Translation                    | #493  | 28.06.21   | $500          | [493](https://testnet.joystream.org/#/forum/threads/493)                  | Open                             | NA                                                                                                                                                                                         | NA                                                              |
+| 22 | KPIs Web UI                            | #280  | 23.09.2021 | $250          | [703](https://testnet.joystream.org/#/forum/threads/703)                  | Open                             | NA                                                                                                                                                                                         | [604](https://testnet.joystream.org/#/proposals/604)            |
+| 23 | Runtime Update Explanation             | #289  | 14.08.21   | $65           | [541](https://testnet.joystream.org/#/forum/threads/541)                  | Announced                        | NA                                                                                                                                                                                         | NA                                                              |
+| 24 | Upload Content                         | #295  | 17.09.2021 | $300          | \-                                                                        | Weekly Bounty                    | [PR](https://github.com/Joystream/community-repo/commit/eb88d53f6537da7045f4ccdef7b46551ded73066?short_path=0722ad3#diff-0722ad3356cf934e45f13220b83cfcfb1485ced0d518896ebfc3cb178c0c45d6) | [481](https://testnet.joystream.org/#/proposals/481)            |
+| 25 | Joystream Superstar Blogger            | #311  | 21.08.2021 | Non objective | [557](https://pioneer.joystreamstats.live/#/forum/threads/557?replyIdx=1) | Open                             | NA                                                                                                                                                                                         | [461](https://pioneer.joystreamstats.live/#/proposals/461)      |
+| 26 | Joystream and other video platforms    | #342  | 12.09.2021 | $500          | [594](https://testnet.joystream.org/#/forum/threads/594?replyIdx=1)       | Open                             | NA                                                                                                                                                                                         | [562](https://testnet.joystream.org/#/proposals/562)            |
+| 27 | Official music theme                   | #384  | 23.09.2021 | $400          | [577](https://testnet.joystream.org/#/forum/threads/577?replyIdx=1)       | Open                             | NA                                                                                                                                                                                         | [606](https://testnet.joystream.org/#/proposals/606)            |
 
 
 ## Bounties Management

+ 229 - 241
bounties/bounties-status.json

@@ -1,160 +1,76 @@
-{
-  "activeBounties":
+{    "closedBounties":
   [
     {
-      "id": 9,
-      "title": "Repo/Docs Improvements",
-      "description": "Improve the quality of our documentation on GitHub, by making PRs and issues.",
-      "openedDate": "2021-02-15",
-      "managers": ["@ilich"],
-      "links": ["https://testnet.joystream.org/#/forum/threads/216","https://github.com/Joystream/community-repo/issues/87"],
+      "id": 1,
+      "title": "Update Telegram Bot",
+      "openedDate": "2020-09-23",
+      "description": "As the old bot is not compatible with the new joystream-types, it needs to updated as soon as possible!",
+      "links": ["https://testnet.joystream.org/#/forum/threads/118","https://github.com/Joystream/community-repo/issues/23"],
       "reward": 300,
-      "tags": ["Newcomers","Research"],
-      "format": "Free for All",
-      "status": "Announced"
+      "tags": ["Coding"],
+      "format": "Reserved",
+      "closedDate": "2020-11-01",
+      "status": "Closed ($300)"
     },
     {
-      "id": 18,
-      "title": "Original Video Bounty",
-      "openedDate": "2021-05-29",
-      "description": "Create and upload original videos on Joystream",
-      "managers": ["@joydiesel"],
-      "links": ["https://testnet.joystream.org/#/forum/threads/422","https://github.com/Joystream/community-repo/issues/162"],
+      "id": 2,
+      "title": "Testing of 'polkadot-js'",
+      "openedDate": "2020-09-23",
+      "description": "After the upgrade, we have enabled the polkadot-js extension as part of Pioneer, this bounty is for testing the extension.",
+      "links": ["https://testnet.joystream.org/#/forum/threads/129","https://github.com/Joystream/community-repo/issues/32"],
       "reward": 200,
-      "notes": "Create and upload original videos on Joystream",
-      "tags": ["Content Creation"],
-      "format": "Open",
-      "status": "Open - Weekly Bounty"
-    },
-    {
-      "id": 21,
-      "title": "Website Translation",
-      "openedDate": "2021-06-28",
-      "description": "Translate the joystream.org website to languages other than English.",
-      "managers": ["@freakstatic_council"],
-      "links": ["https://testnet.joystream.org/#/forum/threads/493","https://github.com/Joystream/community-repo/issues/212"],
-      "reward": 500,
-      "notes": "Translate the Joystream website",
-      "tags": ["Research","Coding"],
-      "format": "Closed",
-      "status": "Open"
-    },
-    {
-      "id": 16,
-      "title": "Translating Update Videos",
-      "openedDate": "2021-04-10",
-      "description": "Translate Community Updates videos to non-English languages.",
-      "managers": ["@mmsaww"],
-      "links": ["https://testnet.joystream.org/#/forum/threads/510","https://github.com/Joystream/community-repo/issues/144"],
-      "reward": 400,
-      "notes": "Translate Joystream Community Updates videos",
-      "tags": ["Content","Documentation"],
-      "format": "NA",
-      "status": "Open"
-    },
-    {
-      "id": 22,
-      "title": "KPIs Web UI",
-      "openedDate": "2021-04-10",
-      "description": "Create a UI for the council's KPIs.",
-      "managers": ["@isonar"],
-      "links": ["https://testnet.joystream.org/#/forum/threads/510","https://github.com/Joystream/community-repo/issues/280"],
-      "reward": 250,
-      "notes": "Create a UI for the council's KPIs.",
-      "tags": ["Research","Coding"],
-      "format": "Closed",
-      "status": "Open"
-    },
-    {
-      "id": 23,
-      "title": "Runtime Update Explanation",
-      "openedDate": "2021-08-14",
-      "description": "Create an explanation of what a runtime upgrade can do",
-      "managers": ["@tomato"],
-      "links": ["https://testnet.joystream.org/#/forum/threads/541","https://github.com/Joystream/community-repo/issues/289"],
-      "reward": 65,
-      "notes": "Runtime Update Explanation",
-      "tags": ["Documentation", "Research"],
-      "format": "Open",
-      "status": "Open"
-    },
+      "tags": ["Testing"],
+      "format": "Reserved",
+      "closedDate": "2021-01-05",
+      "status": "Closed ($200)"
+    },  
     {
-      "id": 24,
-      "title": "Upload Content",
-      "openedDate": "2021-10-01",
-      "description": "Upload public domain and Creative Commons videos",
-      "managers": ["@arsstep"],
-      "links": ["https://testnet.joystream.org/#/forum/threads/623","https://github.com/Joystream/community-repo/issues/295"],
-      "reward": 300,
-      "notes": "Upload public domain videos",
-      "tags": ["Documentation", "Research"],
-      "format": "Open",
-      "status": "Open"
-    },
+      "id": 3,
+      "title": "Improve Telegram Bot(s)",
+      "openedDate": "2020-11-08",
+      "description": "After the upgrade, we have enabled the polkadot-js extension as part of Pioneer, this bounty is for testing the extension.",
+      "links": ["https://testnet.joystream.org/#/forum/threads/130","https://github.com/Joystream/community-repo/issues/41"],
+      "reward": 225,
+      "tags": ["Coding"],
+      "format": "Reserved",
+      "closedDate": "2020-12-05",
+      "status": "Closed ($25)"
+    }, 
     {
-      "id": 26,
-      "title": "JS + Other Platform Videos",
-      "openedDate": "2021-10-01",
-      "description": "Create Promo Videos for JS",
-      "managers": ["katerlna"],
-      "links": ["https://testnet.joystream.org/#/forum/threads/594","https://github.com/Joystream/community-repo/issues/342"],
-      "reward": 500,
-      "notes": "Upload original videos",
-      "tags": ["Creative", "Videos"],
-      "format": "Open",
-      "status": "Open"
+      "id": 4,
+      "title": "Improved Telegram Bot",
+      "openedDate": "2020-12-05",
+      "description": "As the bot still has some issues (due to bugs in the initial bot), we want to both fix these, and expand on the functionality.",
+      "links": ["https://testnet.joystream.org/#/forum/threads/158","https://github.com/Joystream/community-repo/issues/51"],
+      "reward": 825,
+      "tags": ["Coding"],
+      "format": "Reserved",
+      "closedDate": "2021-03-04",
+      "status": "Completed"
     },
     {
-      "id": 27,
-      "title": "JS Official Music Theme",
-      "openedDate": "2021-10-01",
-      "description": "Create a musical theme for Joystream",
-      "managers": [],
-      "links": ["https://testnet.joystream.org/#/proposals/606","https://github.com/Joystream/community-repo/issues/384"],
+      "id": 5,
+      "title": "JS Telegram Sticker pack",
+      "openedDate": "2020-12-05",
+      "description": "Telegram allows for custom sticker packs to be made. These can spice up the conversation a little, and allows the Joystream Community to let their creativity and design show!",
+      "links": ["https://testnet.joystream.org/#/forum/threads/157","https://testnet.joystream.org/#/forum/threads/169","https://github.com/Joystream/community-repo/issues/52"],
       "reward": 400,
-      "notes": "Musical Theme",
-      "tags": ["Creative", "Music"],
-      "format": "Open",
-      "status": "Announced"
-    }
-  ],
-  "closedBounties":
-  [
-    {
-      "id": 11,
-      "title": "Design Community Repo Banner",
-      "openedDate": "2021-02-15",
-      "description": "Most of the active repos in the Joystream organization have branded banners in their README.md. The Community Repo also needs one!",
-      "links": ["https://testnet.joystream.org/#/forum/threads/218","https://github.com/Joystream/community-repo/issues/89"],
-      "reward": 300,
-      "notes": "Design a banner for the Community Repo",
-      "tags": ["Design"],
-      "closedDate": "2021-05-13",
-      "status": "Completed - USD 300"
-    },
-    {
-      "id": 8,
-      "title": "Ledger on Joystream",
-      "description": "Research how well the Ledger hardware wallets are supported, how to use them on the network, derivation paths and key recovery.",
-      "openedDate": "2021-02-15",
-      "links": ["https://testnet.joystream.org/#/forum/threads/215","https://github.com/Joystream/community-repo/issues/86"],
-      "reward": 450,
-      "tags": ["Research"],
-      "closedDate": "2021-05-12",
-      "status": "Completed - USD 450"
+      "tags": ["Creative", "Stickers"],
+      "format": "Competition",
+      "closedDate": "2021-03-04",
+      "status": "Closed ($300)"
     },
     {
-      "id": 13,
-      "title": "Research Discord Bots",
-      "openedDate": "2021-03-12",
-      "description": "Research, document and create a simple bot for the new Discord server",
-      "links": ["https://testnet.joystream.org/#/forum/threads/326","https://github.com/Joystream/community-repo/issues/123"],
+      "id": 6,
+      "title": "Increase Validator Research",
+      "openedDate": "2021-01-17",
+      "description": "Research the costs and parameter changes associated with increasing the Validator count substantially.",
+      "links": ["https://testnet.joystream.org/#/forum/threads/186","https://github.com/Joystream/community-repo/issues/71"],
       "reward": 200,
-      "notes": "Research and document bots for the new Discord server",
-      "tags": ["Coding","Research"],
-      "format": "Closed",
-      "closedDate": "2021-05-12",
-      "status": "Pending Grading"
+      "tags": ["Research"],
+      "format": "Reserved",
+      "closedDate": "2021-02-13",
+      "status": "Closed ($200)"
     },
     {
       "id": 7,
@@ -166,92 +82,42 @@
       "tags": ["Coding","Research"],
       "format": "Closed",
       "closedDate": "2021-03-12",
-      "status": "Withdrawn - No Interest - USD 0"
+      "status": "Closed (Withdrawn - No interest)"
     },
     {
-      "id": 6,
-      "title": "Increase Validator Research",
-      "openedDate": "2021-01-17",
-      "description": "Research the costs and parameter changes associated with increasing the Validator count substantially.",
-      "links": ["https://testnet.joystream.org/#/forum/threads/186","https://github.com/Joystream/community-repo/issues/71"],
-      "reward": 200,
+      "id": 8,
+      "title": "Ledger on Joystream",
+      "description": "Research how well the Ledger hardware wallets are supported, how to use them on the network, derivation paths and key recovery.",
+      "openedDate": "2021-02-15",
+      "links": ["https://testnet.joystream.org/#/forum/threads/215","https://github.com/Joystream/community-repo/issues/86"],
+      "reward": 450,
       "tags": ["Research"],
-      "format": "Reserved",
-      "closedDate": "2021-02-13",
-      "status": "Completed - USD 200"
-    },
-    {
-      "id": 5,
-      "title": "JS Telegram Sticker pack",
-      "openedDate": "2020-12-05",
-      "description": "Telegram allows for custom sticker packs to be made. These can spice up the conversation a little, and allows the Joystream Community to let their creativity and design show!",
-      "links": ["https://testnet.joystream.org/#/forum/threads/157","https://testnet.joystream.org/#/forum/threads/169","https://github.com/Joystream/community-repo/issues/52"],
-      "reward": 400,
-      "tags": ["Creative", "Stickers"],
-      "format": "Competition",
-      "closedDate": "2021-03-04",
-      "status": "Completed - USD 358"
+      "closedDate": "2021-05-12",
+      "status": "Completed ($450)"
     },
     {
-      "id": 4,
-      "title": "Improved Telegram Bot",
-      "openedDate": "2020-12-05",
-      "description": "As the bot still has some issues (due to bugs in the initial bot), we want to both fix these, and expand on the functionality.",
-      "links": ["https://testnet.joystream.org/#/forum/threads/158","https://github.com/Joystream/community-repo/issues/51"],
-      "reward": 825,
-      "tags": ["Coding"],
-      "format": "Reserved",
-      "closedDate": "2021-03-04",
+      "id": 10,
+      "title": "Upload Public Domain Content",
+      "description": "Upload videos to our testnet, and earn up to $5 per entry! We believe there are some hidden gems available out there, that are licensed permissively.",
+      "openedDate": "2021-02-15",
+      "links": ["https://testnet.joystream.org/#/forum/threads/217","https://github.com/Joystream/community-repo/issues/88"],
+      "reward": 5,
+      "tags": ["Newcomers","Content"],
+      "format": "Free for All",
+      "closedDate": "2021-08-01",
       "status": "Closed"
     },
     {
-      "id": 3,
-      "title": "Improve Telegram Bot(s)",
-      "openedDate": "2020-11-08",
-      "description": "After the upgrade, we have enabled the polkadot-js extension as part of Pioneer, this bounty is for testing the extension.",
-      "links": ["https://testnet.joystream.org/#/forum/threads/130","https://github.com/Joystream/community-repo/issues/41"],
-      "reward": 225,
-      "tags": ["Coding"],
-      "format": "Reserved",
-      "closedDate": "2020-12-05",
-      "status": "Closed - USD 25"
-    },
-    {
-      "id": 2,
-      "title": "Testing of 'polkadot-js'",
-      "openedDate": "2020-09-23",
-      "description": "After the upgrade, we have enabled the polkadot-js extension as part of Pioneer, this bounty is for testing the extension.",
-      "links": ["https://testnet.joystream.org/#/forum/threads/129","https://github.com/Joystream/community-repo/issues/32"],
-      "reward": 200,
-      "tags": ["Testing"],
-      "format": "Reserved",
-      "closedDate": "2021-01-05",
-      "status": "Completed - USD 200"
-    },
-    {
-      "id": 1,
-      "title": "Update Telegram Bot",
-      "openedDate": "2020-09-23",
-      "description": "As the old bot is not compatible with the new joystream-types, it needs to updated as soon as possible!",
-      "links": ["https://testnet.joystream.org/#/forum/threads/118","https://github.com/Joystream/community-repo/issues/23"],
+      "id": 11,
+      "title": "Design Community Repo Banner",
+      "openedDate": "2021-02-15",
+      "description": "Most of the active repos in the Joystream organization have branded banners in their README.md. The Community Repo also needs one!",
+      "links": ["https://testnet.joystream.org/#/forum/threads/218","https://github.com/Joystream/community-repo/issues/89"],
       "reward": 300,
-      "tags": ["Coding"],
-      "format": "Reserved",
-      "closedDate": "2020-11-01",
-      "status": "Completed - USD 300"
-    },
-    {
-      "id": 17,
-      "title": "Discord Video Bot",
-      "openedDate": "2021-03-12",
-      "description": "Code a bot that mirrors new uploads to Joystream to a Discord channel",
-      "links": ["https://testnet.joystream.org/#/forum/threads/362","https://github.com/Joystream/community-repo/issues/151"],
-      "reward": 150,
-      "notes": "Code a bot that mirrors new uploads to Joystream to a Discord channel",
-      "tags": ["Coding","Research"],
-      "format": "Closed",
-      "closedDate": "2021-11-01",
-      "status": "Completed - USD 150"
+      "notes": "Design a banner for the Community Repo",
+      "tags": ["Design"],
+      "closedDate": "2021-05-13",
+      "status": "Closed ($300)"
     },
     {
       "id": 12,
@@ -266,6 +132,19 @@
       "closedDate": "2021-03-19",
       "status": "Completed - monthly payments"
     },
+    {
+      "id": 13,
+      "title": "Research Discord Bots",
+      "openedDate": "2021-03-12",
+      "description": "Research, document and create a simple bot for the new Discord server",
+      "links": ["https://testnet.joystream.org/#/forum/threads/326","https://github.com/Joystream/community-repo/issues/123"],
+      "reward": 200,
+      "notes": "Research and document bots for the new Discord server",
+      "tags": ["Coding","Research"],
+      "format": "Closed",
+      "closedDate": "2021-05-12",
+      "status": "Closed ($450)"
+    },
     {
       "id": 14,
       "title": "Polkadot/Substrate Videos",
@@ -277,7 +156,7 @@
       "tags": ["Content","Research"],
       "format": "Open",
       "closedDate": "2021-06-11",
-      "status": "Closed - pending payouts"
+      "status": "Closed"
     },
     {
       "id": 15,
@@ -290,19 +169,20 @@
       "tags": ["Content","Research"],
       "format": "Mixed",
       "closedDate": "2021-06-15",
-      "status": "Completed - USD 375"
+      "status": "Closed ($375)"
     },
-    {
-      "id": 10,
-      "title": "Upload Public Domain Content",
-      "description": "Upload videos to our testnet, and earn up to $5 per entry! We believe there are some hidden gems available out there, that are licensed permissively.",
-      "openedDate": "2021-02-15",
-      "links": ["https://testnet.joystream.org/#/forum/threads/217","https://github.com/Joystream/community-repo/issues/88"],
-      "reward": 5,
-      "tags": ["Newcomers","Content"],
-      "format": "Free for All",
-      "closedDate": "2021-08-01",
-      "status": "Closed"
+   {
+      "id": 17,
+      "title": "Discord Video Bot",
+      "openedDate": "2021-03-12",
+      "description": "Code a bot that mirrors new uploads to Joystream to a Discord channel",
+      "links": ["https://testnet.joystream.org/#/forum/threads/362","https://github.com/Joystream/community-repo/issues/151"],
+      "reward": 150,
+      "notes": "Code a bot that mirrors new uploads to Joystream to a Discord channel",
+      "tags": ["Coding","Research"],
+      "format": "Closed",
+      "closedDate": "2021-11-01",
+      "status": "Completed"
     },
     {
       "id": 19,
@@ -315,34 +195,142 @@
       "tags": ["Coding","Research"],
       "format": "Closed",
       "closedDate": "2021-08-17",
-      "status": "Completed - USD 400"
+      "status": "Completed"
     },
     {
       "id": 20,
       "title": "Github Bounty Guide",
       "openedDate": "2021-07-04",
       "description": "Create a short video guide explaining how to use GitHub for submitting your bounty work.",
-      "managers": ["@isonar"],
       "links": ["https://testnet.joystream.org/#/forum/threads/492","https://github.com/Joystream/community-repo/issues/220"],
       "reward": 350,
       "notes": "Create GitHub video guides",
-      "tags": ["Content Creation","Coding"],
+      "tags": ["Content","Coding"],
       "format": "Free for all",
       "closedDate": "2021-09-14",
-      "status": "Completed - 800 USD"
+      "status": "Closed"
+    }
+  ],
+  "activeBounties":
+  [
+    {
+      "id": 9,
+      "title": "Repo/Docs Improvements",
+      "description": "Improve the quality of our documentation on GitHub, by making PRs and issues.",
+      "openedDate": "2021-02-15",
+      "links": ["https://testnet.joystream.org/#/forum/threads/216","https://github.com/Joystream/community-repo/issues/87"],
+      "reward": 300,
+      "tags": ["Newcomers","Research"],
+      "format": "Free for All",
+      "status": "Weekly Bounty"
+    },
+    {
+      "id": 16,
+      "title": "Translating Update Videos",
+      "openedDate": "2021-04-10",
+      "description": "Translate Community Updates videos to non-English languages.",
+      "links": ["https://testnet.joystream.org/#/forum/threads/510","https://github.com/Joystream/community-repo/issues/144"],
+      "reward": 400,
+      "notes": "Translate Joystream Community Updates videos",
+      "tags": ["Content","Documentation"],
+      "format": "NA",
+      "status": "Open"
+    },
+    {
+      "id": 18,
+      "title": "Original Video Bounty",
+      "openedDate": "2021-05-29",
+      "description": "Create and upload original videos on Joystream",
+      "links": ["https://testnet.joystream.org/#/forum/threads/422","https://github.com/Joystream/community-repo/issues/162"],
+      "reward": 200,
+      "notes": "Create and upload original videos on Joystream",
+      "tags": ["Content"],
+      "format": "Open",
+      "status": "Open - Weekly Bounty"
+    },
+    {
+      "id": 21,
+      "title": "Website Translation",
+      "openedDate": "2021-06-28",
+      "description": "Translate the joystream.org website to languages other than English.",
+      "links": ["https://testnet.joystream.org/#/forum/threads/493","https://github.com/Joystream/community-repo/issues/212"],
+      "reward": 500,
+      "notes": "Translate the Joystream website",
+      "tags": ["Research","Coding"],
+      "format": "Open",
+      "status": "Open"
+    },
+    {
+      "id": 22,
+      "title": "KPIs Web UI",
+      "openedDate": "2021-04-10",
+      "description": "Create a UI for the council's KPIs.",
+      "links": ["https://testnet.joystream.org/#/forum/threads/510","https://github.com/Joystream/community-repo/issues/280"],
+      "reward": 250,
+      "notes": "Create a UI for the council's KPIs",
+      "tags": ["Research","Coding"],
+      "format": "Open",
+      "status": "Open"
+    },
+    {
+      "id": 23,
+      "title": "Runtime Update Explanation",
+      "openedDate": "2021-08-14",
+      "description": "Create an explanation of what a runtime upgrade can do",
+      "links": ["https://testnet.joystream.org/#/forum/threads/541","https://github.com/Joystream/community-repo/issues/289"],
+      "reward": 65,
+      "notes": "Runtime Update Explanation",
+      "tags": ["Documentation","Research"],
+      "format": "Open",
+      "status": "Open"
+    },
+    {
+      "id": 24,
+      "title": "Upload Content",
+      "openedDate": "2021-10-01",
+      "description": "Upload public domain and Creative Commons videos",
+      "links": ["https://testnet.joystream.org/#/forum/threads/623","https://github.com/Joystream/community-repo/issues/295"],
+      "reward": 300,
+      "notes": "Upload public domain videos",
+      "tags": ["Documentation","Research"],
+      "format": "Open",
+      "status": "Open - Weekly Bounty"
     },
     {
       "id": 25,
       "title": "Superstar Blogger Competition",
       "openedDate": "2021-10-01",
       "description": "Upload original videos",
-      "managers": ["@Millionchic1", "mmm"],
       "links": ["https://discord.com/channels/811216481340751934/886135291847520276","https://github.com/Joystream/community-repo/issues/311"],
       "reward": 400,
       "notes": "Upload original videos",
-      "tags": ["Creative", "Videos"],
+      "tags": ["Content"],
       "format": "Contest",
-      "status": "Closed"
-    }
+      "status": "Open"
+    },
+    {
+      "id": 26,
+      "title": "JS + Other Platform Videos",
+      "openedDate": "2021-10-01",
+      "description": "Create Promo Videos for JS",
+      "links": ["https://testnet.joystream.org/#/forum/threads/594","https://github.com/Joystream/community-repo/issues/342"],
+      "reward": 500,
+      "notes": "Upload original videos",
+      "tags": ["Content"],
+      "format": "Open",
+      "status": "Open"
+    },
+    {
+      "id": 27,
+      "title": "JS Official Music Theme",
+      "openedDate": "2021-10-01",
+      "description": "Create a musical theme for Joystream",
+      "links": ["https://testnet.joystream.org/#/proposals/606","https://github.com/Joystream/community-repo/issues/384"],
+      "reward": 400,
+      "notes": "Musical Theme",
+      "tags": ["Content"],
+      "format": "Open",
+      "status": "Open"
+   }
   ]
 }

+ 24 - 0
bounties/reports/weekly-bounty-report/07_11_2021_weekly_report_bounty_24.md

@@ -0,0 +1,24 @@
+# Report bounty 24
+### Bounty 24 has been verified under the new rules. New document :
+
+https://github.com/Joystream/community-repo/pull/366
+https://github.com/Joystream/community-repo/pull/367
+
+Videos were eveluated and checked.
+
+   1. Today the number of uploaded videos were 138.
+   2. BM checked all videos. Work of BM were re-checked Curators Lead .
+   3. General reward for all videos were 250$
+
+Also, the check was carried out in a new format and the entire assessment can be viewed here: 
+https://docs.google.com/spreadsheets/d/1E4iPjDiGjoVCgyNX_GmYPdmSDMMyGayJ/edit#gid=1461462558
+
+All licenses and videos have been verified under the new rules. Also, the video design has become more acceptable.
+
+`Notes: after the adoption of the new rules, the videos have become more interesting to watch and the quality of the videos has increased.
+Also, the video design has become more acceptable. `
+
+The new rules were confirmed by the consuls:
+
+https://testnet.joystream.org/#/proposals/481
+https://testnet.joystream.org/#/proposals/479

+ 24 - 0
bounties/reports/weekly-bounty-report/14_11_2021_weekly_report_bounty_24.md

@@ -0,0 +1,24 @@
+# Report bounty 24
+### Bounty 24 has been verified under the new rules. New document :
+
+https://github.com/Joystream/community-repo/pull/366
+https://github.com/Joystream/community-repo/pull/367
+
+Videos were eveluated and checked.
+
+   1. Today the number of uploaded videos were 94.
+   2. BM checked all videos. Work of BM were re-checked Curators Lead .
+   3. General reward for all videos were 250$
+
+Also, the check was carried out in a new format and the entire assessment can be viewed here: 
+https://docs.google.com/spreadsheets/d/1E4iPjDiGjoVCgyNX_GmYPdmSDMMyGayJ/edit#gid=1461462558
+
+All licenses and videos have been verified under the new rules. Also, the video design has become more acceptable.
+
+`Notes: after the adoption of the new rules, the videos have become more interesting to watch and the quality of the videos has increased.
+Also, the video design has become more acceptable. `
+
+The new rules were confirmed by the consuls:
+
+https://testnet.joystream.org/#/proposals/481
+https://testnet.joystream.org/#/proposals/479

+ 24 - 0
bounties/reports/weekly-bounty-report/21_11_2021_weekly_report_bounty_24.md

@@ -0,0 +1,24 @@
+# Report bounty 24
+### Bounty 24 has been verified under the new rules. New document :
+
+https://github.com/Joystream/community-repo/pull/366
+https://github.com/Joystream/community-repo/pull/367
+
+Videos were eveluated and checked.
+
+   1. Today the number of uploaded videos were 115.
+   2. BM checked all videos. Work of BM were re-checked Curators Lead .
+   3. General reward for all videos were 250$
+
+Also, the check was carried out in a new format and the entire assessment can be viewed here: 
+https://docs.google.com/spreadsheets/d/1E4iPjDiGjoVCgyNX_GmYPdmSDMMyGayJ/edit#gid=1461462558
+
+All licenses and videos have been verified under the new rules. Also, the video design has become more acceptable.
+
+`Notes: after the adoption of the new rules, the videos have become more interesting to watch and the quality of the videos has increased.
+Also, the video design has become more acceptable. `
+
+The new rules were confirmed by the consuls:
+
+https://testnet.joystream.org/#/proposals/481
+https://testnet.joystream.org/#/proposals/479

+ 24 - 0
bounties/reports/weekly-bounty-report/31_10_2021_weekly_report_bounty_24.md

@@ -0,0 +1,24 @@
+# Report bounty 24
+### Bounty 24 has been verified under the new rules. New document :
+
+https://github.com/Joystream/community-repo/pull/366
+https://github.com/Joystream/community-repo/pull/367
+
+Videos were eveluated and checked.
+
+   1. Today the number of uploaded videos were 113.
+   2. BM checked all videos. Work of BM were re-checked Curators Lead .
+   3. General reward for all videos were 250$
+
+Also, the check was carried out in a new format and the entire assessment can be viewed here: 
+https://docs.google.com/spreadsheets/d/1E4iPjDiGjoVCgyNX_GmYPdmSDMMyGayJ/edit#gid=1461462558
+
+All licenses and videos have been verified under the new rules. Also, the video design has become more acceptable.
+
+`Notes: after the adoption of the new rules, the videos have become more interesting to watch and the quality of the videos has increased.
+Also, the video design has become more acceptable. `
+
+The new rules were confirmed by the consuls:
+
+https://testnet.joystream.org/#/proposals/481
+https://testnet.joystream.org/#/proposals/479

+ 19 - 0
bounties/reports/weekly-bounty-report/Bounty_18_weekly_report_01_11_2021_07_11_2021.md

@@ -0,0 +1,19 @@
+# Report bounty 18
+### Bounty 18 has been verified under the new rules. New document :
+
+https://github.com/Joystream/community-repo/blob/master/bounties/reports/Adding_new_conditions_to_Bounty_18.md
+
+Videos were eveluated and checked (https://docs.google.com/spreadsheets/d/1VmOGKtxtPXP79Z6GFP_-JeElpfUPtlrW/edit#gid=1461462558).
+
+   1. Today the number of uploaded videos were 22.
+   2. BM checked all videos. Work of BM were re-checked Curators Lead .
+   3. General reward for all videos were 218$
+
+All licenses and videos have been verified under the new rules. Also, the video design has become more acceptable.
+
+`Notes: after the adoption of the new rules, the videos have become more interesting to watch and the quality of the videos has increased.
+Also, the video design has become more acceptable. `
+
+The new rules were confirmed by the consuls:
+
+https://testnet.joystream.org/#/proposals/488

+ 19 - 0
bounties/reports/weekly-bounty-report/Bounty_18_weekly_report_08_11_2021_14_11_2021.md

@@ -0,0 +1,19 @@
+# Report bounty 18
+### Bounty 18 has been verified under the new rules. New document :
+
+https://github.com/Joystream/community-repo/blob/master/bounties/reports/Adding_new_conditions_to_Bounty_18.md
+
+Videos were eveluated and checked (https://docs.google.com/spreadsheets/d/1VmOGKtxtPXP79Z6GFP_-JeElpfUPtlrW/edit#gid=1461462558).
+
+   1. Today the number of uploaded videos were 12.
+   2. BM checked all videos. Work of BM were re-checked Curators Lead .
+   3. General reward for all videos were 113$
+
+All licenses and videos have been verified under the new rules. Also, the video design has become more acceptable.
+
+`Notes: after the adoption of the new rules, the videos have become more interesting to watch and the quality of the videos has increased.
+Also, the video design has become more acceptable. `
+
+The new rules were confirmed by the consuls:
+
+https://testnet.joystream.org/#/proposals/488

+ 20 - 0
bounties/reports/weekly-bounty-report/Bounty_18_weekly_report_15_11_2021_21_11_2021.md

@@ -0,0 +1,20 @@
+# Report bounty 18 (13th week)
+### Bounty 18 has been verified under the new rules. New document :
+
+https://github.com/Joystream/community-repo/blob/master/bounties/reports/Adding_new_conditions_to_Bounty_18.md
+
+Videos were eveluated and checked (https://docs.google.com/spreadsheets/d/1VmOGKtxtPXP79Z6GFP_-JeElpfUPtlrW/edit#gid=1461462558).
+Forum thread with applications from participants: https://pioneer.joystreamstats.live/#/forum/threads/754
+
+   1. Today the number of uploaded videos were 8.
+   2. BM checked all videos. Work of BM were re-checked Curators Lead .
+   3. General reward for all videos were 130$
+
+All licenses and videos have been verified under the new rules. Also, the video design has become more acceptable.
+
+`Notes: after the adoption of the new rules, the videos have become more interesting to watch and the quality of the videos has increased.
+Also, the video design has become more acceptable. `
+
+The new rules were confirmed by the consuls:
+
+https://testnet.joystream.org/#/proposals/488

+ 19 - 0
bounties/reports/weekly-bounty-report/Bounty_18_weekly_report_25_10_2021_31_10_2021.md

@@ -0,0 +1,19 @@
+# Report bounty 18
+### Bounty 18 has been verified under the new rules. New document :
+
+https://github.com/Joystream/community-repo/blob/master/bounties/reports/Adding_new_conditions_to_Bounty_18.md
+
+Videos were eveluated and checked (https://docs.google.com/spreadsheets/d/1VmOGKtxtPXP79Z6GFP_-JeElpfUPtlrW/edit#gid=1461462558).
+
+   1. Today the number of uploaded videos were 33.
+   2. BM checked all videos. Work of BM were re-checked Curators Lead .
+   3. General reward for all videos were 211$
+
+All licenses and videos have been verified under the new rules. Also, the video design has become more acceptable.
+
+`Notes: after the adoption of the new rules, the videos have become more interesting to watch and the quality of the videos has increased.
+Also, the video design has become more acceptable. `
+
+The new rules were confirmed by the consuls:
+
+https://testnet.joystream.org/#/proposals/488

+ 31 - 0
contributions/tech/bounty_10_revised_rules_draft.md

@@ -0,0 +1,31 @@
+## Bounty 10 revised rules Draft
+
+### Intentions
+* Increase the quality of submissions and decrease the number of low quality contributions.
+* Reduce the workload on the Content Curators group and the council. The number of submissions previously is clearly unmanagable for not only the curators, but also makes it close to impossible for the council to have oversight on what videos are being rewarded.
+* Move a large amount of responsibility away from the curator group and onto the users submitting `public domain videos` for this bounty--the curator group is still responsible for grading submissions, but they can post the results once per week on the `community-repo` and users are responsible for checking the grading of their videos.
+* Move this bounty to have a very clear deliniation between each week. Payouts/grading should happen once the week is over. Each week should have a separate thread. Each week should have one report.
+* The workload and responsibilities should be clearer.
+
+### Requirements
+* Require a new thread to be created each week for this bounty. When the week is over, the bounty manager/curator group can post a notification that the week is over and direct people to a new thread. This will allow for much easier organization of entries.
+* Once grading/payouts are completed, the BM can post a table with the results of the week. This should include a few details about each entry (videoID, username, forum link, grade/payout) and also a 
+* Require each submission to be a unique forum post (for the purpose of easier management)--any bulk submissions can be disqualified
+* Require each submission to include source information, duration and have a short template users can fill in with information about the video (source, format, category, description)
+* Any incomplete submissions can be completely ignored. The Curators do not need to notify people that do not make a minimum of effort on their entries.
+* This is a significant bounty for the platform, it has many positive qualities that help to understand how the platform works. As such, the curator lead should assign dedicated "workers" specifically for this bounty. At least 2 seems like a sensible amount. These workers could be entirely responsible for the bounty (grading, payments + reporting) to lessen the workload of the lead. They could also be paid a different amount from normal curators (and this could be adjusted based on the number of entries).
+
+### Reward Structure
+* It is suggested that the cap of $500 per week is kept.
+* A small selection (up to 10 videos per week) of very high quality, interesting submissions should be rewarded with a higher amount (up to $20 / each) per week.
+* The rewards for each regular video can be $3-5 depending on grading.
+* The curators who manage this bounty can be paid a higher rate, or we could use `spending proposals` to reward them once work is done. Since this is going to very clearly be a weekly bounty, the managers can rotate if desired.
+
+### Further Ideas
+* Require each submission to have an amount of tokens (i.e. 10,000 JOY) to a burn address.
+* Introduce a weekly theme (for example, this week can be `public domain movies`, next week can be `public domain cooking videos`) so that we are not just getting blanket uploads of random videos.
+
+### Disqualifications
+* Anything that does not include a source that clearly shows the video has an appropriate license should immediately be excluded from any rewards.
+* Anything of low quality should be excluded. This includes extremely short videos or any video that the curator group feel has a questionable source.
+* The curator team can post a CSV file on the `community-repo` once a week which mentions the status of each submission. If submissions are disqualified they do not need to individually reach out, the users submitting public domain videos for this bounty are responsible for checking the status.

+ 5 - 0
contributions/tech/council-report-generator/cli/.gitignore

@@ -0,0 +1,5 @@
+.idea/*
+lib/*
+node_modules
+yarn.lock
+report.md

+ 25 - 0
contributions/tech/council-report-generator/cli/package.json

@@ -0,0 +1,25 @@
+{
+  "name": "council-report-generator",
+  "version": "0.1.0",
+  "license": "GPL-3.0-only",
+  "scripts": {
+    "index": "ts-node src/index.ts"
+  },
+  "dependencies": {
+    "@joystream/types": "^0.16.1",
+    "@polkadot/api": "4.2.1",
+    "@polkadot/keyring": "^6.0.5",
+    "@polkadot/types": "4.2.1",
+    "@polkadot/util": "^6.0.5",
+    "@polkadot/util-crypto": "^6.0.5",
+    "@types/bn.js": "^4.11.5",
+    "bn.js": "^4.11.8",
+    "express": "^4.17.1"
+  },
+  "devDependencies": {
+    "@polkadot/ts": "^0.3.62",
+    "@types/node": "^16.4.0",
+    "ts-node": "^10.1.0",
+    "typescript": "^3.9.7"
+  }
+}

+ 130 - 0
contributions/tech/council-report-generator/cli/report-template.md

@@ -0,0 +1,130 @@
+# Sumer - Council Election Round #{electionRound}  - Performance Review and Minutes
+## 1 - Basic Information
+### 1.1 - Introduction
+The council is expected to produce reports during each round and provide feedback in the form of workflow, challenges, thinking and performance as well as minutes covering important events during the council session.
+
+Usernames referenced are Joystream usernames.
+All times are calculated based on {averageBlockProductionTime} second blocktimes and not actual blocktimes.
+The Council Round number is taken from the chain, the KPI rounds have an offset number.
+
+### 1.2 - Council Round Overview
+* Council Election Round: #{electionRound}
+* Council Term: {councilTerm}
+* Start Block: #{startBlockHeight}
+* End Block: #{endBlockHeight}
+* Forum thread for round feedback: N/A
+
+### 1.3 - Council members & vote participation
+* All usernames are listed in the order given by `activeCouncil` from chain state.
+* Votes cast includes all types of vote (Approve, Reject, Abstain & Slash)
+* In the event a proposal is not finalized within the current council, it will be indicated and current council votes will not be recorded due to system limitations
+
+{councilTable}
+
+### 1.4 - Council Roles
+* Council Secretary
+    * {councilSecretary}
+* Council Deputy Secretary
+    * {councilDeputySecretary}
+
+### 1.5 - Council Mint & Budget Status
+* Start minted: {startMinted}
+* End minted: {endMinted}
+* Total minted during council round: {totalNewMinted} tokens (+{percNewMinted}% from start)
+
+* Budget proposal link: https://testnet.joystream.org/#/proposals/802
+* Budget forum link: https://testnet.joystream.org/#/forum/threads/717
+
+(Note: The council budget is now based on the rewards for roles, council payments and validator payments. Jsgenesis decides how much to set the mint to.)
+
+## 2 - Minutes
+### 2.1 - Proposal Overview
+Proposal Types
+- {proposalsCreated} Proposals Created
+    - {textProposals} Text Proposals
+    - {spendingProposals} Spending Proposals
+    - {setWorkingGroupLeaderRewardProposals} SetWorkingGroupLeaderReward Proposals
+    - {setWorkingGroupMintCapacityProposals} SetWorkingGroupMintCapacity Proposals
+    - {beginReviewWorkingGroupLeaderApplicationProposals} BeginReviewWorkingGroupLeaderApplication Proposals
+    - {terminateWorkingGroupLeaderRoleProposals} TerminateWorkingGroupLeaderRole
+    - {fillWorkingGroupLeaderOpeningProposals} FillWorkingGroupLeaderOpening
+    - {setValidatorCountProposals} SetValidatorCount
+    - {addWorkingGroupLeaderOpeningProposals} AddWorkingGroupLeaderOpening
+    - {setElectionParametersProposals} SetElectionParameters
+    - {runtimeUpgradeProposals} RuntimeUpgrade
+
+Proposal States
+- {approvedExecutedProposals} Approved & executed proposals
+- {canceledProposals} Canceled proposals
+- {rejectedProposals} Rejected proposals
+- {slashedProposals} Slashed proposals
+- {expiredProposals} Expired proposals
+- {activeProposals} proposals passed to next council
+    - These proposals didn't gather enough quorum in the current council term, so the votes are reset and passed to the next council.
+
+Failed Proposals
+- {proposalsFailedForNotEnoughCapacity} NotEnoughCapacity failures
+- {proposalsFailedForExecutionFailed} ExecutionFailed
+
+- Total time for proposals to finalize: {totalProposalsFinalizeTime} hours
+- Average time for proposals to finalize: {averageTimeForProposalsToFinalize} hours
+    - This average is calculated from all proposals, including expired proposals but excluding canceled proposals.
+
+### 2.2 - Proposal Breakdown
+
+{proposalBreakdown}
+
+### 2.4 - Select threads & events
+N/A
+
+### 2.5 - Working Group Spotchecks
+- Storage Role Spot Check: N/A
+- Curator Role Spot Check: N/A
+- Operations Role Spot Check: N/A
+
+## 3 - Review
+### 3.1 - Workflow, Performance, Challenged & Thinking
+* N/A
+
+## 4 - Obligations
+Council obligations are payments or items that carry through council sessions. These are noted so that future councils can easily see what items they should be aware of. Items can be removed from here once they have been resolved or become outdated.
+
+### 4.1 Current Documents / Processes
+- Council Report
+    - Each council should produce a report which highlights important events, council participation, mint spending and other important facts surrounding the council term
+- Council Budget
+    - This is a proposal which tries to guide how many tokens the current council may have available to it during a term. This is a non binding proposal, so is mainly used as a guide for now.
+
+### 4.2 Regular Payments / Proposals
+- Council Mint
+    - The council mint needs to be checked on a regular basis and in the event it is near depletion, a council member should notify a member of Jsgenesis in order for it to be refilled.
+    - The council mint is set at a value decided by Jsgenesis.
+- Council Roles
+    - Council Secretary
+        - This role was introduced in Council Round #18 and the payments are now managed by KPI rewards.
+- Content Curator Mint
+    - The Content Curator Mint currently has a maximum value of 5 million tokens.
+    - The Content Curator Mint has to be filled periodically and the agreed amount was discussed earlier. The amount may change in the future, but the rewards for this role are dependent on the council passing these proposals in a timely fashion.
+    - The Content Curator Lead role is expected to keep track of their mint level and any member of the Joystream platform can create a proposal to refill this mint.
+- Storage Mint
+    - The Storage Mint currently has a maximum value of 5 million tokens.
+    - This mint has be refilled periodically
+    - The Storage Lead role is expected to keep track of their mint level and any member of the Joystream platform can create a proposal to refill this mint.
+
+### 4.2 Bounties
+- Bounties are shown on the forum Bounties section: https://testnet.joystream.org/#/forum/categories/10
+
+## 5 - Report changelog
+- [October, November 2021](https://github.com/Joystream/community-repo/pull/428)
+    - proposals refactor, show amount for spending proposals
+
+- 04.11.2020
+    - added working group review section
+
+- 22.10.2020
+    - updated budget section to reflect nature of new budget system
+    - updated events to be threads & events
+
+- 14.09.2020
+    - removed member addresses and replaced with member IDs since they take less space
+    - added realized and unrealized spending

+ 83 - 0
contributions/tech/council-report-generator/cli/src/index.ts

@@ -0,0 +1,83 @@
+// @ts-check
+
+import { ApiPromise, WsProvider } from "@polkadot/api";
+import { types as joyTypes } from "@joystream/types";
+import { Hash, Moment } from "@polkadot/types/interfaces";
+import {
+  BlockRange,
+  CouncilMemberInfo,
+  CouncilRoundInfo,
+  ProposalFailedReason,
+  ProposalInfo,
+  ProposalStatus,
+  ProposalType,
+  ReportData,
+} from "./types";
+import { Seats } from "@joystream/types/council";
+import { MemberId, Membership } from "@joystream/types/members";
+import { StorageKey, u32, U32, Vec } from "@polkadot/types";
+import { Mint, MintId } from "@joystream/types/mint";
+import { ProposalDetailsOf, ProposalOf } from "@joystream/types/augment/types";
+
+import { generateReportData } from "./report-functions";
+
+const fsSync = require("fs");
+const fs = fsSync.promises;
+
+const PROPOSAL_URL = "https://testnet.joystream.org/#/proposals/";
+const ELECTION_OFFSET = 1;
+
+async function main() {
+  const args = process.argv.slice(2);
+  if (args.length != 2) {
+    console.error("Usage: [start bock number] [end block number]");
+    process.exit(1);
+  }
+
+  const startCouncilBlock = Number(args[0]);
+  const endCouncilBlock = Number(args[1]);
+
+  const provider = new WsProvider("ws://localhost:9944");
+
+  const api = new ApiPromise({ provider, types: joyTypes });
+  await api.isReady;
+
+  const startHash = (await api.rpc.chain.getBlockHash(
+    startCouncilBlock
+  )) as Hash;
+  const endHash = (await api.rpc.chain.getBlockHash(endCouncilBlock)) as Hash;
+  const blockRange = new BlockRange(
+    startCouncilBlock,
+    startHash,
+    endCouncilBlock,
+    endHash
+  );
+
+  const reportData = await generateReportData(api, blockRange);
+  const reportGenerationResult = await generateReport(reportData);
+  await fs.writeFile("report.md", reportGenerationResult);
+
+  api.disconnect();
+}
+
+async function generateReport(data: ReportData) {
+  try {
+    let fileData = await fs.readFile(__dirname + "/../report-template.md", {
+      encoding: "utf8",
+    });
+
+    let entries = Object.entries(data);
+
+    for (let entry of entries) {
+      let regex = new RegExp("{" + entry[0] + "}", "g");
+      fileData = fileData.replace(regex, entry[1].toString());
+    }
+
+    return fileData;
+  } catch (e) {
+    console.error(e);
+  }
+  return "";
+}
+
+main();

+ 460 - 0
contributions/tech/council-report-generator/cli/src/report-functions.ts

@@ -0,0 +1,460 @@
+import { ApiPromise } from "@polkadot/api";
+import {
+  BlockRange,
+  CouncilMemberInfo,
+  CouncilRoundInfo,
+  ProposalFailedReason,
+  ProposalInfo,
+  ProposalStatus,
+  ProposalType,
+  ReportData,
+} from "./types";
+import { StorageKey, U32, u32, Vec } from "@polkadot/types";
+import { Seats } from "@joystream/types/council";
+import { MemberId, Membership } from "@joystream/types/members";
+import { Mint, MintId } from "@joystream/types/mint";
+import { ProposalDetailsOf, ProposalOf } from "@joystream/types/augment/types";
+import { Moment } from "@polkadot/types/interfaces";
+
+const PROPOSAL_URL = "https://testnet.joystream.org/#/proposals/";
+const ELECTION_OFFSET = 2;
+
+export async function generateReportData(
+  api: ApiPromise,
+  blockRange: BlockRange
+) {
+  const averageBlockProductionTime = await computeAverageBlockProductionTime(
+    api,
+    blockRange
+  );
+
+  const proposals = await getProposals(api, blockRange);
+  const electionRound = (await api.query.councilElection.round.at(
+    blockRange.startBlockHash
+  )) as u32;
+
+  const roundInfo = await getCouncilMembersInfo(api, blockRange, proposals);
+  const { members, membersOwnStake, backersTotalStake } = roundInfo;
+  const { startMinted, endMinted } = roundInfo;
+
+  let councilTable =
+    "| Username             | Member ID | Prop. Votes Cast | CM Own Stake | CM Voter Stake |\n" +
+    "|----------------------|-----------|------------------|--------------|----------------|\n";
+
+  for (const member of members) {
+    const { username, memberId, votesInProposals, ownStake, backersStake } =
+      member;
+    councilTable += `| @${username} | ${memberId} | ${votesInProposals} | ${ownStake} | ${backersStake} |\n`;
+  }
+  councilTable += `| | | Subtotal: | ${membersOwnStake} | ${backersTotalStake} |\n`;
+  const totalStake = membersOwnStake + backersTotalStake;
+  councilTable += `| | | Total: | ${totalStake} |  |\n`;
+
+  const councilSecretary = getCouncilSecretary(proposals);
+  const councilSecretaryDeputy = getCouncilSecretaryDeputy(proposals);
+
+  let proposalsBreakdownText = "";
+  for (const proposal of proposals) {
+    const { id, name, type, status, failedReason, paymentAmount } = proposal;
+    const { creatorUsername, votersUsernames, blocksToFinalized } = proposal;
+
+    let proposalStatusText = "";
+    switch (status) {
+      case ProposalStatus.Active:
+        proposalStatusText = "Passed to next council";
+        break;
+      case ProposalStatus.Executed:
+        proposalStatusText = "Approved & Executed";
+        break;
+      case ProposalStatus.ExecutionFailed:
+        const reason =
+          ProposalFailedReason[failedReason as ProposalFailedReason];
+        proposalStatusText = `Execution failed (${reason})`;
+        break;
+      case ProposalStatus.PendingExecution:
+        proposalStatusText = "Execution Pending";
+        break;
+      case ProposalStatus.Rejected:
+        proposalStatusText = "Rejected";
+        break;
+      case ProposalStatus.Cancelled:
+        proposalStatusText = "Canceled";
+        break;
+      case ProposalStatus.Expired:
+        proposalStatusText = "Expired";
+        break;
+      case ProposalStatus.Slashed:
+        proposalStatusText = "Slashed";
+        break;
+    }
+
+    proposalsBreakdownText += `#### Proposal ${id} - ${name}\n`;
+    proposalsBreakdownText += `- Proposal Link: ${PROPOSAL_URL}${id}\n`;
+    proposalsBreakdownText += `- Proposal Type: ${ProposalType[type]}\n`;
+
+    if (paymentAmount)
+      proposalsBreakdownText += `\t- Amount: ${paymentAmount}\n`;
+
+    if (proposal.paymentDestinationMemberUsername)
+      proposalsBreakdownText += `\t- Destination member: ${proposal.paymentDestinationMemberUsername}\n`;
+
+    proposalsBreakdownText += `- Status: ${proposalStatusText}\n`;
+    if (blocksToFinalized > 0 && status != ProposalStatus.Cancelled) {
+      const time = averageBlockProductionTime;
+      const days = convertBlocksToHours(blocksToFinalized, time);
+      proposalsBreakdownText += `\t- Time to finalize: ${blocksToFinalized} blocks (${days}h)\n`;
+    }
+    proposalsBreakdownText += `- Created by: @${creatorUsername}\n`;
+    let participantsText = votersUsernames.map((vote) => `@${vote}`).join(", ");
+    proposalsBreakdownText += `- Participants: ${participantsText}\n\n`;
+  }
+  proposalsBreakdownText = proposalsBreakdownText.substring(
+    0,
+    proposalsBreakdownText.length - 2
+  ); //Remove last \n\n
+
+  let reportData = new ReportData();
+  reportData.averageBlockProductionTime = averageBlockProductionTime.toFixed(2);
+  reportData.electionRound = Number(electionRound.toBigInt());
+  reportData.councilTerm = reportData.electionRound - ELECTION_OFFSET;
+  reportData.startBlockHeight = blockRange.startBlockHeight;
+  reportData.endBlockHeight = blockRange.endBlockHeight;
+  reportData.startMinted = startMinted;
+  reportData.endMinted = endMinted;
+
+  reportData.totalNewMinted = endMinted - startMinted;
+  reportData.percNewMinted = convertToPercentage(startMinted, endMinted);
+
+  reportData.councilTable = councilTable;
+  reportData.councilSecretary =
+    councilSecretary == "" ? "?" : "@" + councilSecretary;
+  reportData.councilDeputySecretary =
+    councilSecretaryDeputy == "" ? "?" : "@" + councilSecretaryDeputy;
+
+  reportData.proposalsCreated = proposals.length;
+  reportData.textProposals = proposals.filter(
+    (proposal) => proposal.type == ProposalType.Text
+  ).length;
+  reportData.spendingProposals = proposals.filter(
+    (proposal) => proposal.type == ProposalType.Spending
+  ).length;
+  reportData.setWorkingGroupLeaderRewardProposals = proposals.filter(
+    (proposal) => proposal.type == ProposalType.SetWorkingGroupLeaderReward
+  ).length;
+  reportData.setWorkingGroupMintCapacityProposals = proposals.filter(
+    (proposal) => proposal.type == ProposalType.SetWorkingGroupMintCapacity
+  ).length;
+  reportData.beginReviewWorkingGroupLeaderApplicationProposals =
+    proposals.filter(
+      (proposal) =>
+        proposal.type == ProposalType.BeginReviewWorkingGroupLeaderApplication
+    ).length;
+  reportData.terminateWorkingGroupLeaderRoleProposals = proposals.filter(
+    (proposal) => proposal.type == ProposalType.TerminateWorkingGroupLeaderRole
+  ).length;
+  reportData.fillWorkingGroupLeaderOpeningProposals = proposals.filter(
+    (proposal) => proposal.type == ProposalType.FillWorkingGroupLeaderOpening
+  ).length;
+  reportData.setValidatorCountProposals = proposals.filter(
+    (proposal) => proposal.type == ProposalType.SetValidatorCount
+  ).length;
+  reportData.addWorkingGroupLeaderOpeningProposals = proposals.filter(
+    (proposal) => proposal.type == ProposalType.AddWorkingGroupLeaderOpening
+  ).length;
+  reportData.setElectionParametersProposals = proposals.filter(
+    (proposal) => proposal.type == ProposalType.SetElectionParameters
+  ).length;
+  reportData.runtimeUpgradeProposals = proposals.filter(
+    (proposal) => proposal.type == ProposalType.RuntimeUpgrade
+  ).length;
+
+  reportData.approvedExecutedProposals = proposals.filter(
+    (proposal) => proposal.status == ProposalStatus.Executed
+  ).length;
+  reportData.canceledProposals = proposals.filter(
+    (proposal) => proposal.status == ProposalStatus.Cancelled
+  ).length;
+  reportData.rejectedProposals = proposals.filter(
+    (proposal) => proposal.status == ProposalStatus.Rejected
+  ).length;
+  reportData.slashedProposals = proposals.filter(
+    (proposal) => proposal.status == ProposalStatus.Slashed
+  ).length;
+  reportData.expiredProposals = proposals.filter(
+    (proposal) => proposal.status == ProposalStatus.Expired
+  ).length;
+  reportData.activeProposals = proposals.filter(
+    (proposal) => proposal.status == ProposalStatus.Active
+  ).length;
+
+  let executedNonCancelledProposals = proposals.filter(
+    ({ status, blocksToFinalized }) =>
+      blocksToFinalized > 0 && status != ProposalStatus.Cancelled
+  );
+  let totalFinalizeTime = executedNonCancelledProposals.reduce(
+    (accumulator, proposal) => accumulator + proposal.blocksToFinalized,
+    0
+  );
+  let averageFinalizeTime =
+    totalFinalizeTime / executedNonCancelledProposals.length;
+
+  let failedProposals = proposals.filter(
+    (proposal) => proposal.status == ProposalStatus.ExecutionFailed
+  );
+
+  reportData.proposalsFailedForNotEnoughCapacity = failedProposals.filter(
+    ({ failedReason }) => failedReason == ProposalFailedReason.NotEnoughCapacity
+  ).length;
+  reportData.proposalsFailedForExecutionFailed = failedProposals.filter(
+    ({ failedReason }) => failedReason == ProposalFailedReason.ExecutionFailed
+  ).length;
+
+  reportData.totalProposalsFinalizeTime = convertBlocksToHours(
+    totalFinalizeTime,
+    averageBlockProductionTime
+  );
+  reportData.averageTimeForProposalsToFinalize = convertBlocksToHours(
+    averageFinalizeTime,
+    averageBlockProductionTime
+  );
+  reportData.proposalBreakdown = proposalsBreakdownText;
+  return reportData;
+}
+
+async function getCouncilMembersInfo(
+  api: ApiPromise,
+  range: BlockRange,
+  proposals: Array<ProposalInfo>
+) {
+  const seats = (await api.query.council.activeCouncil.at(
+    range.startBlockHash
+  )) as Seats;
+
+  let councilRoundInfo = new CouncilRoundInfo();
+  councilRoundInfo.members = await Promise.all(
+    seats.map(async (seat) => {
+      let info = new CouncilMemberInfo();
+      let memberKey = seat.member.toString();
+      info.memberId = Number(
+        (
+          (await api.query.members.memberIdsByControllerAccountId(
+            memberKey
+          )) as Vec<MemberId>
+        )[0].toBigInt()
+      );
+      const membership = (await api.query.members.membershipById(
+        info.memberId
+      )) as Membership;
+      info.username = membership.handle.toString();
+      info.ownStake = Number(seat.stake.toBigInt());
+      const backersStakeArray = seat.backers.map((backer) =>
+        Number(backer.stake.toBigInt())
+      );
+      info.backersStake = backersStakeArray.reduce((a, b) => a + b, 0);
+      return info;
+    })
+  );
+
+  councilRoundInfo.membersOwnStake = councilRoundInfo.members
+    .map((councilMemberInfo) => councilMemberInfo.ownStake)
+    .reduce((a, b) => a + b, 0);
+  councilRoundInfo.backersTotalStake = councilRoundInfo.members
+    .map((councilMemberInfo) => councilMemberInfo.backersStake)
+    .reduce((a, b) => a + b, 0);
+
+  for (let councilMemberInfo of councilRoundInfo.members) {
+    councilMemberInfo.votesInProposals = proposals.filter((proposal) =>
+      proposal.votersUsernames.includes(councilMemberInfo.username)
+    ).length;
+  }
+
+  let councilMint = (await api.query.council.councilMint()) as MintId;
+  let startCouncilMint = (await api.query.minting.mints.at(
+    range.startBlockHash,
+    councilMint
+  )) as Mint;
+  let endCouncilMint = (await api.query.minting.mints.at(
+    range.endBlockHash,
+    councilMint
+  )) as Mint;
+
+  councilRoundInfo.startMinted = Number(
+    startCouncilMint.total_minted.toBigInt()
+  );
+  councilRoundInfo.endMinted = Number(endCouncilMint.total_minted.toBigInt());
+
+  return councilRoundInfo;
+}
+
+async function getProposals(api: ApiPromise, range: BlockRange) {
+  let startProposalCount = Number(
+    (
+      (await api.query.proposalsEngine.proposalCount.at(
+        range.startBlockHash
+      )) as U32
+    ).toBigInt()
+  );
+  let endProposalCount = Number(
+    (
+      (await api.query.proposalsEngine.proposalCount.at(
+        range.endBlockHash
+      )) as U32
+    ).toBigInt()
+  );
+
+  let proposals = new Array<ProposalInfo>();
+  for (let i = startProposalCount - 1; i <= endProposalCount; i++) {
+    let proposal = (await api.query.proposalsEngine.proposals.at(
+      range.endBlockHash,
+      i
+    )) as ProposalOf;
+    if (proposal.createdAt.toBigInt() < range.startBlockHeight) {
+      continue;
+    }
+
+    let proposer = (await api.query.members.membershipById(
+      proposal.proposerId
+    )) as Membership;
+    let proposalInfo = new ProposalInfo();
+    proposalInfo.id = i;
+    proposalInfo.name = proposal.title.toString();
+    proposalInfo.creatorUsername = proposer.handle.toString();
+
+    if (proposal.status.isFinalized) {
+      const finalizedData = proposal.status.asFinalized;
+
+      if (finalizedData.proposalStatus.isCanceled) {
+        proposalInfo.status = ProposalStatus.Cancelled;
+      } else if (finalizedData.proposalStatus.isExpired) {
+        proposalInfo.status = ProposalStatus.Expired;
+      } else if (finalizedData.proposalStatus.isRejected) {
+        proposalInfo.status = ProposalStatus.Rejected;
+      } else if (finalizedData.proposalStatus.isApproved) {
+        let approvedData = finalizedData.proposalStatus.asApproved;
+        if (approvedData.isExecuted) {
+          proposalInfo.status = ProposalStatus.Executed;
+        } else if (approvedData.isPendingExecution) {
+          proposalInfo.status = ProposalStatus.PendingExecution;
+        } else if (approvedData.isExecutionFailed) {
+          proposalInfo.status = ProposalStatus.ExecutionFailed;
+          let executionFailedData = approvedData.asExecutionFailed;
+          if (executionFailedData.error.toString() == "NotEnoughCapacity") {
+            proposalInfo.failedReason = ProposalFailedReason.NotEnoughCapacity;
+          } else {
+            proposalInfo.failedReason = ProposalFailedReason.ExecutionFailed;
+          }
+        }
+      } else if (finalizedData.proposalStatus.isSlashed) {
+        proposalInfo.status = ProposalStatus.Slashed;
+      }
+
+      proposalInfo.blocksToFinalized =
+        Number(proposal.status.asFinalized.finalizedAt.toBigInt()) -
+        Number(proposal.createdAt.toBigInt());
+
+      const proposalByVoters =
+        await api.query.proposalsEngine.voteExistsByProposalByVoter.entries(i);
+
+      for (let proposalByVoter of proposalByVoters) {
+        let key = proposalByVoter[0] as StorageKey;
+        let memberId = key.args[1] as MemberId;
+        let member = (await api.query.members.membershipById(
+          memberId
+        )) as Membership;
+        proposalInfo.votersUsernames.push(member.handle.toString());
+      }
+    }
+
+    let proposalDetails =
+      (await api.query.proposalsCodex.proposalDetailsByProposalId(
+        i
+      )) as ProposalDetailsOf;
+    let typeString = proposalDetails.type as keyof typeof ProposalType;
+    proposalInfo.type = ProposalType[typeString];
+
+    if (proposalInfo.type == ProposalType.Spending) {
+      let spendingData = proposalDetails.asSpending;
+      let accountId = spendingData[1];
+      proposalInfo.paymentAmount = Number(spendingData[0].toBigInt());
+      let paymentDestinationMemberId =
+        await api.query.members.memberIdsByControllerAccountId(accountId);
+      if (!paymentDestinationMemberId.isEmpty) {
+        let paymentDestinationMembership =
+          (await api.query.members.membershipById(
+            paymentDestinationMemberId
+          )) as Membership;
+        proposalInfo.paymentDestinationMemberUsername =
+          paymentDestinationMembership.handle.toString();
+      }
+    }
+
+    proposals.push(proposalInfo);
+  }
+
+  return proposals;
+}
+
+function getCouncilSecretary(proposals: ProposalInfo[]) {
+  let filteredProposals = proposals.filter((proposal) => {
+    return (
+      proposal.status == ProposalStatus.Executed &&
+      proposal.name.toLowerCase().includes("council") &&
+      proposal.name.toLowerCase().includes("secretary") &&
+      !proposal.name.toLowerCase().includes("deputy")
+    );
+  });
+
+  if (filteredProposals.length != 1) {
+    return "";
+  }
+
+  return filteredProposals[0].creatorUsername;
+}
+
+function getCouncilSecretaryDeputy(proposals: ProposalInfo[]) {
+  let filteredProposals = proposals.filter((proposal) => {
+    return (
+      proposal.status == ProposalStatus.Executed &&
+      proposal.name.toLowerCase().includes("secretary") &&
+      proposal.name.toLowerCase().includes("deputy")
+    );
+  });
+
+  if (filteredProposals.length != 1) {
+    return "";
+  }
+
+  return filteredProposals[0].creatorUsername;
+}
+
+function convertToPercentage(previousValue: number, newValue: number): number {
+  if (previousValue == 0) {
+    return newValue > 0 ? Infinity : 0;
+  }
+  return Number(((newValue * 100) / previousValue - 100).toFixed(2));
+}
+
+function convertBlocksToHours(
+  nrBlocks: number,
+  averageProductionBlockTime: number
+): string {
+  return ((nrBlocks * averageProductionBlockTime) / 60 / 60).toFixed(2);
+}
+
+async function computeAverageBlockProductionTime(
+  api: ApiPromise,
+  range: BlockRange
+) {
+  let startTimestamp = (await api.query.timestamp.now.at(
+    range.startBlockHash
+  )) as Moment;
+  let endTimestamp = (await api.query.timestamp.now.at(
+    range.endBlockHash
+  )) as Moment;
+  let newBlocks = range.endBlockHeight - range.startBlockHeight;
+  return (
+    (Number(endTimestamp.toBigInt()) - Number(startTimestamp.toBigInt())) /
+    1000 /
+    newBlocks
+  );
+}

+ 124 - 0
contributions/tech/council-report-generator/cli/src/types.ts

@@ -0,0 +1,124 @@
+import { Hash } from "@polkadot/types/interfaces/types";
+import { ProposalDetailsOf } from "@joystream/types/augment/types";
+
+export class CouncilMemberInfo {
+  username: string = "";
+  memberId: number = 0;
+  ownStake: number = 0;
+  backersStake: number = 0;
+  votesInProposals: number = 0;
+
+  constructor() {}
+}
+
+export class CouncilRoundInfo {
+  members: CouncilMemberInfo[] = [];
+  membersOwnStake: number = 0;
+  backersTotalStake: number = 0;
+  membersTotalStake: number = 0;
+  startMinted: number = 0;
+  endMinted: number = 0;
+}
+
+export class BlockRange {
+  constructor(
+    public startBlockHeight: number,
+    public startBlockHash: Hash,
+    public endBlockHeight: number,
+    public endBlockHash: Hash
+  ) {}
+}
+
+export enum ProposalStatus {
+  Active,
+  // Approved,
+  Executed,
+  ExecutionFailed,
+  PendingExecution,
+  Rejected,
+  Cancelled,
+  Expired,
+  Slashed,
+}
+
+export enum ProposalFailedReason {
+  NotEnoughCapacity,
+  ExecutionFailed,
+}
+
+export enum ProposalType {
+  Text,
+  RuntimeUpgrade,
+  SetElectionParameters,
+  Spending,
+  SetLead,
+  SetContentWorkingGroupMintCapacity,
+  EvictStorageProvider,
+  SetValidatorCount,
+  SetStorageRoleParameters,
+  AddWorkingGroupLeaderOpening,
+  BeginReviewWorkingGroupLeaderApplication,
+  FillWorkingGroupLeaderOpening,
+  SetWorkingGroupMintCapacity,
+  DecreaseWorkingGroupLeaderStake,
+  SlashWorkingGroupLeaderStake,
+  SetWorkingGroupLeaderReward,
+  TerminateWorkingGroupLeaderRole,
+}
+
+export class ProposalInfo {
+  id: number = 0;
+  name: string = "";
+  creatorUsername: string = "";
+  votersUsernames: string[] = [];
+  status = ProposalStatus.Active;
+  type = ProposalType.Text;
+  blocksToFinalized: number = 0;
+  failedReason?: ProposalFailedReason;
+  paymentDestinationMemberUsername?: string;
+  paymentAmount?: number;
+}
+
+export class ReportData {
+  averageBlockProductionTime = "";
+  electionRound = 0;
+  councilTerm = 0;
+  startBlockHeight = 0;
+  endBlockHeight = 0;
+
+  startMinted = 0;
+  endMinted = 0;
+  totalNewMinted = 0;
+  percNewMinted = 0;
+
+  councilTable = "";
+  councilSecretary = "";
+  councilDeputySecretary = "";
+
+  proposalsCreated = 0;
+  textProposals = 0;
+  spendingProposals = 0;
+  setWorkingGroupLeaderRewardProposals = 0;
+  setWorkingGroupMintCapacityProposals = 0;
+  beginReviewWorkingGroupLeaderApplicationProposals = 0;
+  terminateWorkingGroupLeaderRoleProposals = 0;
+  fillWorkingGroupLeaderOpeningProposals = 0;
+  setValidatorCountProposals = 0;
+  addWorkingGroupLeaderOpeningProposals = 0;
+  setElectionParametersProposals = 0;
+  runtimeUpgradeProposals = 0;
+
+  approvedExecutedProposals = 0;
+  canceledProposals = 0;
+  rejectedProposals = 0;
+  slashedProposals = 0;
+  expiredProposals = 0;
+  activeProposals = 0;
+
+  proposalsFailedForNotEnoughCapacity = 0;
+  proposalsFailedForExecutionFailed = 0;
+
+  totalProposalsFinalizeTime = "";
+  averageTimeForProposalsToFinalize = "";
+  proposalBreakdown = "";
+}

+ 2 - 2
contributions/tech/report-generator/.gitignore

@@ -1,5 +1,5 @@
 .idea/*
-lib/*
 node_modules
+build
 yarn.lock
-report.md
+report.md

+ 27 - 13
contributions/tech/report-generator/README.md

@@ -1,20 +1,34 @@
-# Council Report Generator
+# Tokenomics Report Generator
 
 This scripts collects some information from Joystream chain. \
 It was created to allow the council to generate a report in the finish of the council round. \
 It takes some minutes to complete the report, multiple runs, with the same block range, will be quicker since it has a "cache" system for the block events.  
 
- ## Setup
- ```
- yarn && yarn build
- ```
+## Setup
 
- ## Usage
- ```
-node lib/generator.js <start block> <end block> 
- ```
+`yarn`
 
-## Example
- ```
-node lib/generator.js 57601 234038 
- ```
+To update the submodule in `src/lib`:
+```
+git submodule init
+git submodule update
+```
+
+## Usage
+
+`yarn run report`
+
+OR
+
+`yarn build && node build/generator.js <start block> <end block>`
+
+## Examples
+
+- `yarn run report 30`
+- `node build/generator.js 57601 234038`
+
+# Contributors
+
+* [freakstatic](https://github.com/freakstatic)
+* [l1dev](https://git.joystreamstats.live/l1devx)
+* [isonar](https://github.com/singulart)

+ 5 - 2
contributions/tech/report-generator/package.json

@@ -1,9 +1,10 @@
 {
   "name": "report-generator",
   "version": "0.1.0",
-  "main": "lib/index.js",
+  "main": "build/index.js",
   "license": "MIT",
   "scripts": {
+    "report": "ts-node src/generator.ts",
     "build": "tsc --build tsconfig.json",
     "status": "node lib/status"
   },
@@ -18,8 +19,10 @@
     "@polkadot/util-crypto": "^6.0.5",
     "@polkadot/wasm-crypto": "^4.0.2",
     "@types/bn.js": "^4.11.6",
+    "axios": "^0.24.0",
     "bn.js": "^5.1.2",
-    "csv-parse": "^4.15.4"
+    "csv-parse": "^4.15.4",
+    "ts-node": "^10.3.0"
   },
   "devDependencies": {
     "@polkadot/ts": "^0.3.62",

+ 43 - 30
contributions/tech/report-generator/report-template.md

@@ -11,25 +11,41 @@ This is a report which explains the current state of the Joystream network in nu
 | Property            | Start Block | End Block | % Change |
 |---------------------|--------------|--------------|----------|
 | Total Tokens Minted |  {startIssuance} | {endIssuance} | {percNewIssuance} |
+| USD Pool |  {startDollarPool} | {endDollarPool} | {dollarPoolPctChange} |
 
 | Property            | Value        |
 |---------------------|--------------|
-| Total Tokens Burned | {newTokensBurn}           | 
-| Spending Proposals (Executed)   |  {spendingProposalsTotal}                  |
-| Bounties paid       |  {bountiesTotalPaid}                           |
-| Validator Role      |  {newValidatorRewards}            |  
-| Storage Role        | {newStorageProviderReward}             | 
-| Curator Role        | {newCuratorRewards}             |
-| Operations Role     | {newOperationsReward}          |
+| Total Tokens Burned | {newTokensBurn} |
+| Spending Proposals (Executed) | {spendingProposalsTotal} |
+| Bounties paid       | {bountiesTotalPaid} |
+| Validator Role      | {newValidatorRewards} |
+| Storage Role        | {newStorageProviderReward} |
+| Curator Role        | {newCuratorRewards} |
+| Operations Role     | {newOperationsReward} |
+
+### 2.2 Fiat Pool
+| Property            | Start Block, USD | End Block, USD | % Change |
+|---------------------|--------------|--------------|----------|
+| USD Pool | {startDollarPool} | {endDollarPool} | {dollarPoolPctChange} |
 
+{dollarPoolRefills}
 
-### 2.3 Mints 
+### 2.3 Mints
 | Property                    | Start Block           | End Block | % Change |
 |-----------------------------|-----------------------|--------------|----------|
-| Council Mint Total Minted   | {startCouncilMinted}  |  {endCouncilMinted} |{percNewCouncilMinted}          |
-| Curator Mint Total Minted   |  {startCuratorMinted} | {endCuratorMinted}| {percCuratorMinted}          |
-| Storage Mint Total Minted   |  {startStorageMinted} |  {endStorageMinted}            |  {percStorageMinted}        |
-| Operations Mint Total Minted   |  {startOperationsMinted} |  {endOperationsMinted}            |  {percOperationsMinted}        |
+| Council Mint Total Minted   | {startCouncilMinted}  | {endCouncilMinted} |{percNewCouncilMinted} |
+| Curator Mint Total Minted   | {startCuratorMinted} | {endCuratorMinted} | {percCuratorMinted} |
+| Storage Mint Total Minted   | {startStorageMinted} | {endStorageMinted} | {percStorageMinted} |
+| Operations Mint Total Minted | {startOperationsMinted} | {endOperationsMinted} | {percOperationsMinted} |
+
+
+### 2.4 tJOY Inflation
+
+* Start Block Exchange Rate, USD/1M tJOY: {startTermExchangeRate}
+* End Block Exchange Rate, USD/1M tJOY: {endTermExchangeRate}
+* Inflation, %: {inflationPct}
+
+Negative value indicates deflation
 
 ## 3.0 Council
 * Council session #: {councilRound}
@@ -40,44 +56,41 @@ This is a report which explains the current state of the Joystream network in nu
 ### 3.1 Elections
 | Property                    | Start Block  |
 |-----------------------------|--------------|
-| Total Applicants            |{electionApplicants}              |
-| Total Applicant Stake       |{electionApplicantsStakes}              |
-| Total Votes                 |{electionVotes}             |
+| Total Applicants            | {electionApplicants} |
+| Total Applicant Stake       | {electionApplicantsStakes} |
+| Total Votes                 | {electionVotes} |
 
 ## 4 Roles
 ### 4.1 Validator Information
 * Block generation time (average): {avgBlockProduction}
 
-| Property                    | Start Block | End Block | % Change |
-|-----------------------------|--------------|--------------|----------|
-| Number of Validators       |  {startValidators} | {endValidators} | {percValidators} |
-| Validator Total Stake       | {startValidatorsStake} | {endValidatorsStake} | {percNewValidatorsStake} |
+| Property                   | Start Block | End Block | % Change |
+|----------------------------|--------------|--------------|----------|
+| Number of Validators       | {startValidators} | {endValidators} | {percValidators} |
+| Validator Total Stake      | {startValidatorsStake} | {endValidatorsStake} | {percNewValidatorsStake} |
 
 
 ### 4.2 Storage Role
 | Property                | Start Block | End Block | % Change |
 |-------------------------|--------------|--------------|----------|
-| Number of Storage Workers | {startStorageProviders}  |  {endStorageProviders} | {percNewStorageProviders} |
-| Total Storage Stake (workers + lead)  | {startStorageProvidersStake} |  {endStorageProvidersStake} | {percNewStorageProviderStake} |   
+| Number of Storage Workers | {startStorageProviders} | {endStorageProviders} | {percNewStorageProviders} |
+| Total Storage Stake (workers + lead) | {startStorageProvidersStake} | {endStorageProvidersStake} | {percNewStorageProviderStake} |
 
-Role occupants:  
 {storageProviders}
 
 ### 4.3 Curator Role
 | Property                | Start Block | End Block | % Change |
 |-------------------------|--------------|--------------|----------|
-| Number of Curators      | {startCurators} | {endCurators} | {percNewCurators} |   
+| Number of Curators      | {startCurators} | {endCurators} | {percNewCurators} |
 
-Role occupants:  
 {curators}
 
 ### 4.4 Operations Role
 | Property                | Start Block | End Block | % Change |
 |-------------------------|--------------|--------------|----------|
 | Number of Operations Workers      | {startOperationsWorkers} | {endOperationsWorkers} | {percNewOperationsWorkers} |
-| Total Operations Stake (workers + lead)  | {startOperationsStake} |  {endOperationsStake} | {percNewOperationstake} |
+| Total Operations Stake (workers + lead) | {startOperationsStake} | {endOperationsStake} | {percNewOperationstake} |
 
-Role occupants:  
 {operations}
 
 ## 5.0 User Generated Content
@@ -90,12 +103,12 @@ Role occupants:
 | Property                | Start Block | End Block | % Change |
 |-------------------------|--------------|--------------|----------|
 | Number of uploads       | {startMedia} | {endMedia}  |  {percNewMedia} |
-| Size of content (MB)        |  {startUsedSpace} |  {endUsedSpace} | {percNewUsedSpace}          |
+| Size of content (MB)    |  {startUsedSpace} |  {endUsedSpace} | {percNewUsedSpace} |
 | Number of channels      |  {startChannels} | {endChannels} | {percNewChannels} |
 
 ### 5.3 Forum Activity
 | Property          | Start Block | End Block | % Change |
 |-------------------|--------------|--------------|----------|
-| Number of categories | {startCategories} | {endCategories} | {perNewCategories}         |
-| Number of threads    | {startThreads}| {endThreads} | {percNewThreads}         |
-| Number of posts      | {startPosts} | {endPosts}            |  {percNewPosts}        |
+| Number of categories | {startCategories} | {endCategories} | {perNewCategories} |
+| Number of threads    | {startThreads} | {endThreads} | {percNewThreads} |
+| Number of posts      | {startPosts} | {endPosts} | {percNewPosts} |

+ 859 - 691
contributions/tech/report-generator/src/StatisticsCollector.ts

@@ -1,718 +1,886 @@
-import {ApiPromise, WsProvider} from "@polkadot/api";
-import {types} from '@joystream/types'
+import { ApiPromise } from "@polkadot/api";
+
+// types
 import {
-    AccountId,
-    Balance,
-    BalanceOf,
-    BlockNumber,
-    EraIndex,
-    EventRecord,
-    Hash,
-    Moment
+  AccountId,
+  Balance,
+  BalanceOf,
+  BlockNumber,
+  EventRecord,
+  Hash,
 } from "@polkadot/types/interfaces";
-
+import { Config, MintStatistics, Statistics, WorkersInfo } from "./types";
 import {
-    CacheEvent,
-    Media,
-    MintStatistics,
-    Statistics,
-    WorkersInfo, Channel, SpendingProposals, Bounty
-} from "./types";
-
-import {Option, u32, Vec} from "@polkadot/types";
-import {ElectionStake, SealedVote, Seats} from "@joystream/types/council";
-import {Mint, MintId} from "@joystream/types/mint";
-import {ContentId, DataObject} from "@joystream/types/media";
-
-
-import {ChannelId, PostId, ThreadId} from "@joystream/types/common";
-import {CategoryId} from "@joystream/types/forum";
-
-import {MemberId, Membership} from "@joystream/types/members";
-import {RewardRelationship, RewardRelationshipId} from "@joystream/types/recurring-rewards";
-
-import {Stake} from "@joystream/types/stake";
-
-import {WorkerId} from "@joystream/types/working-group";
-import {Entity, EntityId, PropertyType} from "@joystream/types/content-directory";
-import {ProposalId, Video, VideoId, WorkerOf, } from "@joystream/types/augment-codec/all";
-import {ProposalDetails, ProposalOf} from "@joystream/types/augment/types";
-import {SpendingParams} from "@joystream/types/proposals";
+  CacheEvent,
+  Bounty,
+  WorkerReward,
+  SpendingProposal,
+  StatusData,
+} from "./lib/types";
+
+import { Option, u32, Vec } from "@polkadot/types";
+import { ElectionStake, SealedVote, Seats } from "@joystream/types/council";
+import { Mint, MintId } from "@joystream/types/mint";
+import { ContentId, DataObject } from "@joystream/types/media";
+import { CategoryId } from "@joystream/types/forum";
+import { MemberId, Membership } from "@joystream/types/members";
+import {
+  Proposal,
+  ProposalId,
+  SpendingParams,
+} from "@joystream/types/proposals";
+import {
+  RewardRelationship,
+  RewardRelationshipId,
+} from "@joystream/types/recurring-rewards";
+import { Stake } from "@joystream/types/stake";
+import { Worker, WorkerId } from "@joystream/types/working-group";
+import { ProposalDetails, ProposalOf } from "@joystream/types/augment/types";
 import * as constants from "constants";
+import axios from "axios";
 
-const fsSync = require('fs');
-const fs = fsSync.promises;
-const parse = require('csv-parse/lib/sync');
-
-const BURN_ADDRESS = '5D5PhZQNJzcJXVBxwJxZcsutjKPqUPydrvpu6HeiBfMaeKQu';
-
-const COUNCIL_ROUND_OFFSET = 2;
-const PROVIDER_URL = "ws://localhost:9944";
-
-const CACHE_FOLDER = "cache";
-
-const VIDEO_CLASS_iD = 10;
-const CHANNEL_CLASS_iD = 1;
+// lib
+import { eventStats, getPercent, getTotalMinted, momentToString } from "./lib";
+import {
+  connectApi,
+  getBlock,
+  getBlockHash,
+  getHead,
+  getTimestamp,
+  getIssuance,
+  getEra,
+  getEraStake,
+  getEvents,
+  getCouncil,
+  getCouncilRound,
+  getCouncilSize,
+  getCouncilApplicants,
+  getCouncilApplicantStakes,
+  getCouncilCommitments,
+  getCouncilPayoutInterval,
+  getCouncilPayout,
+  getCouncilElectionDurations,
+  getNextWorker,
+  getWorkers,
+  getWorkerReward,
+  getStake,
+  getCouncilMint,
+  getMintsCreated,
+  getMint,
+  getGroupMint,
+  getNextMember,
+  getMember,
+  getNextPost,
+  getNextThread,
+  getNextCategory,
+  getProposalCount,
+  getProposalInfo,
+  getProposalDetails,
+  getValidatorCount,
+  getValidators,
+  getNextEntity,
+  getNextChannel,
+  getNextVideo,
+  getEntity,
+  getDataObject,
+  getDataObjects,
+} from "./lib/api";
 
-const SPENDING_PROPOSALS_CATEGORIES_FILE = __dirname + '/../../../documentation/spending_proposal_categories.csv';
+import {
+  filterMethods,
+  getWorkerRewards,
+  getWorkerRow,
+  getBurnedTokens,
+  getFinalizedSpendingProposals,
+  getActiveValidators,
+  getValidatorsRewards,
+} from "./lib/rewards";
+
+const fsSync = require("fs");
+const fs = fsSync.promises;
+const parse = require("csv-parse/lib/sync");
 
 export class StatisticsCollector {
-
-    private api?: ApiPromise;
-    private blocksEventsCache: Map<number, CacheEvent[]>;
-    private statistics: Statistics;
-
-    constructor() {
-        this.blocksEventsCache = new Map<number, CacheEvent[]>();
-        this.statistics = new Statistics();
-    }
-
-    async getStatistics(startBlock: number, endBlock: number): Promise<Statistics> {
-        this.api = await StatisticsCollector.connectApi();
-
-        let startHash = (await this.api.rpc.chain.getBlockHash(startBlock)) as Hash;
-        let endHash = (await this.api.rpc.chain.getBlockHash(endBlock)) as Hash;
-
-        this.statistics.startBlock = startBlock;
-        this.statistics.endBlock = endBlock;
-        this.statistics.newBlocks = endBlock - startBlock;
-        this.statistics.percNewBlocks = StatisticsCollector.convertToPercentage(startBlock, endBlock);
-        await this.buildBlocksEventCache(startBlock, endBlock);
-        await this.fillBasicInfo(startHash, endHash);
-        await this.fillTokenGenerationInfo(startBlock, endBlock, startHash, endHash);
-        await this.fillMintsInfo(startHash, endHash);
-        await this.fillCouncilInfo(startHash, endHash);
-        await this.fillCouncilElectionInfo(startBlock);
-        await this.fillValidatorInfo(startHash, endHash);
-        await this.fillStorageProviderInfo(startBlock, endBlock, startHash, endHash);
-        await this.fillCuratorInfo(startHash, endHash);
-        await this.fillOperationsInfo(startBlock, endBlock, startHash, endHash);
-        await this.fillMembershipInfo(startHash, endHash);
-        await this.fillMediaUploadInfo(startHash, endHash);
-        await this.fillForumInfo(startHash, endHash);
-
-        await this.api.disconnect();
-        return this.statistics;
-    }
-
-    async getApprovedBounties() {
-        try {
-            await fs.access(SPENDING_PROPOSALS_CATEGORIES_FILE, constants.R_OK);
-        } catch {
-            console.warn('File with the spending proposal categories not found');
-            return [];
-        }
-
-        const fileContent = await fs.readFile(SPENDING_PROPOSALS_CATEGORIES_FILE);
-        let rawBounties = parse(fileContent);
-        rawBounties.shift();
-        rawBounties = rawBounties.filter((line: string[]) => line[8] == 'Bounties');
-
-        let bounties = rawBounties.map((rawBounty: any) => {
-            return new Bounty(rawBounty[0], rawBounty[1], rawBounty[2], rawBounty[3], rawBounty[4], rawBounty[5]);
-        });
-
-        return bounties.filter((bounty: Bounty) => bounty.status == "Approved" && bounty.testnet == "Antioch");
-    }
-
-
-    async fillValidatorsRewards() {
-        for (let [key, blockEvents] of this.blocksEventsCache) {
-            let validatorRewards = blockEvents.filter((event) => {
-                return event.section == "staking" && event.method == "Reward";
-            });
-            for (let validatorReward of validatorRewards) {
-                this.statistics.newValidatorRewards += Number(validatorReward.data[1]);
-            }
-        }
-    }
-
-    async computeTokensBurn(){
-        let tokensBurned = 0;
-        for (let [, blockEvents] of this.blocksEventsCache) {
-            let transfers = blockEvents.filter((event) => {
-                return event.section == "balances" && event.method == "Transfer";
-            });
-            for (let transfer of transfers) {
-                let receiver = transfer.data[1] as AccountId;
-                let amount = transfer.data[2] as Balance;
-                if (receiver.toString() == BURN_ADDRESS) {
-                    tokensBurned += Number(amount);
-                }
-            }
-        }
-        return tokensBurned;
+  private api?: ApiPromise;
+  private blocksEventsCache: Map<number, CacheEvent[]>;
+  private statistics: Statistics;
+
+  constructor() {
+    this.blocksEventsCache = new Map<number, CacheEvent[]>();
+    this.statistics = new Statistics();
+  }
+
+  saveStats(data: any) {
+    Object.keys(data).map((key: string) => (this.statistics[key] = data[key]));
+  }
+
+  filterCache(
+    filterEvent: (event: CacheEvent) => boolean
+  ): [number, CacheEvent[]][] {
+    const blocks: [number, CacheEvent[]][] = [];
+    for (let block of this.blocksEventsCache) {
+      const [key, events] = block;
+      const filtered = events.filter((event) => filterEvent(event));
+      if (filtered.length) blocks.push([key, filtered]);
     }
-
-    async getFinalizedSpendingProposals(endHash: Hash): Promise<Array<SpendingProposals>> {
-        let spendingProposals = new Array<SpendingProposals>();
-        for (let [key, blockEvents] of this.blocksEventsCache) {
-            let proposalEvents = blockEvents.filter((event) => {
-                return event.section == "proposalsEngine" && event.method == "ProposalStatusUpdated";
-            });
-
-            for (let proposalEvent of proposalEvents) {
-                let statusUpdateData = proposalEvent.data[1] as any;
-                if (!(statusUpdateData.finalized && statusUpdateData.finalized.finalizedAt)) {
-                    continue;
-                }
-
-                let proposalId = proposalEvent.data[0] as ProposalId;
-                let proposalInfo = await this.api.query.proposalsEngine.proposals.at(endHash, proposalId) as ProposalOf;
-                const finalizedData = proposalInfo.status.asFinalized;
-
-                let proposalDetail = await this.api.query.proposalsCodex.proposalDetailsByProposalId.at(endHash, proposalId) as ProposalDetails;
-                if (!finalizedData.proposalStatus.isApproved || !proposalDetail.isSpending) {
-                    continue;
-                }
-
-                let approvedData = finalizedData.proposalStatus.asApproved;
-                if (!approvedData.isExecuted) {
-                    continue;
-                }
-
-                let spendingParams = proposalDetail.asSpending;
-                if (!spendingProposals.some(spendingProposal => (spendingProposal.id == Number(proposalId)))){
-                    spendingProposals.push(new SpendingProposals(Number(proposalId), proposalInfo.title.toString(), Number(spendingParams[0])));
-                }
-            }
-        }
-        return spendingProposals;
+    return blocks;
+  }
+
+  async getStats(
+    startBlock: number,
+    endBlock: number,
+    config: Config
+  ): Promise<Statistics> {
+    const { cacheDir, providerUrl, statusUrl } = config;
+    this.api = await connectApi(providerUrl);
+
+    const aboveHead = endBlock - Number(await getHead(this.api));
+    if (aboveHead > 0) {
+      console.log(`End Block is above our Head, wait ${aboveHead} blocks.`);
+      return this.statistics;
     }
 
-    async fillBasicInfo(startHash: Hash, endHash: Hash) {
-        let startDate = (await this.api.query.timestamp.now.at(startHash)) as Moment;
-        let endDate = (await this.api.query.timestamp.now.at(endHash)) as Moment;
-        this.statistics.dateStart = new Date(startDate.toNumber()).toLocaleDateString("en-US");
-        this.statistics.dateEnd = new Date(endDate.toNumber()).toLocaleDateString("en-US");
+    let startHash: Hash = await getBlockHash(this.api, startBlock);
+    let endHash: Hash = await getBlockHash(this.api, endBlock);
+
+    let dateStart = momentToString(await getTimestamp(this.api, startHash));
+    let dateEnd = momentToString(await getTimestamp(this.api, endHash));
+    this.saveStats({
+      dateStart,
+      dateEnd,
+      startBlock,
+      endBlock,
+      newBlocks: endBlock - startBlock,
+      percNewBlocks: getPercent(startBlock, endBlock),
+    });
+
+    // run long running tasks in parallel first
+    await Promise.all([
+      this.buildBlocksEventCache(startBlock, endBlock, cacheDir).then(() =>
+        this.fillStats(startBlock, endBlock, startHash, endHash, config)
+      ),
+      this.getFiatEvents(startBlock, endBlock, statusUrl),
+      this.fillMediaUploadInfo(startHash, endHash),
+    ]);
+    this.api.disconnect();
+    return this.statistics;
+  }
+
+  fillStats(
+    startBlock: number,
+    endBlock: number,
+    startHash: Hash,
+    endHash: Hash,
+    config: Config
+  ): Promise<void[]> {
+    eventStats(this.blocksEventsCache); // print event stats
+    return Promise.all([
+      this.fillTokenInfo(startBlock, endBlock, startHash, endHash, config),
+      this.fillMintsInfo(startHash, endHash),
+      this.fillCouncilInfo(startHash, endHash, config.councilRoundOffset),
+      this.fillCouncilElectionInfo(startBlock),
+      this.fillValidatorInfo(startHash, endHash),
+      this.fillStorageProviderInfo(startBlock, endBlock, startHash, endHash),
+      this.fillCuratorInfo(startHash, endHash),
+      this.fillOperationsInfo(startBlock, endBlock, startHash, endHash),
+      this.fillMembershipInfo(startHash, endHash),
+      this.fillForumInfo(startHash, endHash),
+    ]);
+  }
+
+  async getApprovedBounties(file: string): Promise<Bounty[]> {
+    try {
+      await fs.access(file, constants.R_OK);
+    } catch {
+      console.warn("File with spending proposal categories not found: ${file}");
     }
-
-    async fillTokenGenerationInfo(startBlock: number, endBlock: number, startHash: Hash, endHash: Hash) {
-        this.statistics.startIssuance = (await this.api.query.balances.totalIssuance.at(startHash) as Balance).toNumber();
-        this.statistics.endIssuance = (await this.api.query.balances.totalIssuance.at(endHash) as Balance).toNumber();
-        this.statistics.newIssuance = this.statistics.endIssuance - this.statistics.startIssuance;
-        this.statistics.percNewIssuance = StatisticsCollector.convertToPercentage(this.statistics.startIssuance, this.statistics.endIssuance);
-        this.statistics.newTokensBurn = await this.computeTokensBurn();
-
-        let bounties = await this.getApprovedBounties();
-        let spendingProposals = await this.getFinalizedSpendingProposals(endHash);
-
-        this.statistics.bountiesTotalPaid = 0;
-        if (bounties) {
-            for (let bounty of bounties) {
-                let bountySpendingProposal = spendingProposals.find((spendingProposal) => spendingProposal.id == bounty.proposalId);
-                if (bountySpendingProposal) {
-                    this.statistics.bountiesTotalPaid += bountySpendingProposal.spentAmount;
-                }
-            }
-        }
-
-        if (!this.statistics.bountiesTotalPaid) {
-            console.warn('No bounties found in ' + SPENDING_PROPOSALS_CATEGORIES_FILE +', trying to find spending proposals of bounties, please check the values!...');
-            for (const spendingProposal of spendingProposals) {
-                if (spendingProposal.title.toLowerCase().includes("bounty")) {
-                    this.statistics.bountiesTotalPaid += spendingProposal.spentAmount;
-                }
-            }
-        }
-
-        this.statistics.spendingProposalsTotal = spendingProposals.reduce((n, spendingProposal) => n + spendingProposal.spentAmount, 0);
-
-        let roundNrBlocks = endBlock - startBlock;
-        this.statistics.newCouncilRewards = await this.computeCouncilReward(roundNrBlocks, endHash);
-        this.statistics.newCouncilRewards = Number(this.statistics.newCouncilRewards.toFixed(2));
-
-        this.statistics.newCuratorRewards = await this.computeCuratorsReward(roundNrBlocks, startHash, endHash);
-        this.statistics.newCuratorRewards = Number(this.statistics.newCuratorRewards.toFixed(2));
+    const fileContent = await fs.readFile(file);
+    const proposals = parse(fileContent).slice(1);
+    console.log(`Loaded ${proposals.length} proposals.`);
+    return proposals
+      .filter(
+        (line: string[]) =>
+          line[0] === "Antioch" &&
+          line[3] === "Approved" &&
+          line[8] === "Bounties"
+      )
+      .map((bounty: string[]) => {
+        return new Bounty(
+          bounty[0],
+          Number(bounty[1]),
+          bounty[2],
+          bounty[3],
+          Number(bounty[4]),
+          Number(bounty[5])
+        );
+      });
+  }
+
+  fillSudoSetBalance() {
+    let balancesSetByRoot = 0;
+    this.filterCache(filterMethods.sudoSetBalance).map(([block, events]) =>
+      events.forEach(({ data }) => {
+        balancesSetByRoot += Number(data[1]);
+      })
+    );
+    this.saveStats({ balancesSetByRoot });
+  }
+
+  async fillTokenInfo(
+    startBlock: number,
+    endBlock: number,
+    startHash: Hash,
+    endHash: Hash,
+    config: Config
+  ): Promise<void> {
+    const { burnAddress } = config;
+    const proposalsFile = config.repoDir + config.spendingCategoriesFile;
+    const startIssuance = (await getIssuance(this.api, startHash)).toNumber();
+    const endIssuance = (await getIssuance(this.api, endHash)).toNumber();
+    const burnEvents = this.filterCache(filterMethods.getBurnedTokens);
+    this.saveStats({
+      startIssuance,
+      endIssuance,
+      newIssuance: endIssuance - startIssuance,
+      percNewIssuance: getPercent(startIssuance, endIssuance),
+      newTokensBurn: await getBurnedTokens(burnAddress, burnEvents),
+    });
+    this.fillSudoSetBalance();
+
+    // bounties
+    const bounties = await this.getApprovedBounties(proposalsFile);
+    const blocks = this.filterCache(filterMethods.finalizedSpendingProposals);
+    const spendingProposals: SpendingProposal[] =
+      await getFinalizedSpendingProposals(this.api, blocks);
+
+    let bountiesTotalPaid = 0;
+    for (let bounty of bounties) {
+      const bountySpendingProposal = spendingProposals.find(
+        (spendingProposal) => spendingProposal.id == bounty.proposalId
+      );
+      if (bountySpendingProposal)
+        bountiesTotalPaid += bountySpendingProposal.amount;
     }
 
-    async computeCouncilReward(roundNrBlocks: number, endHash: Hash): Promise<number> {
-        const payoutInterval = Number((await this.api.query.council.payoutInterval.at(endHash) as Option<BlockNumber>).unwrapOr(0));
-        const amountPerPayout = (await this.api.query.council.amountPerPayout.at(endHash) as BalanceOf).toNumber();
-
-        const announcing_period = (await this.api.query.councilElection.announcingPeriod.at(endHash)) as BlockNumber;
-        const voting_period = (await this.api.query.councilElection.votingPeriod.at(endHash)) as BlockNumber;
-        const revealing_period = (await this.api.query.councilElection.revealingPeriod.at(endHash)) as BlockNumber;
-        const new_term_duration = (await this.api.query.councilElection.newTermDuration.at(endHash)) as BlockNumber;
-
-        const termDuration = new_term_duration.toNumber();
-        const votingPeriod = voting_period.toNumber();
-        const revealingPeriod = revealing_period.toNumber();
-        const announcingPeriod = announcing_period.toNumber();
-
-        const nrCouncilMembers = (await this.api.query.council.activeCouncil.at(endHash) as Seats).length
-        const totalCouncilRewardsPerBlock = (amountPerPayout && payoutInterval)
-            ? (amountPerPayout * nrCouncilMembers) / payoutInterval
-            : 0;
-
-        const councilTermDurationRatio = termDuration / (termDuration + votingPeriod + revealingPeriod + announcingPeriod);
-        const avgCouncilRewardPerBlock = councilTermDurationRatio * totalCouncilRewardsPerBlock;
-
-        return avgCouncilRewardPerBlock * roundNrBlocks;
+    if (!bountiesTotalPaid) {
+      console.warn(
+        `No bounties in selected period. Need to update ${proposalsFile}?\nLooking for spending proposals titled "bounty":`
+      );
+      for (const { title, amount } of spendingProposals) {
+        if (!title.toLowerCase().includes("bounty")) continue;
+        bountiesTotalPaid += amount;
+        console.log(` - ${title}: ${amount}`);
+      }
     }
-
-    async computeWorkingGroupReward(roundNrBlocks: number, startHash: Hash, endHash: Hash, workingGroup: string): Promise<WorkersInfo> {
-        let nextWorkerId = (await this.api.query[workingGroup + 'WorkingGroup'].nextWorkerId.at(startHash) as WorkerId).toNumber();
-        let info = new WorkersInfo();
-        for (let i = 0; i < nextWorkerId; ++i) {
-            let worker = await this.api.query[workingGroup + 'WorkingGroup'].workerById.at(endHash, i) as WorkerOf;
-
-            if (!worker.is_active) {
-                continue;
-            }
-
-            if (worker.role_stake_profile.isSome) {
-                let roleStakeProfile = worker.role_stake_profile.unwrap();
-                let stake = await this.api.query.stake.stakes.at(endHash, roleStakeProfile.stake_id) as Stake;
-                info.startStake += stake.value.toNumber();
-            }
-        }
-
-        nextWorkerId = (await this.api.query[workingGroup + 'WorkingGroup'].nextWorkerId.at(endHash) as WorkerId).toNumber();
-        let rewardRelationshipIds = Array<RewardRelationshipId>();
-
-        for (let i = 0; i < nextWorkerId; ++i) {
-            let worker = await this.api.query[workingGroup + 'WorkingGroup'].workerById.at(endHash, i) as WorkerOf;
-
-            if (!worker.is_active) {
-                continue;
-            }
-
-            if (worker.reward_relationship.isSome) {
-                rewardRelationshipIds.push(worker.reward_relationship.unwrap());
-            }
-            if (worker.role_stake_profile.isSome) {
-                let roleStakeProfile = worker.role_stake_profile.unwrap();
-                let stake = await this.api.query.stake.stakes.at(endHash, roleStakeProfile.stake_id) as Stake;
-                info.endStake += stake.value.toNumber();
-            }
-        }
-        info.rewards = await this.computeReward(roundNrBlocks, rewardRelationshipIds, endHash);
-        info.endNrOfWorkers = nextWorkerId;
-        return info;
+    this.saveStats({ bountiesTotalPaid });
+
+    const spendingProposalsTotal = spendingProposals.reduce(
+      (n, p) => n + p.amount,
+      0
+    );
+    const newCouncilRewards = await this.computeCouncilReward(
+      endBlock - startBlock,
+      endHash
+    );
+    const newCuratorInfo = await this.computeWorkingGroupReward(
+      startHash,
+      endHash,
+      "contentDirectory"
+    );
+
+    this.saveStats({
+      spendingProposalsTotal,
+      newCouncilRewards: newCouncilRewards.toFixed(2),
+      newCuratorRewards: newCuratorInfo.rewards.toFixed(2),
+    });
+  }
+
+  async getMintInfo(
+    api: ApiPromise,
+    mintId: MintId,
+    startHash: Hash,
+    endHash: Hash
+  ): Promise<MintStatistics> {
+    const startMint: Mint = await getMint(api, startHash, mintId);
+    const endMint: Mint = await getMint(api, endHash, mintId);
+    let stats = new MintStatistics();
+    stats.startMinted = getTotalMinted(startMint);
+    stats.endMinted = getTotalMinted(endMint);
+    stats.diffMinted = stats.endMinted - stats.startMinted;
+    stats.percMinted = getPercent(stats.startMinted, stats.endMinted);
+    return stats;
+  }
+
+  async computeCouncilReward(
+    roundNrBlocks: number,
+    endHash: Hash
+  ): Promise<number> {
+    const payoutInterval = Number(
+      (
+        (await getCouncilPayoutInterval(
+          this.api,
+          endHash
+        )) as Option<BlockNumber>
+      ).unwrapOr(0)
+    );
+    const amountPerPayout = (
+      (await getCouncilPayout(this.api, endHash)) as BalanceOf
+    ).toNumber();
+
+    const [
+      announcingPeriod,
+      votingPeriod,
+      revealingPeriod,
+      termDuration,
+    ]: number[] = await getCouncilElectionDurations(this.api, endHash);
+
+    const nrCouncilMembers = ((await getCouncil(this.api, endHash)) as Seats)
+      .length;
+    const totalCouncilRewardsPerBlock =
+      amountPerPayout && payoutInterval
+        ? (amountPerPayout * nrCouncilMembers) / payoutInterval
+        : 0;
+
+    const councilTermDurationRatio =
+      termDuration /
+      (termDuration + votingPeriod + revealingPeriod + announcingPeriod);
+    const avgCouncilRewardPerBlock =
+      councilTermDurationRatio * totalCouncilRewardsPerBlock;
+
+    return avgCouncilRewardPerBlock * roundNrBlocks;
+  }
+
+  // Summarize stakes and rewards at start and end
+  async computeWorkingGroupReward(
+    startHash: Hash,
+    endHash: Hash,
+    workingGroup: string
+  ): Promise<WorkersInfo> {
+    const group = workingGroup + "WorkingGroup";
+    let info = new WorkersInfo();
+
+    // stakes at start
+    const workersStart: WorkerReward[] = await getWorkerRewards(
+      this.api,
+      group,
+      startHash
+    );
+    workersStart.forEach(({ stake }) => {
+      if (stake) info.startStake += stake.value.toNumber();
+    });
+
+    // stakes at end
+    const workersEnd: WorkerReward[] = await getWorkerRewards(
+      this.api,
+      group,
+      endHash
+    );
+    let workers = ``;
+    workersEnd.forEach(async (worker) => {
+      if (worker.stake) info.endStake += worker.stake.value.toNumber();
+      if (!worker.reward) return;
+      let earnedBefore = 0;
+      const hired = workersStart.find((w) => w.id === worker.id);
+      if (hired) earnedBefore = hired.reward.total_reward_received.toNumber();
+      workers += getWorkerRow(worker, earnedBefore);
+    });
+    const groupTag =
+      workingGroup === `storage`
+        ? `storageProviders`
+        : workingGroup === `contentDirectory`
+        ? `curators`
+        : workingGroup === `operations`
+        ? `operations`
+        : ``;
+    if (workers.length) {
+      const header = `| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |\n|--|--|--|--|--|--|\n`;
+      this.saveStats({ [groupTag]: header + workers });
+    } else this.saveStats({ [groupTag]: `` });
+
+    const mintId = await getGroupMint(this.api, group);
+    const mintStart: Mint = await getMint(this.api, startHash, mintId);
+    const mintEnd: Mint = await getMint(this.api, endHash, mintId);
+    const totalMinted = (m: Mint) => Number(m.total_minted);
+    info.rewards = totalMinted(mintEnd) - totalMinted(mintStart);
+    info.endNrOfWorkers = workersEnd.length;
+    return info;
+  }
+
+  async computeGroupMintStats(
+    [label, tag]: string[],
+    startHash: Hash,
+    endHash: Hash
+  ) {
+    const group = label + "WorkingGroup";
+    const mint = await getGroupMint(this.api, group);
+    const info = await this.getMintInfo(this.api, mint, startHash, endHash);
+    let stats: { [key: string]: number } = {};
+    stats[`start${tag}Minted`] = info.startMinted;
+    stats[`end${tag}Minted`] = info.endMinted;
+    stats[`new${tag}Minted`] = info.diffMinted;
+    stats[`perc${tag}Minted`] = info.percMinted;
+    this.saveStats(stats);
+  }
+
+  async fillMintsInfo(startHash: Hash, endHash: Hash): Promise<void> {
+    const startNrMints = await getMintsCreated(this.api, startHash);
+    const endNrMints = await getMintsCreated(this.api, endHash);
+    const newMints = endNrMints - startNrMints;
+
+    // calcuate sum of all mints
+    let totalMinted = 0;
+    let totalMintCapacityIncrease = 0;
+    // summarize old mints
+    for (let i = 0; i < startNrMints; ++i) {
+      const startMint: Mint = await getMint(this.api, startHash, i);
+      const endMint: Mint = await getMint(this.api, endHash, i);
+      const startMintTotal = getTotalMinted(startMint);
+      const endMintTotal = getTotalMinted(endMint);
+      totalMinted += endMintTotal - startMintTotal;
+      totalMintCapacityIncrease +=
+        parseInt(endMint.getField("capacity").toString()) -
+        parseInt(startMint.getField("capacity").toString());
     }
 
-    async computeCuratorsReward(roundNrBlocks: number, startHash: Hash, endHash: Hash) {
-        let nextCuratorId = (await this.api.query.contentDirectoryWorkingGroup.nextWorkerId.at(endHash) as WorkerId).toNumber();
-
-        let rewardRelationshipIds = Array<RewardRelationshipId>();
-        for (let i = 0; i < nextCuratorId; ++i) {
-            let worker = await this.api.query.contentDirectoryWorkingGroup.workerById.at(endHash, i) as WorkerOf;
-            if (!worker.is_active) {
-                continue;
-            }
-
-            if (worker.reward_relationship.isSome) {
-                rewardRelationshipIds.push(worker.reward_relationship.unwrap());
-            }
-        }
-        return this.computeReward(roundNrBlocks, rewardRelationshipIds, endHash);
-    }
-
-    async computeReward(roundNrBlocks: number, rewardRelationshipIds: RewardRelationshipId[], hash: Hash) {
-        let recurringRewards = await Promise.all(rewardRelationshipIds.map(async (rewardRelationshipId) => {
-            return await this.api.query.recurringRewards.rewardRelationships.at(hash, rewardRelationshipId) as RewardRelationship;
-        }));
-
-        let rewardPerBlock = 0;
-        for (let recurringReward of recurringRewards) {
-            const amount = recurringReward.amount_per_payout.toNumber();
-            const payoutInterval = recurringReward.payout_interval.unwrapOr(null);
-
-            if (amount && payoutInterval) {
-                rewardPerBlock += amount / payoutInterval;
-            }
-
-        }
-        return rewardPerBlock * roundNrBlocks;
+    // summarize new mints
+    for (let i = startNrMints; i < endNrMints; ++i) {
+      const endMint: Mint = await getMint(this.api, endHash, i);
+      if (endMint) totalMinted += getTotalMinted(endMint);
     }
-
-    async fillMintsInfo(startHash: Hash, endHash: Hash) {
-        let startNrMints = parseInt((await this.api.query.minting.mintsCreated.at(startHash)).toString());
-        let endNrMints = parseInt((await this.api.query.minting.mintsCreated.at(endHash)).toString());
-
-        this.statistics.newMints = endNrMints - startNrMints;
-        // statistics.startMinted = 0;
-        // statistics.endMinted = 0;
-        for (let i = 0; i < startNrMints; ++i) {
-            let startMint = (await this.api.query.minting.mints.at(startHash, i)) as Mint;
-            // if (!startMint) {
-            //     continue;
-            // }
-
-            let endMint = (await this.api.query.minting.mints.at(endHash, i)) as Mint;
-            // let  = endMintResult[0];
-            // if (!endMint) {
-            //     continue;
-            // }
-
-            let startMintTotal = parseInt(startMint.getField("total_minted").toString());
-            let endMintTotal = parseInt(endMint.getField("total_minted").toString());
-
-            // statistics.startMinted += startMintTotal;
-
-            this.statistics.totalMinted += endMintTotal - startMintTotal;
-            this.statistics.totalMintCapacityIncrease += parseInt(endMint.getField("capacity").toString()) - parseInt(startMint.getField("capacity").toString());
-        }
-
-        for (let i = startNrMints; i < endNrMints; ++i) {
-            let endMint = await this.api.query.minting.mints.at(endHash, i) as Mint;
-            if (!endMint) {
-                return;
-            }
-            this.statistics.totalMinted = parseInt(endMint.getField("total_minted").toString());
+    this.saveStats({ newMints, totalMinted, totalMintCapacityIncrease });
+
+    // council
+    const councilInfo = await this.getMintInfo(
+      this.api,
+      await getCouncilMint(this.api, endHash),
+      startHash,
+      endHash
+    );
+    this.saveStats({
+      startCouncilMinted: councilInfo.startMinted,
+      endCouncilMinted: councilInfo.endMinted,
+      newCouncilMinted: councilInfo.diffMinted,
+      percNewCouncilMinted: councilInfo.percMinted,
+    });
+    // working groups
+    const groups = [
+      ["contentDirectory", "Curator"],
+      ["storage", "Storage"],
+      ["operations", "Operations"],
+    ].forEach((group) => this.computeGroupMintStats(group, startHash, endHash));
+  }
+
+  async fillCouncilInfo(
+    startHash: Hash,
+    endHash: Hash,
+    councilRoundOffset: number
+  ): Promise<void> {
+    const round = await getCouncilRound(this.api, startHash);
+    const startNrProposals = await getProposalCount(this.api, startHash);
+    const endNrProposals = await getProposalCount(this.api, endHash);
+
+    let approvedProposals = new Set();
+    for (let [key, blockEvents] of this.blocksEventsCache) {
+      for (let event of blockEvents) {
+        if (
+          event.section == "proposalsEngine" &&
+          event.method == "ProposalStatusUpdated"
+        ) {
+          let statusUpdateData = event.data[1] as any;
+          let finalizeData = statusUpdateData.finalized as any;
+          if (finalizeData && finalizeData.proposalStatus.approved) {
+            approvedProposals.add(Number(event.data[0]));
+          }
         }
-
-        let councilMint = (await this.api.query.council.councilMint.at(endHash)) as MintId;
-        let councilMintStatistics = await this.computeMintInfo(councilMint, startHash, endHash);
-
-        this.statistics.startCouncilMinted = councilMintStatistics.startMinted;
-        this.statistics.endCouncilMinted = councilMintStatistics.endMinted;
-        this.statistics.newCouncilMinted = councilMintStatistics.diffMinted;
-        this.statistics.percNewCouncilMinted = councilMintStatistics.percMinted;
-
-        let curatorMint = (await this.api.query.contentDirectoryWorkingGroup.mint.at(endHash)) as MintId;
-        let curatorMintStatistics = await this.computeMintInfo(curatorMint, startHash, endHash);
-        this.statistics.startCuratorMinted = curatorMintStatistics.startMinted;
-        this.statistics.endCuratorMinted = curatorMintStatistics.endMinted;
-        this.statistics.newCuratorMinted = curatorMintStatistics.diffMinted;
-        this.statistics.percCuratorMinted = curatorMintStatistics.percMinted;
-
-        let storageProviderMint = (await this.api.query.storageWorkingGroup.mint.at(endHash)) as MintId;
-        let storageProviderMintStatistics = await this.computeMintInfo(storageProviderMint, startHash, endHash);
-        this.statistics.startStorageMinted = storageProviderMintStatistics.startMinted;
-        this.statistics.endStorageMinted = storageProviderMintStatistics.endMinted;
-        this.statistics.newStorageMinted = storageProviderMintStatistics.diffMinted;
-        this.statistics.percStorageMinted = storageProviderMintStatistics.percMinted;
-
-        let operationsProviderMint = (await this.api.query.operationsWorkingGroup.mint.at(endHash)) as MintId;
-        let operationsProviderMintStatistics = await this.computeMintInfo(operationsProviderMint, startHash, endHash);
-        this.statistics.startOperationsMinted = operationsProviderMintStatistics.startMinted;
-        this.statistics.endOperationsMinted = operationsProviderMintStatistics.endMinted;
-        this.statistics.newOperationsMinted = operationsProviderMintStatistics.diffMinted;
-        this.statistics.percOperationsMinted = operationsProviderMintStatistics.percMinted;
-    }
-
-
-    async computeMintInfo(mintId: MintId, startHash: Hash, endHash: Hash): Promise<MintStatistics> {
-        // if (mintId.toString() == "0") {
-        //     return new MintStatistics(0, 0, 0);
-        // }
-        let startMint = await this.api.query.minting.mints.at(startHash, mintId) as Mint;
-        // let startMint = startMintResult[0] as unknown as Mint;
-        // if (!startMint) {
-        //     return new MintStatistics(0, 0, 0);
-        // }
-
-        let endMint = await this.api.query.minting.mints.at(endHash, mintId) as Mint;
-        // let endMint = endMintResult[0] as unknown as Mint;
-        // if (!endMint) {
-        //     return new MintStatistics(0, 0, 0);
-        // }
-
-        let mintStatistics = new MintStatistics();
-        mintStatistics.startMinted = parseInt(startMint.getField('total_minted').toString());
-        mintStatistics.endMinted = parseInt(endMint.getField('total_minted').toString());
-        mintStatistics.diffMinted = mintStatistics.endMinted - mintStatistics.startMinted;
-        mintStatistics.percMinted = StatisticsCollector.convertToPercentage(mintStatistics.startMinted, mintStatistics.endMinted);
-        return mintStatistics;
+      }
     }
 
-    async fillCouncilInfo(startHash: Hash, endHash: Hash) {
-        this.statistics.councilRound = (await this.api.query.councilElection.round.at(startHash) as u32).toNumber() - COUNCIL_ROUND_OFFSET;
-        this.statistics.councilMembers = (await this.api.query.councilElection.councilSize.at(startHash) as u32).toNumber();
-        let startNrProposals = await this.api.query.proposalsEngine.proposalCount.at(startHash) as u32;
-        let endNrProposals = await this.api.query.proposalsEngine.proposalCount.at(endHash) as u32;
-        this.statistics.newProposals = endNrProposals.toNumber() - startNrProposals.toNumber();
-
-        let approvedProposals = new Set();
-        for (let [key, blockEvents] of this.blocksEventsCache) {
-            for (let event of blockEvents) {
-                if (event.section == "proposalsEngine" && event.method == "ProposalStatusUpdated") {
-                    let statusUpdateData = event.data[1] as any;
-                    let finalizeData = statusUpdateData.finalized as any
-                    if (finalizeData && finalizeData.proposalStatus.approved) {
-                        approvedProposals.add(Number(event.data[0]));
-                    }
-
-                }
-            }
-        }
-
-        this.statistics.newApprovedProposals = approvedProposals.size;
+    this.saveStats({
+      councilRound: round - councilRoundOffset,
+      councilMembers: await getCouncilSize(this.api, startHash),
+      newProposals: endNrProposals - startNrProposals,
+      newApprovedProposals: approvedProposals.size,
+    });
+  }
+
+  async fillCouncilElectionInfo(startBlock: number): Promise<void> {
+    let startBlockHash = await getBlockHash(this.api, startBlock);
+    let events: Vec<EventRecord> = await getEvents(this.api, startBlockHash);
+    let isStartBlockFirstCouncilBlock = events.some(
+      ({ event }) =>
+        event.section == "councilElection" && event.method == "CouncilElected"
+    );
+
+    if (!isStartBlockFirstCouncilBlock)
+      return console.warn(
+        "Note: The given start block is not the first block of the council round so council election information will be empty"
+      );
+
+    let lastBlockHash = await getBlockHash(this.api, startBlock - 1);
+    let applicants: Vec<AccountId> = await getCouncilApplicants(
+      this.api,
+      lastBlockHash
+    );
+    let electionApplicantsStakes = 0;
+    for (let applicant of applicants) {
+      const applicantStakes: ElectionStake = await getCouncilApplicantStakes(
+        this.api,
+        lastBlockHash,
+        applicant
+      );
+      electionApplicantsStakes += applicantStakes.new.toNumber();
     }
-
-    async fillCouncilElectionInfo(startBlock: number) {
-
-        let startBlockHash = await this.api.rpc.chain.getBlockHash(startBlock);
-        let events = await this.api.query.system.events.at(startBlockHash) as Vec<EventRecord>;
-        let isStartBlockFirstCouncilBlock = events.some((event) => {
-            return event.event.section == "councilElection" && event.event.method == "CouncilElected";
+    // let seats = await getCouncil(this.api,startBlockHash) as Seats;
+    //TODO: Find a more accurate way of getting the votes
+    const votes: Vec<Hash> = await getCouncilCommitments(
+      this.api,
+      lastBlockHash
+    );
+
+    this.saveStats({
+      electionApplicants: applicants.length,
+      electionApplicantsStakes,
+      electionVotes: votes.length,
+    });
+  }
+
+  async fillValidatorInfo(startHash: Hash, endHash: Hash): Promise<void> {
+    const startTimestamp: number = await getTimestamp(this.api, startHash);
+    const endTimestamp: number = await getTimestamp(this.api, endHash);
+    const blocks = this.statistics.newBlocks;
+    const avgBlockProduction = (endTimestamp - startTimestamp) / 1000 / blocks;
+    const maxStartValidators = await getValidatorCount(this.api, startHash);
+    const startValidators = await getActiveValidators(this.api, startHash);
+    const maxEndValidators = await getValidatorCount(this.api, endHash);
+    const endValidators = await getActiveValidators(this.api, endHash, true);
+    const startEra: number = await getEra(this.api, startHash);
+    const endEra: number = await getEra(this.api, endHash);
+
+    const startStake = await getEraStake(this.api, startHash, startEra);
+    const endStake = await getEraStake(this.api, endHash, endEra);
+
+    this.saveStats({
+      avgBlockProduction: Number(avgBlockProduction.toFixed(2)),
+      startValidators: startValidators.length + " / " + maxStartValidators,
+      endValidators: endValidators.length + " / " + maxEndValidators,
+      percValidators: getPercent(startValidators.length, endValidators.length),
+      startValidatorsStake: startStake,
+      endValidatorsStake: endStake,
+      percNewValidatorsStake: getPercent(startStake, endStake),
+      newValidatorRewards: await getValidatorsRewards(
+        this.filterCache(filterMethods.newValidatorsRewards)
+      ),
+    });
+  }
+
+  async fillStorageProviderInfo(
+    startBlock: number,
+    endBlock: number,
+    startHash: Hash,
+    endHash: Hash
+  ): Promise<void> {
+    let storageProvidersRewards = await this.computeWorkingGroupReward(
+      startHash,
+      endHash,
+      "storage"
+    );
+    const newStorageProviderReward = Number(
+      storageProvidersRewards.rewards.toFixed(2)
+    );
+    const startStorageProvidersStake = storageProvidersRewards.startStake;
+    const endStorageProvidersStake = storageProvidersRewards.endStake;
+
+    const group = "storageWorkingGroup";
+    const startStorageProviders = await getWorkers(this.api, group, startHash);
+    const endStorageProviders = await getWorkers(this.api, group, endHash);
+
+    this.saveStats({
+      newStorageProviderReward,
+      startStorageProvidersStake,
+      endStorageProvidersStake,
+      percNewStorageProviderStake: getPercent(
+        startStorageProvidersStake,
+        endStorageProvidersStake
+      ),
+      startStorageProviders,
+      endStorageProviders,
+      percNewStorageProviders: getPercent(
+        startStorageProviders,
+        endStorageProviders
+      ),
+    });
+  }
+
+  async fillCuratorInfo(startHash: Hash, endHash: Hash): Promise<void> {
+    const group = "contentDirectoryWorkingGroup";
+    const startCurators = await getWorkers(this.api, group, startHash);
+    const endCurators = await getWorkers(this.api, group, endHash);
+
+    this.saveStats({
+      startCurators,
+      endCurators,
+      percNewCurators: getPercent(startCurators, endCurators),
+    });
+  }
+
+  async fillOperationsInfo(
+    startBlock: number,
+    endBlock: number,
+    startHash: Hash,
+    endHash: Hash
+  ): Promise<void> {
+    const operationsRewards = await this.computeWorkingGroupReward(
+      startHash,
+      endHash,
+      "operations"
+    );
+    const newOperationsReward = operationsRewards.rewards.toFixed(2);
+    const startOperationsStake = operationsRewards.startStake;
+    const endOperationsStake = operationsRewards.endStake;
+
+    const group = "operationsWorkingGroup";
+    const startWorkers = await getWorkers(this.api, group, startHash);
+    const endWorkers = await getWorkers(this.api, group, endHash);
+
+    this.saveStats({
+      newOperationsReward: Number(newOperationsReward),
+      startOperationsWorkers: startWorkers,
+      endOperationsWorkers: endWorkers,
+      percNewOperationsWorkers: getPercent(startWorkers, endWorkers),
+      startOperationsStake,
+      endOperationsStake,
+      percNewOperationstake: getPercent(
+        startOperationsStake,
+        endOperationsStake
+      ),
+    });
+  }
+
+  async fillMembershipInfo(startHash: Hash, endHash: Hash): Promise<void> {
+    const startMembers = await getNextMember(this.api, startHash);
+    const endMembers = await getNextMember(this.api, endHash);
+    this.saveStats({
+      startMembers,
+      endMembers,
+      newMembers: endMembers - startMembers,
+      percNewMembers: getPercent(startMembers, endMembers),
+    });
+  }
+
+  async fillMediaUploadInfo(startHash: Hash, endHash: Hash): Promise<void> {
+    console.log(`Collecting Media stats`);
+    const startMedia = Number(await getNextVideo(this.api, startHash));
+    const endMedia = Number(await getNextVideo(this.api, endHash));
+    const startChannels = Number(await getNextChannel(this.api, startHash));
+    const endChannels = Number(await getNextChannel(this.api, endHash));
+
+    // count size
+    let startUsedSpace = 0;
+    let endUsedSpace = 0;
+    const startBlock = await getBlock(this.api, startHash);
+    const endBlock = await getBlock(this.api, endHash);
+    getDataObjects(this.api).then((dataObjects: Map<ContentId, DataObject>) => {
+      for (let [key, dataObject] of dataObjects) {
+        const added = dataObject.added_at.block.toNumber();
+        const start = startBlock.block.header.number.toNumber();
+        const end = endBlock.block.header.number.toNumber();
+
+        if (added < start)
+          startUsedSpace += dataObject.size_in_bytes.toNumber() / 1024 / 1024;
+        if (added < end)
+          endUsedSpace += dataObject.size_in_bytes.toNumber() / 1024 / 1024;
+      }
+      if (!startUsedSpace || !endUsedSpace)
+        console.log(`space start, end`, startUsedSpace, endUsedSpace);
+      this.saveStats({
+        startMedia,
+        endMedia,
+        percNewMedia: getPercent(startMedia, endMedia),
+        startChannels,
+        endChannels,
+        percNewChannels: getPercent(startChannels, endChannels),
+        startUsedSpace: Number(startUsedSpace.toFixed(2)),
+        endUsedSpace: Number(endUsedSpace.toFixed(2)),
+        percNewUsedSpace: getPercent(startUsedSpace, endUsedSpace),
+      });
+    });
+  }
+
+  async fillForumInfo(startHash: Hash, endHash: Hash): Promise<void> {
+    const startPosts = await getNextPost(this.api, startHash);
+    const endPosts = await getNextPost(this.api, endHash);
+    const startThreads = await getNextThread(this.api, startHash);
+    const endThreads = await getNextThread(this.api, endHash);
+    const startCategories = await getNextCategory(this.api, startHash);
+    const endCategories = await getNextCategory(this.api, endHash);
+    this.saveStats({
+      startPosts,
+      endPosts,
+      newPosts: endPosts - startPosts,
+      percNewPosts: getPercent(startPosts, endPosts),
+      startThreads,
+      endThreads,
+      newThreads: endThreads - startThreads,
+      percNewThreads: getPercent(startThreads, endThreads),
+      startCategories,
+      endCategories,
+      newCategories: endCategories - startCategories,
+      perNewCategories: getPercent(startCategories, endCategories),
+    });
+  }
+
+  async getFiatEvents(
+    startBlockHeight: number,
+    endBlockHeight: number,
+    statusUrl: string
+  ) {
+    let sumerGenesis = new Date("2021-04-07T18:20:54.000Z");
+
+    console.log("Fetching fiat events....");
+    await axios.get(statusUrl).then(({ data }) => {
+      const { burns, exchanges, dollarPoolChanges } = data as StatusData;
+
+      console.log("# Exchanges");
+      let filteredExchanges = exchanges.filter(
+        (exchange) =>
+          exchange.blockHeight >= startBlockHeight &&
+          exchange.blockHeight <= endBlockHeight &&
+          new Date(exchange.date) > sumerGenesis
+      );
+
+      for (let filteredExchange of filteredExchanges) {
+        console.log(
+          `Block: ${filteredExchange.blockHeight}, USD: ${filteredExchange.amountUSD}`
+        );
+      }
+
+      let filteredBurns = burns.filter(
+        (burn: any) =>
+          burn.blockHeight >= startBlockHeight &&
+          burn.blockHeight <= endBlockHeight &&
+          new Date(burn.date) > sumerGenesis
+      );
+      if (filteredBurns.length) {
+        console.log("# Burns");
+        filteredBurns.forEach(({ blockHeight, amount }) =>
+          console.log(`Block: ${blockHeight}, tJOY: ${amount}`)
+        );
+      }
+
+      console.log("# Dollar Pool Changes");
+      const allDollarPoolChanges = dollarPoolChanges.filter(
+        (dollarPoolChange: any) =>
+          dollarPoolChange.blockHeight >= startBlockHeight &&
+          dollarPoolChange.blockHeight <= endBlockHeight &&
+          new Date(dollarPoolChange.blockTime) > sumerGenesis
+      );
+      const filteredDollarPoolChanges = dollarPoolChanges.filter(
+        (dollarPoolChange: any) =>
+          dollarPoolChange.blockHeight >= startBlockHeight &&
+          dollarPoolChange.blockHeight <= endBlockHeight &&
+          dollarPoolChange.change > 0 &&
+          new Date(dollarPoolChange.blockTime) > sumerGenesis
+      );
+
+      let dollarPoolRefills = ``;
+      if (filteredDollarPoolChanges.length > 0) {
+        dollarPoolRefills =
+          "| Refill, USD | Reason | Block # |\n|---------------------|--------------|--------------|\n";
+        filteredDollarPoolChanges.forEach(({ blockHeight, change, reason }) => {
+          console.log(
+            `Block: ${blockHeight}, USD: ${change}, Reason: ${reason}`
+          );
+          dollarPoolRefills += `| ${change} | ${reason} | ${blockHeight} |\n`;
         });
-
-        if (!isStartBlockFirstCouncilBlock) {
-            console.warn('Note: The given start block is not the first block of the council round so council election information will be empty');
-            return;
-        }
-        let previousCouncilRoundLastBlock = startBlock - 1;
-        let previousCouncilRoundLastBlockHash = await this.api.rpc.chain.getBlockHash(previousCouncilRoundLastBlock);
-
-        let applicants = await this.api.query.councilElection.applicants.at(previousCouncilRoundLastBlockHash) as Vec<AccountId>;
-        this.statistics.electionApplicants = applicants.length;
-        for (let applicant of applicants) {
-            let applicantStakes = await this.api.query.councilElection.applicantStakes.at(previousCouncilRoundLastBlockHash, applicant) as unknown as ElectionStake;
-            this.statistics.electionApplicantsStakes += applicantStakes.new.toNumber();
-        }
-        // let seats = await this.api.query.council.activeCouncil.at(startBlockHash) as Seats;
-        //TODO: Find a more accurate way of getting the votes
-        const votes = await this.api.query.councilElection.commitments.at(previousCouncilRoundLastBlockHash) as Vec<Hash>;
-        this.statistics.electionVotes = votes.length;
-    }
-
-    async fillValidatorInfo(startHash: Hash, endHash: Hash) {
-        let startTimestamp = await this.api.query.timestamp.now.at(startHash) as unknown as Moment;
-        let endTimestamp = await this.api.query.timestamp.now.at(endHash) as unknown as Moment;
-        let avgBlockProduction = (((endTimestamp.toNumber() - startTimestamp.toNumber())
-            / 1000) / this.statistics.newBlocks);
-        this.statistics.avgBlockProduction = Number(avgBlockProduction.toFixed(2));
-
-        let maxStartValidators = (await this.api.query.staking.validatorCount.at(startHash) as u32).toNumber();
-        let startValidators = await this.findActiveValidators(startHash, false);
-        this.statistics.startValidators = startValidators.length + " / " + maxStartValidators;
-
-        let maxEndValidators = (await this.api.query.staking.validatorCount.at(endHash) as u32).toNumber();
-        let endValidators = await this.findActiveValidators(endHash, true);
-        this.statistics.endValidators = endValidators.length + " / " + maxEndValidators;
-
-        this.statistics.percValidators = StatisticsCollector.convertToPercentage(startValidators.length, endValidators.length);
-
-        const startEra = await this.api.query.staking.currentEra.at(startHash) as Option<EraIndex>;
-        this.statistics.startValidatorsStake = (await this.api.query.staking.erasTotalStake.at(startHash, startEra.unwrap())).toNumber();
-
-        const endEra = await this.api.query.staking.currentEra.at(endHash) as Option<EraIndex>;
-        this.statistics.endValidatorsStake = (await this.api.query.staking.erasTotalStake.at(endHash, endEra.unwrap())).toNumber();
-
-        this.statistics.percNewValidatorsStake = StatisticsCollector.convertToPercentage(this.statistics.startValidatorsStake, this.statistics.endValidatorsStake);
-        await this.fillValidatorsRewards();
-    }
-
-    async findActiveValidators(hash: Hash, searchPreviousBlocks: boolean): Promise<AccountId[]> {
-        const block = await this.api.rpc.chain.getBlock(hash);
-
-        let currentBlockNr = block.block.header.number.toNumber();
-        let activeValidators;
-        do {
-            let currentHash = (await this.api.rpc.chain.getBlockHash(currentBlockNr)) as Hash;
-            let allValidators = await this.api.query.staking.snapshotValidators.at(currentHash) as Option<Vec<AccountId>>;
-            if (!allValidators.isEmpty) {
-                let max = (await this.api.query.staking.validatorCount.at(currentHash)).toNumber();
-                activeValidators = Array.from(allValidators.unwrap()).slice(0, max);
-            }
-
-            if (searchPreviousBlocks) {
-                --currentBlockNr;
-            } else {
-                ++currentBlockNr;
-            }
-
-        } while (activeValidators == undefined);
-        return activeValidators;
-    }
-
-    async fillStorageProviderInfo(startBlock: number, endBlock: number, startHash: Hash, endHash: Hash) {
-        let roundNrBlocks = endBlock - startBlock;
-
-        let storageProvidersRewards = await this.computeWorkingGroupReward(roundNrBlocks, startHash, endHash, 'storage');
-        this.statistics.newStorageProviderReward = storageProvidersRewards.rewards;
-        this.statistics.newStorageProviderReward = Number(this.statistics.newStorageProviderReward.toFixed(2));
-
-        this.statistics.startStorageProvidersStake = storageProvidersRewards.startStake;
-        this.statistics.endStorageProvidersStake = storageProvidersRewards.endStake;
-        this.statistics.percNewStorageProviderStake = StatisticsCollector.convertToPercentage(this.statistics.startStorageProvidersStake, this.statistics.endStorageProvidersStake);
-
-        this.statistics.startStorageProviders = await this.api.query.storageWorkingGroup.activeWorkerCount.at(startHash);
-        this.statistics.endStorageProviders = await this.api.query.storageWorkingGroup.activeWorkerCount.at(endHash);
-        this.statistics.percNewStorageProviders = StatisticsCollector.convertToPercentage(this.statistics.startStorageProviders, this.statistics.endStorageProviders);
-
-        let nextWorkerId = Number(await this.api.query.storageWorkingGroup.nextWorkerId.at(endHash));
-        this.statistics.storageProviders = "";
-        for (let i = 0; i < nextWorkerId; ++i) {
-            let storageProvider = await this.api.query.storageWorkingGroup.workerById.at(endHash, i) as WorkerOf;
-            if (!storageProvider.is_active) {
-                continue;
-            }
-
-            let membership = await this.api.query.members.membershipById.at(endHash, storageProvider.member_id) as Membership;
-            this.statistics.storageProviders += "@" + membership.handle + " | (" + membership.root_account + ")  \n";
-
-        }
-
-    }
-
-    async fillCuratorInfo(startHash: Hash, endHash: Hash) {
-        this.statistics.startCurators = Number(await this.api.query.contentDirectoryWorkingGroup.activeWorkerCount.at(startHash));
-        this.statistics.endCurators = Number(await this.api.query.contentDirectoryWorkingGroup.activeWorkerCount.at(endHash));
-        this.statistics.percNewCurators = StatisticsCollector.convertToPercentage(this.statistics.startCurators, this.statistics.endCurators);
-
-        let nextCuratorId = Number(await this.api.query.contentDirectoryWorkingGroup.nextWorkerId.at(endHash));
-        this.statistics.curators = "";
-
-        for (let i = 0; i < nextCuratorId; i++) {
-            let worker = await this.api.query.contentDirectoryWorkingGroup.workerById.at(endHash, i) as WorkerOf;
-            if (!worker.is_active) {
-                continue;
-            }
-
-            let curatorMembership = await this.api.query.members.membershipById.at(endHash, worker.member_id) as Membership;
-            this.statistics.curators += "@" + curatorMembership.handle + " | (" + curatorMembership.root_account + ")  \n";
-
-        }
-    }
-
-    async fillOperationsInfo(startBlock: number, endBlock: number, startHash: Hash, endHash: Hash) {
-        let roundNrBlocks = endBlock - startBlock;
-
-        let operationsRewards = await this.computeWorkingGroupReward(roundNrBlocks, startHash, endHash, 'operations');
-        this.statistics.newOperationsReward = operationsRewards.rewards;
-        this.statistics.newOperationsReward = Number(this.statistics.newOperationsReward.toFixed(2));
-
-        this.statistics.startOperationsStake = operationsRewards.startStake;
-        this.statistics.endOperationsStake = operationsRewards.endStake;
-        this.statistics.percNewOperationstake = StatisticsCollector.convertToPercentage(this.statistics.startOperationsStake, this.statistics.endOperationsStake);
-
-        this.statistics.startOperationsWorkers = Number(await this.api.query.operationsWorkingGroup.activeWorkerCount.at(startHash));
-        this.statistics.endOperationsWorkers = Number(await this.api.query.operationsWorkingGroup.activeWorkerCount.at(endHash));
-        this.statistics.percNewOperationsWorkers = StatisticsCollector.convertToPercentage(this.statistics.startOperationsWorkers, this.statistics.endOperationsWorkers);
-
-        let nextOperationsWorkerId = Number(await this.api.query.operationsWorkingGroup.nextWorkerId.at(endHash));
-        this.statistics.operations = "";
-
-        for (let i = 0; i < nextOperationsWorkerId; i++) {
-            let worker = await this.api.query.operationsWorkingGroup.workerById.at(endHash, i) as WorkerOf;
-            if (!worker.is_active) {
-                continue;
-            }
-
-            let operationMembership = await this.api.query.members.membershipById.at(endHash, worker.member_id) as Membership;
-            this.statistics.operations += "@" + operationMembership.handle + " | (" + operationMembership.root_account + ")  \n";
-
-        }
-    }
-
-    async fillMembershipInfo(startHash: Hash, endHash: Hash) {
-        this.statistics.startMembers = (await this.api.query.members.nextMemberId.at(startHash) as MemberId).toNumber();
-        this.statistics.endMembers = (await this.api.query.members.nextMemberId.at(endHash) as MemberId).toNumber();
-        this.statistics.newMembers = this.statistics.endMembers - this.statistics.startMembers;
-        this.statistics.percNewMembers = StatisticsCollector.convertToPercentage(this.statistics.startMembers, this.statistics.endMembers);
-    }
-
-    async fillMediaUploadInfo(startHash: Hash, endHash: Hash) {
-
-        let startVideos = (await this.api.query.content.nextVideoId.at(startHash) as VideoId).toNumber();
-        let endVideos = (await this.api.query.content.nextVideoId.at(endHash) as VideoId).toNumber();
-
-        this.statistics.startMedia = startVideos;
-        this.statistics.endMedia = endVideos;
-        this.statistics.percNewMedia = StatisticsCollector.convertToPercentage(this.statistics.startMedia, this.statistics.endMedia);
-
-        let startChannels = (await this.api.query.content.nextChannelId.at(startHash) as ChannelId).toNumber();
-        let endChannels = (await this.api.query.content.nextChannelId.at(endHash) as ChannelId).toNumber();
-
-        this.statistics.startChannels = startChannels;
-        this.statistics.endChannels = endChannels;
-        this.statistics.percNewChannels = StatisticsCollector.convertToPercentage(this.statistics.startChannels, this.statistics.endChannels);
-
-        let dataObjects = await this.api.query.dataDirectory.dataByContentId.entries() as unknown as Map<ContentId, DataObject>;
-
-        let startObjects = new Map<ContentId, DataObject>();
-        let endObjects = new Map<ContentId, DataObject>();
-
-        const startBlock = await this.api.rpc.chain.getBlock(startHash);
-        const endBlock = await this.api.rpc.chain.getBlock(endHash);
-
-        for (let [key, dataObject] of dataObjects) {
-            if (dataObject.added_at.block.toNumber() < startBlock.block.header.number.toNumber()) {
-                startObjects.set(key, dataObject);
-                this.statistics.startUsedSpace += dataObject.size_in_bytes.toNumber() / 1024 / 1024;
-            }
-
-            if (dataObject.added_at.block.toNumber() < endBlock.block.header.number.toNumber()) {
-                endObjects.set(key, dataObject);
-                this.statistics.endUsedSpace += dataObject.size_in_bytes.toNumber() / 1024 / 1024;
-            }
-        }
-        this.statistics.startUsedSpace = Number(this.statistics.startUsedSpace.toFixed(2));
-        this.statistics.endUsedSpace = Number(this.statistics.endUsedSpace.toFixed(2));
-
-        this.statistics.percNewUsedSpace = StatisticsCollector.convertToPercentage(this.statistics.startUsedSpace, this.statistics.endUsedSpace);
-    }
-
-    async fillForumInfo(startHash: Hash, endHash: Hash) {
-        let startPostId = await this.api.query.forum.nextPostId.at(startHash) as PostId;
-        let endPostId = await this.api.query.forum.nextPostId.at(endHash) as PostId;
-        this.statistics.startPosts = startPostId.toNumber();
-        this.statistics.endPosts = endPostId.toNumber();
-        this.statistics.newPosts = this.statistics.endPosts - this.statistics.startPosts;
-        this.statistics.percNewPosts = StatisticsCollector.convertToPercentage(this.statistics.startPosts, this.statistics.endPosts);
-
-        let startThreadId = ((await this.api.query.forum.nextThreadId.at(startHash)) as unknown) as ThreadId;
-        let endThreadId = ((await this.api.query.forum.nextThreadId.at(endHash)) as unknown) as ThreadId;
-        this.statistics.startThreads = startThreadId.toNumber();
-        this.statistics.endThreads = endThreadId.toNumber();
-        this.statistics.newThreads = this.statistics.endThreads - this.statistics.startThreads;
-        this.statistics.percNewThreads = StatisticsCollector.convertToPercentage(this.statistics.startThreads, this.statistics.endThreads);
-
-        let startCategoryId = (await this.api.query.forum.nextCategoryId.at(startHash)) as CategoryId;
-        let endCategoryId = (await this.api.query.forum.nextCategoryId.at(endHash)) as CategoryId;
-        this.statistics.startCategories = startCategoryId.toNumber();
-        this.statistics.endCategories = endCategoryId.toNumber();
-        this.statistics.newCategories = this.statistics.endCategories - this.statistics.startCategories;
-        this.statistics.perNewCategories = StatisticsCollector.convertToPercentage(this.statistics.startCategories, this.statistics.endCategories);
-    }
-
-    static convertToPercentage(previousValue: number, newValue: number): number {
-        if (previousValue == 0) {
-            return newValue > 0 ? Infinity : 0;
+      }
+
+      // calculate inflation
+      let startTermExchangeRate = 0;
+      let endTermExchangeRate = 0;
+      if (filteredExchanges.length) {
+        const lastExchangeEvent =
+          filteredExchanges[filteredExchanges.length - 1];
+        startTermExchangeRate = filteredExchanges[0].price * 1000000;
+        endTermExchangeRate = lastExchangeEvent.price * 1000000;
+      } else {
+        startTermExchangeRate =
+          filteredDollarPoolChanges[0].valueAfter * 1000000;
+        const lastEvent =
+          filteredDollarPoolChanges[filteredDollarPoolChanges.length - 1];
+        endTermExchangeRate = lastEvent.rateAfter * 1000000;
+      }
+      let inflationPct = getPercent(endTermExchangeRate, startTermExchangeRate);
+      console.log(
+        "# USD / 1M tJOY Rate\n",
+        `@ Term start (block #${startBlockHeight}: ${startTermExchangeRate}\n`,
+        `@ Term end (block #${endBlockHeight}: ${endTermExchangeRate}\n`,
+        `Inflation: ${inflationPct}`
+      );
+
+      const startDollarPool =
+        allDollarPoolChanges[0].change > 0
+          ? allDollarPoolChanges[0].valueAfter - allDollarPoolChanges[0].change
+          : allDollarPoolChanges[0].valueAfter;
+      const endDollarEvent =
+        allDollarPoolChanges[allDollarPoolChanges.length - 1];
+      const endDollarPool = endDollarEvent.valueAfter;
+      const dollarPoolPctChange = getPercent(startDollarPool, endDollarPool);
+
+      this.saveStats({
+        startTermExchangeRate: startTermExchangeRate.toFixed(2),
+        endTermExchangeRate: endTermExchangeRate.toFixed(2),
+        inflationPct,
+        startDollarPool: startDollarPool.toFixed(2),
+        endDollarPool: endDollarPool.toFixed(2),
+        dollarPoolPctChange,
+        dollarPoolRefills,
+      });
+    });
+  }
+
+  async buildBlocksEventCache(
+    startBlock: number,
+    endBlock: number,
+    cacheDir: string
+  ): Promise<void> {
+    const cacheFile = `${cacheDir}/${startBlock}-${endBlock}.json`;
+    const exists = await fs
+      .access(cacheFile, fsSync.constants.R_OK)
+      .then(() => true)
+      .catch(() => false);
+    if (!exists) {
+      console.log("Building events cache...");
+      let blocksEvents = new Map<number, CacheEvent[]>();
+      for (let i = startBlock; i < endBlock; ++i) {
+        process.stdout.write("\rCaching block: " + i + " until " + endBlock);
+        const blockHash: Hash = await getBlockHash(this.api, i);
+        let eventRecord: EventRecord[] = [];
+        try {
+          eventRecord = await getEvents(this.api, blockHash);
+        } catch (e) {
+          console.warn(`Failed to get events.`, e);
         }
-        return Number((newValue * 100 / previousValue - 100).toFixed(2));
-    }
-
-    async buildBlocksEventCache(startBlock: number, endBlock: number) {
-        let cacheFile = CACHE_FOLDER + '/' + startBlock + '-' + endBlock + '.json';
-        let exists = await fs.access(cacheFile, fsSync.constants.R_OK).then(() => true)
-            .catch(() => false);
-        // let exists = false;
-        if (!exists) {
-            console.log('Building events cache...');
-            let blocksEvents = new Map<number, CacheEvent[]>();
-            for (let i = startBlock; i < endBlock; ++i) {
-                process.stdout.write('\rCaching block: ' + i + ' until ' + endBlock);
-                const blockHash: Hash = await this.api.rpc.chain.getBlockHash(i);
-                let eventRecord = await this.api.query.system.events.at(blockHash) as Vec<EventRecord>;
-                let cacheEvents = new Array<CacheEvent>();
-                for (let event of eventRecord) {
-                    cacheEvents.push(new CacheEvent(event.event.section, event.event.method, event.event.data));
-                }
-                blocksEvents.set(i, cacheEvents);
-            }
-
-            console.log('\nFinish events cache...');
-            let jsonOutput = JSON.stringify(Array.from(blocksEvents.entries()), null, 2);
-            await fs.writeFile(cacheFile, jsonOutput);
-            this.blocksEventsCache = new Map(JSON.parse(jsonOutput));
-        } else {
-            console.log('Cache file found, loading it...');
-            let fileData = await fs.readFile(cacheFile);
-            this.blocksEventsCache = new Map(JSON.parse(fileData));
-            console.log('Cache file loaded...');
+        let cacheEvents = new Array<CacheEvent>();
+        for (let { event } of eventRecord) {
+          if (!event) {
+            console.warn(`empty event record`);
+            continue;
+          }
+          cacheEvents.push(
+            new CacheEvent(event.section, event.method, event.data)
+          );
         }
+        blocksEvents.set(i, cacheEvents);
+      }
+
+      console.log("\nFinish events cache...");
+      const json = JSON.stringify(Array.from(blocksEvents.entries()), null, 2);
+      fsSync.writeFileSync(cacheFile, json);
+      this.blocksEventsCache = new Map(JSON.parse(json));
+    } else {
+      console.log("Cache file found, loading it...");
+      let fileData = await fs.readFile(cacheFile);
+      this.blocksEventsCache = new Map(JSON.parse(fileData));
     }
-
-    static async connectApi(): Promise<ApiPromise> {
-        // const provider = new WsProvider('wss://testnet.joystream.org:9944');
-        const provider = new WsProvider(PROVIDER_URL);
-
-        // Create the API and wait until ready
-        return await ApiPromise.create({provider, types});
-    }
+  }
 }

+ 83 - 38
contributions/tech/report-generator/src/generator.ts

@@ -1,46 +1,91 @@
-import {StatisticsCollector} from "./StatisticsCollector";
+import fs from "fs";
+const exec = require("util").promisify(require("child_process").exec);
+import { StatisticsCollector } from "./StatisticsCollector";
+import { connectApi, getHead, getCouncils } from "./lib/api";
+import { Round } from "./lib/types";
+import { Config } from "./types";
 
-const fs = require('fs').promises;
+const CONFIG: Config = {
+  repoDir: __dirname + "/../../../../",
+  reportsDir: "council/tokenomics",
+  spendingCategoriesFile: "governance/spending_proposal_categories.csv",
+  templateFile: __dirname + "/../report-template.md",
+  providerUrl: "ws://127.0.0.1:9944",
+  statusUrl: "https://status.joystream.org/status/",
+  burnAddress: "5D5PhZQNJzcJXVBxwJxZcsutjKPqUPydrvpu6HeiBfMaeKQu",
+  cacheDir: "cache",
+  councilRoundOffset: 2,
+  videoClassId: 10,
+  channelClassId: 1,
+};
 
-async function main() {
-    const args = process.argv.slice(2);
+async function main(config: Config) {
+  const { templateFile } = config;
+  const args = process.argv.slice(2);
+  if (args.length < 2) return updateReports(config, Number(args[0]));
 
-    if (args.length != 2) {
-        console.error('Usage: [start bock number] [end block number]');
-        process.exit(1);
-    }
+  const startBlock = Number(args[0]);
+  const endBlock = Number(args[1]);
 
-    const startBlock = Number(args[0]);
-    const endBlock = Number(args[1]);
+  if (isNaN(startBlock) || isNaN(endBlock) || startBlock >= endBlock) {
+    console.error("Invalid block range.");
+    process.exit(1);
+  } else generateReport(startBlock, endBlock, config);
+}
 
-    if (isNaN(startBlock) || isNaN(endBlock) || startBlock >= endBlock) {
-        console.error('Invalid block range');
-        process.exit(1);
-    }
+const generateReport = async (
+  startBlock: number,
+  endBlock: number,
+  config: Config
+): Promise<boolean> => {
+  const { templateFile, repoDir, reportsDir } = config;
+  let fileData = fs.readFileSync(templateFile, "utf8");
+  let statsCollecttor = new StatisticsCollector();
+  console.log(`-> Collecting stats from ${startBlock} to ${endBlock}`);
+  const stats = await statsCollecttor.getStats(startBlock, endBlock, config);
+  console.log(stats);
+  if (!stats.dateStart) return false;
+  const round = stats.councilRound || 1;
 
-    try {
-        let fileData = await fs.readFile(__dirname + '/../report-template.md', {
-            encoding: "utf8"
-        });
-        console.log('Getting report info...');
-        let staticCollecttor = new StatisticsCollector();
-        let statistics =  await staticCollecttor.getStatistics(startBlock, endBlock);
-        console.log('Writing info in the report...');
-
-        let entries = Object.entries(statistics);
-
-        for (let entry of entries){
-            let regex = new RegExp('{' + entry[0] + '}', "g");
-            fileData = fileData.replace(regex, entry[1].toString());
-        }
-
-        await fs.writeFile('report.md', fileData);
-        console.log('Report generated!');
-        process.exit(0);
-    }catch (e) {
-        console.error(e);
-    }
+  const fileName = `Council_Round${round}_${startBlock}-${endBlock}_Tokenomics_Report.md`;
+  // antioch was updated to sumer at 717987
+  const version = startBlock < 717987 ? "antioch-3" : "sumer-4";
+  const dir = `${repoDir}${reportsDir}/${version}`;
 
-}
+  console.log(`-> Writing report to ${fileName}`);
+  for (const entry of Object.entries(stats)) {
+    const regex = new RegExp("{" + entry[0] + "}", "g");
+    fileData = fileData.replace(regex, entry[1].toString());
+  }
+  fs.writeFileSync(`${dir}/${fileName}`, fileData);
+  return true;
+};
+
+const updateReports = async (config: Config, round?: number) => {
+  const { templateFile, providerUrl } = config;
+  console.debug(`Connecting to ${providerUrl}`);
+  const api = await connectApi(providerUrl);
+  await api.isReady;
+
+  console.log(`-> Fetching councils`);
+  const head = await getHead(api);
+  getCouncils(api, +head).then(async (councils: Round[]) => {
+    api.disconnect();
+    if (round === null || isNaN(round)) {
+      console.log(`-> Updating reports`);
+      await Promise.all(
+        councils.map(({ start, end }) => generateReport(start, end, config))
+      );
+    } else {
+      const council = councils.find((c) => c.round === round);
+      if (!council) return console.warn(`Round ${round} not found:`, councils);
+      console.log(
+        `-> Updating round ${round} (${council.start}-${council.end})`
+      );
+      await generateReport(council.start, council.end, config);
+    }
+    process.exit();
+  });
+};
 
-main();
+main(CONFIG);

+ 1 - 0
contributions/tech/report-generator/src/lib

@@ -0,0 +1 @@
+Subproject commit b66ce1329015715d32d7d3f873a411401d691583

+ 208 - 215
contributions/tech/report-generator/src/types.ts

@@ -1,239 +1,232 @@
-import {GenericEventData} from "@polkadot/types/generic/Event";
+export interface Config {
+  repoDir: string,
+  reportsDir: string,
+  spendingCategoriesFile: string,
+  templateFile: string,
+  providerUrl: string,
+  statusUrl: string,
+  burnAddress: string,
+  cacheDir: string,
+  councilRoundOffset: number,
+  videoClassId: number,
+  channelClassId: number,
+}
 
 export class Statistics {
-    councilRound: number = 0;
-    councilMembers: number = 0;
-
-    electionApplicants: number = 0;
-    electionAvgApplicants: number = 0;
-    perElectionApplicants: number = 0;
-
-    electionApplicantsStakes: number = 0;
-    electionVotes: number = 0;
-    avgVotePerApplicant: number = 0;
-
-    dateStart: string = "";
-    dateEnd: string = "";
-
-    startBlock: number = 0;
-    endBlock: number = 0;
-    percNewBlocks: number = 0;
-
-    startMembers: number = 0;
-    endMembers: number = 0;
-    newMembers: number = 0;
-    percNewMembers: number = 0;
-
-    newBlocks: number = 0;
-    avgBlockProduction: number = 0;
-
-
-    startThreads: number = 0;
-    endThreads: number = 0;
-    newThreads: number = 0;
-    totalThreads: number = 0;
-    percNewThreads: number = 0;
-
-    startPosts: number = 0;
-    // endPosts: number = 0;
-    newPosts: number = 0;
-    endPosts: number = 0;
-    percNewPosts: number = 0;
-
-    startCategories: number = 0;
-    endCategories: number = 0;
-    newCategories: number = 0;
-    perNewCategories: number = 0;
-
-    newProposals: number = 0;
-    newApprovedProposals: number = 0;
-
-    startChannels: number = 0;
-    newChannels: number = 0;
-    endChannels: number = 0;
-    percNewChannels: number = 0;
-
-    startMedia: number = 0;
-    newMedia: number = 0;
-    endMedia: number = 0;
-    percNewMedia: number = 0;
-
-    deletedMedia: number = 0;
-    newMints: number = 0;
-
-    startMinted: number = 0;
-    totalMinted: number = 0;
-    percMinted: number = 0;
-    endMinted: number = 0;
-
-    totalMintCapacityIncrease: number = 0;
-
-    startCouncilMinted: number = 0;
-    endCouncilMinted: number = 0;
-    newCouncilMinted: number = 0;
-    percNewCouncilMinted: number = 0;
-
-    startCuratorMinted: number = 0;
-    endCuratorMinted: number = 0;
-    newCuratorMinted: number = 0;
-    percCuratorMinted: number = 0;
-
-    startStorageMinted: number = 0;
-    endStorageMinted: number = 0;
-    newStorageMinted: number = 0;
-    percStorageMinted: number = 0;
-
-    startOperationsMinted: number = 0;
-    endOperationsMinted: number = 0;
-    newOperationsMinted: number = 0;
-    percOperationsMinted: number = 0;
-
-    startIssuance: number = 0;
-    endIssuance: number = 0;
-    newIssuance: number = 0;
-    percNewIssuance: number = 0;
-
-    newTokensBurn: number = 0;
-    newValidatorRewards: number = 0;
-    avgValidators: number = 0;
-    startValidators: string = "";
-    endValidators: string = "";
-    percValidators: number = 0;
-    startValidatorsStake: number = 0;
-    endValidatorsStake: number = 0;
-    percNewValidatorsStake: number = 0;
-
-    startStorageProviders: number = 0;
-    endStorageProviders: number = 0;
-    percNewStorageProviders: number = 0;
-    newStorageProviderReward: number = 0;
-    startStorageProvidersStake: number = 0;
-    endStorageProvidersStake: number = 0;
-    percNewStorageProviderStake: number = 0;
-
-    startOperationsWorkers: number = 0;
-    endOperationsWorkers: number = 0;
-    percNewOperationsWorkers: number = 0;
-    newOperationsReward: number = 0;
-    startOperationsStake: number = 0;
-    endOperationsStake: number = 0;
-    percNewOperationstake: number = 0;
-
-    newCouncilRewards: number = 0;
-
-    startCurators: number = 0;
-    endCurators: number = 0;
-    percNewCurators: number = 0;
-    newCuratorRewards: number = 0;
-
-    startUsedSpace: number = 0;
-    newUsedSpace: number = 0;
-    endUsedSpace: number = 0;
-    percNewUsedSpace: number = 0;
-
-    avgNewSizePerContent: number = 0;
-    totalAvgSizePerContent: number = 0;
-    percAvgSizePerContent: number = 0;
-
-    newStakes: number = 0;
-    totalNewStakeValue: number = 0;
-
-    newTextProposals: number = 0;
-    newRuntimeUpgradeProposal: number = 0;
-    newSetElectionParametersProposal: number = 0;
-
-    spendingProposalsTotal: number = 0;
-    bountiesTotalPaid: number = 0;
-
-    newSetLeadProposal: number = 0;
-    newSetContentWorkingGroupMintCapacityProposal: number = 0;
-    newEvictStorageProviderProposal: number = 0;
-    newSetValidatorCountProposal: number = 0;
-    newSetStorageRoleParametersProposal: number = 0;
-
-    storageProviders: string;
-    curators: string;
-    operations:string;
-
-    constructor() {
-    }
-
+  [key: string]: number | string;
+  councilRound: number = 0;
+  councilMembers: number = 0;
+
+  electionApplicants: number = 0;
+  electionAvgApplicants: number = 0;
+  perElectionApplicants: number = 0;
+
+  electionApplicantsStakes: number = 0;
+  electionVotes: number = 0;
+  avgVotePerApplicant: number = 0;
+
+  dateStart: string = "";
+  dateEnd: string = "";
+
+  startBlock: number = 0;
+  endBlock: number = 0;
+  percNewBlocks: number = 0;
+
+  startMembers: number = 0;
+  endMembers: number = 0;
+  newMembers: number = 0;
+  percNewMembers: number = 0;
+
+  newBlocks: number = 0;
+  avgBlockProduction: number = 0;
+
+  startThreads: number = 0;
+  endThreads: number = 0;
+  newThreads: number = 0;
+  totalThreads: number = 0;
+  percNewThreads: number = 0;
+
+  startPosts: number = 0;
+  newPosts: number = 0;
+  endPosts: number = 0;
+  percNewPosts: number = 0;
+
+  startCategories: number = 0;
+  endCategories: number = 0;
+  newCategories: number = 0;
+  perNewCategories: number = 0;
+
+  newProposals: number = 0;
+  newApprovedProposals: number = 0;
+
+  startChannels: number = 0;
+  newChannels: number = 0;
+  endChannels: number = 0;
+  percNewChannels: number = 0;
+
+  startMedia: number = 0;
+  newMedia: number = 0;
+  endMedia: number = 0;
+  percNewMedia: number = 0;
+
+  deletedMedia: number = 0;
+  newMints: number = 0;
+
+  startMinted: number = 0;
+  totalMinted: number = 0;
+  percMinted: number = 0;
+  endMinted: number = 0;
+
+  totalMintCapacityIncrease: number = 0;
+
+  startCouncilMinted: number = 0;
+  endCouncilMinted: number = 0;
+  newCouncilMinted: number = 0;
+  percNewCouncilMinted: number = 0;
+
+  startCuratorMinted: number = 0;
+  endCuratorMinted: number = 0;
+  newCuratorMinted: number = 0;
+  percCuratorMinted: number = 0;
+
+  startStorageMinted: number = 0;
+  endStorageMinted: number = 0;
+  newStorageMinted: number = 0;
+  percStorageMinted: number = 0;
+
+  startOperationsMinted: number = 0;
+  endOperationsMinted: number = 0;
+  newOperationsMinted: number = 0;
+  percOperationsMinted: number = 0;
+
+  startIssuance: number = 0;
+  endIssuance: number = 0;
+  newIssuance: number = 0;
+  percNewIssuance: number = 0;
+
+  newTokensBurn: number = 0;
+  newValidatorRewards: number = 0;
+  avgValidators: number = 0;
+  startValidators: string = "";
+  endValidators: string = "";
+  percValidators: number = 0;
+  startValidatorsStake: number = 0;
+  endValidatorsStake: number = 0;
+  percNewValidatorsStake: number = 0;
+
+  startStorageProviders: number = 0;
+  endStorageProviders: number = 0;
+  percNewStorageProviders: number = 0;
+  newStorageProviderReward: number = 0;
+  startStorageProvidersStake: number = 0;
+  endStorageProvidersStake: number = 0;
+  percNewStorageProviderStake: number = 0;
+
+  startOperationsWorkers: number = 0;
+  endOperationsWorkers: number = 0;
+  percNewOperationsWorkers: number = 0;
+  newOperationsReward: number = 0;
+  startOperationsStake: number = 0;
+  endOperationsStake: number = 0;
+  percNewOperationstake: number = 0;
+
+  newCouncilRewards: number = 0;
+
+  startCurators: number = 0;
+  endCurators: number = 0;
+  percNewCurators: number = 0;
+  newCuratorRewards: number = 0;
+
+  startUsedSpace: number = 0;
+  newUsedSpace: number = 0;
+  endUsedSpace: number = 0;
+  percNewUsedSpace: number = 0;
+
+  avgNewSizePerContent: number = 0;
+  totalAvgSizePerContent: number = 0;
+  percAvgSizePerContent: number = 0;
+
+  newStakes: number = 0;
+  totalNewStakeValue: number = 0;
+
+  newTextProposals: number = 0;
+  newRuntimeUpgradeProposal: number = 0;
+  newSetElectionParametersProposal: number = 0;
+
+  spendingProposalsTotal: number = 0;
+  bountiesTotalPaid: number = 0;
+
+  newSetLeadProposal: number = 0;
+  newSetContentWorkingGroupMintCapacityProposal: number = 0;
+  newEvictStorageProviderProposal: number = 0;
+  newSetValidatorCountProposal: number = 0;
+  newSetStorageRoleParametersProposal: number = 0;
+
+  storageProviders: string;
+  curators: string;
+  operations: string;
+
+  constructor() {}
 }
 
 export class ValidatorReward {
-    sharedReward: number = 0;
-    remainingReward: number = 0;
-    validators: number = 0;
-    slotStake: number = 0;
-    blockNumber: number = 0;
+  sharedReward: number = 0;
+  remainingReward: number = 0;
+  validators: number = 0;
+  slotStake: number = 0;
+  blockNumber: number = 0;
 }
 
 export class WorkersInfo {
-    rewards: number = 0;
-    startStake: number = 0;
-    endStake: number = 0;
-    startNrOfWorkers: number = 0;
-    endNrOfWorkers: number = 0;
+  rewards: number = 0;
+  startStake: number = 0;
+  endStake: number = 0;
+  startNrOfWorkers: number = 0;
+  endNrOfWorkers: number = 0;
 }
 
 export class Exchange {
-    sender: string = "";
-    amount: number = 0;
-    fees: number = 0;
-    blockNumber: number = 0;
+  sender: string = "";
+  amount: number = 0;
+  fees: number = 0;
+  blockNumber: number = 0;
 }
 
 export enum ProposalTypes {
-    Text = "Text",
-    RuntimeUpgrade = "RuntimeUpgrade",
-    SetElectionParameters = "SetElectionParameters",
-    Spending = "Spending",
-    SetLead = "SetLead",
-    SetContentWorkingGroupMintCapacity = "SetContentWorkingGroupMintCapacity",
-    EvictStorageProvider = "EvictStorageProvider",
-    SetValidatorCount = "SetValidatorCount",
-    SetStorageRoleParameters = "SetStorageRoleParameters",
-}
-
-export class SpendingProposals {
-
-    constructor(public id: number, public title: string, public spentAmount: number) {
-    }
-
+  Text = "Text",
+  RuntimeUpgrade = "RuntimeUpgrade",
+  SetElectionParameters = "SetElectionParameters",
+  Spending = "Spending",
+  SetLead = "SetLead",
+  SetContentWorkingGroupMintCapacity = "SetContentWorkingGroupMintCapacity",
+  EvictStorageProvider = "EvictStorageProvider",
+  SetValidatorCount = "SetValidatorCount",
+  SetStorageRoleParameters = "SetStorageRoleParameters",
 }
 
 export class MintStatistics {
-    startMinted: number;
-    endMinted: number;
-    diffMinted: number;
-    percMinted: number;
-
-    constructor(startMinted: number = 0, endMinted: number = 0, diffMinted: number = 0, percMinted: number = 0) {
-        this.startMinted = startMinted;
-        this.endMinted = endMinted;
-        this.diffMinted = diffMinted;
-        this.percMinted = percMinted;
-    }
-
+  startMinted: number;
+  endMinted: number;
+  diffMinted: number;
+  percMinted: number;
+
+  constructor(
+    startMinted: number = 0,
+    endMinted: number = 0,
+    diffMinted: number = 0,
+    percMinted: number = 0
+  ) {
+    this.startMinted = startMinted;
+    this.endMinted = endMinted;
+    this.diffMinted = diffMinted;
+    this.percMinted = percMinted;
+  }
 }
 
 export class Media {
-    constructor(public id: number, public title: string) {
-    }
+  constructor(public id: number, public title: string) {}
 }
 
 export class Channel {
-    constructor(public id: number, public title: string) {
-    }
-}
-
-export class Bounty {
-    constructor(public testnet: string, public proposalId: number, public title: string, public status: string, public amountAsked: number, public amountMinted: number) {
-    }
-}
-
-export class CacheEvent {
-
-    constructor(public section: string, public method: string, public data: GenericEventData) {
-    }
+  constructor(public id: number, public title: string) {}
 }

+ 3 - 3
contributions/tech/report-generator/tsconfig.json

@@ -25,8 +25,8 @@
       "./node_modules/@polkadot/ts",
       "./node_modules/@types"
     ],
-    "declarationDir": "lib",
-    "outDir": "lib"
+    "declarationDir": "build",
+    "outDir": "build"
   },
   "include": [
     "src/*.ts"
@@ -36,4 +36,4 @@
     "**/*.spec.ts",
     "**/*.d.ts"
   ]
-}
+}

File diff suppressed because it is too large
+ 7 - 0
contributions/tech/substrate_polkadot_content_list/polkadot_substrate_content_list.csv


+ 188 - 0
council/kpi/27_CC_1_Free_Editing_Tools.md

@@ -0,0 +1,188 @@
+## Scope of Work
+### Research video editing software that has (some) the following functionalities, in order of priority:
+
+* A) Cut and splice videos
+* B) Add still images
+* C) Add/replace audio tracks (for specific frames only)
+* D) Transcoding (change the video format, without negatively affecting the audio/video quality)
+
+### For each of the Operative System below, test the default software, and search for the "top" recommended free alternatives, and report back:
+
+- If possible (A-D)
+- Ease of use
+- Quality of end product
+- Precision (eg. can you cut from specific frame, or by second?)
+- What file formats are supported
+
+# PART 1 - In browser tools
+
+1. Fastreel
+
+##### Compress, cut and crop videos, use ready-made templates and much more. Prise: FREE
+
+![Alt text](https://new-img.movavi.com/pages/0013/01/39d35e1f5cb4673775a017a7b881cb48c2eaf7f1.webp "Title")
+
+ > Possible (A-D)
+ >
+ > Powerful, but not overly complex.
+ >
+ > Excellent quality
+ >
+ > Cut from specific frame
+ >
+ > MP4, MOV, MKV, AVI and WMV with a total size of no more than 500 MB.
+ >
+
+------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+2. Wevideo
+
+##### Create anywhere, anytime Prise: FREE
+##### Our cloud-based video editor lets you create on any device from any location: at home, at the office or on the go. Experience total creative freedom on Macs, PCs, Chromebooks and more..
+
+![Alt text](https://d3tvj3lw2y3r4c.cloudfront.net/webpage/prod3/img/new-pages/seo/windows-video-editor/youtube-step2.png "Title")
+
+ > Possible (A-D)
+ >
+ > A simple, intuitive editor leaves
+ >
+ > High-definition
+ >
+ > Cut from specific frame
+ >
+ > 3GP, 3GPP, AVI, DIVX, DV, FLV, M4V, MJPEG, MKV, MOD, MOV, MP4, MPEG, MPG, M2TS, MTS, MXF, OGV, WEBM and WMV.
+
+------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+3. Clipchamp
+
+##### Everything you need to work with video in one place. Prise: FREE
+
+![Alt text](https://habrastorage.org/getpro/habr/upload_files/4f4/aeb/5c5/4f4aeb5c546ffe4bfd9b6f4c2b3b0ca0.jpg "Title")
+
+ > Possible (A-D)
+ >
+ > Simple
+ >
+ > Excellent
+ >
+ > Cut from specific frame
+ >
+ > MP4, MOV, WEBM, AVI, DIVX, FLV, 3GP, WMV, VOB, DCM and MKV.
+
+------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+# PART 2 - MacOS
+
+1. Kdenlive
+
+##### Everything you need to work with video in one place. Prise: FREE
+
+![Alt text](https://upload.wikimedia.org/wikipedia/commons/c/cc/Kdenlive_19.04.2_English.png "Title")
+
+ > Possible (A-D)
+ >
+ > A simple
+ >
+ > Excellent quality
+ >
+ > Cut from specific frame
+ >
+ > DVD, MPEG2, MP4.
+
+------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+2. Lightworks
+
+##### The original, free professional craft video editing software. Built by world-leading editors, used by 5.5 million creatives world-wide. Prise: FREE
+
+![Alt text](https://images.wondershare.com/filmora/article-images/lightworks.jpg "Title")
+
+ > Possible (A-D)
+ >
+ > Simple
+ >
+ > Good quality
+ >
+ > Cut from specific frame
+ >
+ > MPEG4/H. 264.
+
+------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+3. DaVinci Resolve
+
+
+#####
+A powerful professional-grade video editor. DaVinci Resolve is one of the most powerful video editing suites on the planet Prise: FREE
+
+![Alt text](https://images.blackmagicdesign.com/images/products/davinciresolve/edit/hero/hero-still.jpg?_v=1592448885 "Title")
+
+ > Possible (A-D)
+ >
+ > Professional level (There is training)
+ >
+ > High-definition
+ >
+ > Cut from specific frame & second
+ >
+ > QuickTime, AVI, R3D, MXF, Prores, DNxHD, MXF, DPX, CIN, EXR, etc.
+
+------------------------------------------------------
+# PART 3 - Linux (ubuntu)
+
+1. Shotcut
+
+##### Everything you need to work with video in one place. Prise: FREE
+
+![Alt text](https://www.linux.org.ru/images/19439/original.png "Title")
+
+ > Possible (A-D)
+ >
+ > Medium difficulty
+ >
+ > Excellent quality
+ >
+ > Cut from specific frame
+ >
+ > MP4, MKV, FLV etc.
+
+------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+2. OpenShot
+
+##### OpenShot is a simple yet complete video editor aimed at novice users. Prise: FREE
+
+![Alt text](https://linuxthebest.net/wp-content/uploads/2018/09/openshot243.jpg "Title")
+
+ > Possible (A-D)
+ >
+ > Simple
+ >
+ > Good quality
+ >
+ > Cut from specific frame
+ >
+ > MP4, MPEG, MKV, MOV etc.
+
+------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+3. Cinelerra
+
+##### Everything you need to work with video in one place. Prise: FREE
+
+![Alt text](https://i.ytimg.com/vi/YzJ0b9XQR3s/maxresdefault.jpg "Title")
+
+ > Possible (A-D)
+ >
+ > Average
+ >
+ > Quality
+ >
+ > Cut from specific frame
+ >
+ > MP4, PRO, M2TS, DVD, F4V, FLV, MKV, WEBM, MPEG, AVI, FLAC etc.
+
+------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+PS The part about the windows, I shared with the curator @igrex

+ 40 - 0
council/kpi/Community_Feedback_Part_1.md

@@ -0,0 +1,40 @@
+# 28.II-4 - Community Feedback - Part 1
+In this work, which is divided into two parts: data collection by means of a google form (@ nanaPa6oTaeT) and analysis of problems based on data created by a companion document in the community repository (@ ZAZIK / @ ardashoff).
+Due to the short term for posting the form and the poor activity of the community in this issue of general opinion, regarding the main problems of the project, it was not possible to identify.
+Analyzing the work done by our colleague, we can draw the following conclusions in the percentage analysis:
+
+![чапалах](https://user-images.githubusercontent.com/86792707/139604346-a46824af-e531-42cb-bec9-582fa92d031e.png)
+
+
+- 82% - Perfectly understand the idea of the platform, the work of the DAO and the main activities of the platform.
+- 13% - Understand the general essence of the project, but do not understand its individual.
+- 5% - Do not understand at all how the project works.
+
+### All survey participants, in addition to specific questions regarding the project, were given the opportunity to write their questions and wishes. 
+
+![KPI](https://user-images.githubusercontent.com/86792707/139605619-a93bfbe7-7210-423c-8c66-3b4931f17b58.png)
+
+___Out of 100% of survey participants:___
+
+#### 77.5% used this opportunity
+- 43.5% of them expressed a desire to ask a question,
+- the remaining 32% left a wish. 
+#### 22.5% did not voice a specific proposal or wish
+
+*Among the interesting questions:* 
+- *When will the main marketing campaign be launched?*
+- *Will there be a mobile application and participation in its testing?*
+- *Can you see the roadmap of the project?*
+- *Is there a finite amount of FM? Will there be any rewards for active users who are not in FM?*
+- *How decentralized is the project? Why are validators depreciating at the moment?*
+- *Will there be integration between future content makers and DAOs?*
+
+*The most mentioned wishes are the following:*
+
+- *Expand and simplify the list of tasks for ordinary project participants by developing a dashboard of tasks.*
+- *Facilitate the understanding of the use of new users of the project through training presentation materials.*
+- *More activities for technicians.*
+
+
+### Output 
+`Based on the main questions and wishes about the project among the survey participants, I consider it necessary to make it necessary to make a list of answers to popular questions by fixing it in the main channels of the project's social networks.`

+ 57 - 0
council/kpi/Community_Feedback_Part_2.md

@@ -0,0 +1,57 @@
+## The first part of task
+
+| Questions for Jsgenesis                                                                                                                                                                                          |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| When will the information about the financing of the project (investors) appear?                                                                                                                                 |
+| How exactly is the project going to compete with top video platforms to attract content makers?<br>                                                                                                              |
+| Will there be a mobile version of Jetstream, is it possible to participate in its testing?                                                                                                                       |
+| What is the total number of people in FM? and will there be a reward for those participants who did not get into FM, but were active and received points?                                                        |
+| What immediate actions are planned, especially in particular Atlas?                                                                                                                                              |
+| What do you think about the fact that the community is divided into groups with different opinions that can negatively affect the development of DAO?                                                            |
+| Why do we need to sign each of our actions in the report if we confirm everything with a json file and the choice of our nickname?                                                                               |
+| Can the platform exist without validators? If not, why is their participation so low rated?<br>                                                                                                                  |
+| Is it possible to see a roadmap? (launching the main network/starting a marketing company, etc.)                                                                                                                 |
+| Most of the tokens of the main network will not be held by the majority of the community, does this pose a threat to the security of the project?                                                                |
+| It is almost impossible to get into the council without a steak, which is extremely difficult to get without being a consul. Don't you see a closed chain in this? If so, is it necessary to resolve this issue? |
+| Is it possible to extend the term of being in the position of consul?                                                                                                                                            |
+| First of all, the focus should be on the development of the platform, and not on its management, right? After all, the DAO must understand what they have to lead.                                               |
+| What is the final product you see? Plans for the next 3-5 years?                                                                                                                                                 |
+| What are the main steps you plan to take to facilitate user interaction with the final product of the ecosystem?                                                                                                 |
+| Are you planning to take part in the management of the platform after its launch? Have your own consuls?<br>                                                                                                     |
+| Tell us about the idea of creating a project and choosing its name?                                                                                                                                              |
+| Will additional working groups and new positions be created?                                                                                                                                                     |
+| 3 advantages of using the platform in your opinion?                                                                                                                                                              |
+| Will there be a squeeze on the ama session for those who could not attend?                                                                                                                                       |
+| How will the financing of the project continue in the future at the launch stage of the main network, at the expense of genesis or through the sale of tokens on the exchange?                                   |
+| Who will be responsible for the technical side of the main network and how will this work be paid?                                                                                                               |
+
+| Questions that is best answered in a video series                                                                                                |
+| ---------------------------------------------------------------------------------------------------------------- |
+| Presentation content is needed to attract new active newcomers, able to explain the main essence of the project. |
+| Is it possible to get detailed guides on active actions on the project for beginners?                            |
+| Explain the reason for the expansion of the council from 16 to 20 consuls?                                       |
+| Is it possible to have more activities for technical specialists?                                                |
+| How to get into FM? Way.                                                                                         |
+
+| Qustions for writing                                                                                                              |
+| --------------------------------------------------------------------------------------------------------------------------------- |
+| I would like to see a table with the number of FM points for a particular activity.                                               |
+| Are there any rewards for future channel owners for the number of views and subscribers?                                          |
+| Is it possible to develop some kind of mini-game to attract new participants for the project, allowing you to earn the first JOY? |
+| Is it possible to make a modern dashboard for beginners with active project tasks?                                                |
+| What are your plans to participate in vicious auctions?                                                                           |
+| Will a new analogue of the outdated forum be developed in the testnet?                                                            |
+
+## The second part of task
+
+We gathered all feedback from all surveys it's about 55 persons were taken part.
+We noticed that in this surveys the most of participants are active people in our community. 
+The big part of question who addressed questions to Jsgenesis. Also we'd like to add that more of questions were paraphrased for removing gramma mistakes , also we remove duplicate questions from table. To summarize up we can say that a lot of old and experience people of our project they are interested i question about DAO . 
+And newcomers worry about working with platform and education system in our materials.
+
+![info](https://user-images.githubusercontent.com/86792707/141291505-4aa24248-e74a-4fef-bac8-7d9dfb47b54d.jpg)
+
+## The third part of task
+
+This format is in the form of a google form allows to get competently feedback for needing questions and wishes , but we want to invite more people for this servey especially newcomers. 
+So survey-challenge with pleasant rewards (for instance for the best question to Jsgenesis) must help to increase coverage 

+ 52 - 0
council/kpi/KPI 29.II-5 - Research Boardroom.md

@@ -0,0 +1,52 @@
+## KPI 29.II-5 - Research Boardroom
+
+Purpose [Boardroom](https://app.boardroom.info/) is a website that showcases the governance side of a selection of DAO projects. Some of the projects put out a weekly update which is included in a newsletter, as well as contribute to a calendar which lists updates and proposals from projects. It would be interesting to know how Joystream could integrate with Boardroom.
+
+![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1")
+### Scope of Work
+
+#### Investigate Boardroom and write a report showing whether it is possible for Joystream to integrate with it.
+
+> I did a research on social media, documentation and support discord.
+Based on the data received, the conclusion is this: platform [Boardroom](https://app.boardroom.info/)
+Doesn't support Polkadot (Substrate)
+
+1. This must include what the process and/or requirements to be featured on the site
+
+> Integrations: [Link](https://docs.boardroom.info/adding-your-project/getting-started)
+
+2. If there is an application process, and how this looks like
+
+> Adding Your Project: [Link](https://docs.boardroom.info/adding-your-project/adding-your-project)
+
+3. Whether the Community can maintain this
+
+> No
+
+4. Any other any other relevant information, as well as Joystream's blockchain compatibility with the project.
+
+> We are not conscientious, basically all projects on the platform are based on ETH
+
+#### Are there any other Polkadot or Substrate based projects currently included on Boardroom? If yes, what are they?
+
+> As I wrote above, it does not support Polkadot or Substrate
+
+#### Are there any similar websites/platforms to Boardroom where the Joystream project could possibly be listed? These sites should similarly show proposals, newsletters and some governance information from the Joystream project alongside other projects.
+
+> Extensive research showed that with such functionality as in [Boardroom](https://app.boardroom.info/)
+Extensive research has shown that with functionality such as "displaying offers, newsletters and some management information" 
+There are no such platforms anymore. Ps. 
+There is a similar project, but I think it is too weak a version. [Snapshot](https://snapshot.org/#/)
+[Docs](https://docs.snapshot.org/)
+
+
+There is an interesting note, it looks like this project supports many networks. Including Moondeam.
+[Networks](https://snapshot.org/#/networks)
+
+
+
+
+
+
+
+> 

+ 44 - 0
council/kpi/KPI_29_II_5_Research_Boardroom.md

@@ -0,0 +1,44 @@
+## KPI 29.II-5 - Research Boardroom
+
+Purpose [Boardroom](https://app.boardroom.info/) is a website that showcases the governance side of a selection of DAO projects. Some of the projects put out a weekly update which is included in a newsletter, as well as contribute to a calendar which lists updates and proposals from projects. It would be interesting to know how Joystream could integrate with Boardroom.
+
+![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1")
+### Scope of Work
+
+#### Investigate Boardroom and write a report showing whether it is possible for Joystream to integrate with it.
+
+> I did a research on social media, documentation and support discord.
+Based on the data received, the conclusion is this: platform [Boardroom](https://app.boardroom.info/)
+Doesn't support Polkadot (Substrate)
+
+1. This must include what the process and/or requirements to be featured on the site
+
+> Integrations: [Link](https://docs.boardroom.info/adding-your-project/getting-started)
+
+2. If there is an application process, and how this looks like
+
+> Adding Your Project: [Link](https://docs.boardroom.info/adding-your-project/adding-your-project)
+
+3. Whether the Community can maintain this
+
+> No
+
+4. Any other any other relevant information, as well as Joystream's blockchain compatibility with the project.
+
+> We are not conscientious, basically all projects on the platform are based on ETH
+
+#### Are there any other Polkadot or Substrate based projects currently included on Boardroom? If yes, what are they?
+
+> As I wrote above, it does not support Polkadot or Substrate
+
+#### Are there any similar websites/platforms to Boardroom where the Joystream project could possibly be listed? These sites should similarly show proposals, newsletters and some governance information from the Joystream project alongside other projects.
+
+> Extensive research showed that with such functionality as in [Boardroom](https://app.boardroom.info/)
+Extensive research has shown that with functionality such as "displaying offers, newsletters and some management information" 
+There are no such platforms anymore. Ps. 
+There is a similar project, but I think it is too weak a version. [Snapshot](https://snapshot.org/#/)
+[Docs](https://docs.snapshot.org/)
+
+
+There is an interesting note, it looks like this project supports many networks. Including Moondeam.
+[Networks](https://snapshot.org/#/networks)

+ 39 - 0
council/kpi/KPI_Position_Analyst_Bounty.md

@@ -0,0 +1,39 @@
+`Notes: Idea has been created by @Ardashoff , @ZAZIK , @kadyrovs` 
+
+# Position: Analyst Bounty
+
+### Problem:
+- Repeated cases of delayed payment of funds to the Bounty participants, which were more connected due to a misunderstanding of the responsible persons. There have been cases of detentions of awards up to 3 weeks.
+- Difficulty in understanding the statistics of awards for the community.
+
+### Purpose:
+It is necessary to introduce the proposed position, appoint a responsible person from among the consuls with the appropriate skills. Key skills for accepting a consul:
+
+- At least 5 working terms in the council.
+- Experience with github.
+
+### Scope of work:
+- Creation of a channel branch discord / forum #analytic_channel for displaying and transmitting all the necessary information, as well as creating a separate wallet for future payments. The information will be forwarded to the person in charge.
+
+- Confirmation of the fixed rate of payments from "BM" for the payment of awards to the participants of the "Bounty", as well as the transfer of the table with the assessment so that the Analyst has the opportunity to analyze and compare with previous terms.This can help in an inflationary situation.
+
+- Placing information in the "PR document" and creating a "Proposal" for approval by the consuls. The specified document on the vote is completely correct if it is correctly drawn up in accordance with the steps indicated above and the statistics in it are correct.
+
+- Compilation of infographics on the current Bounty how payments vary from previous dates.
+
+- Requesting coins in accordance with the statistics of the document for a separately created wallet for payments to participants.
+
+- Payment of funds by Bounty participants.
+
+### Deadline:
+Since the work of the Bounty Analyst is directly related to the work of BM, I propose to set the time for submitting information to BM until Saturday. Thus, the consul will have 4 days to perform these duties.
+
+__Output:__
+
+~~This position will allow not only to remove cases of delay in payments, but also to collect statistics necessary to help maintain inflation.~~
+
+The introduction of this position will eliminate cases of delay in payments of funds, as well as increase the involvement of new community members in rewarded programs by collecting and submitting statistics in an open and understandable form for them.
+
+__Reward:__
+
+$ 150, subject to the fully completed scope of work.

File diff suppressed because it is too large
+ 60 - 69
council/kpi/sumer/26.I-5/draft_kpi_presentation.json


二進制
council/kpi/sumer/27.I-5/KPIs.bmpr


+ 44 - 0
council/kpi/sumer/27.OP-1/report.md

@@ -0,0 +1,44 @@
+# 27.OP-1 - Pioneer 2.0
+
+### Task 1
+
+Built the Pioneer 2 locally: https://i.imgur.com/bTJvg9e.png
+
+Wanted to point the local Pioneer 2 to Sumer RPC endpoint, but it appeared that Sumer and Olympia are incompatible in terms of data types. https://t.me/HydraDevs/1199
+
+Asked for tJOY for Olympia: https://discord.com/channels/811216481340751934/813361923172335648/901886950573764668
+
+
+Question: is there any way to develop Pioneer without the need to recompile the whole thing? It takes forever :)
+
+
+
+### Task 2
+
+
+Went through the [Contributions Guide](https://github.com/Joystream/pioneer/blob/main/CONTRIBUTING.md). Have one thing to suggest regarding the tests:
+
+> Write tests (when including business logic) or add a storyboook (when you're creating a new component).
+
+It would be beneficial to point to some how-to guide or example of how such tests should be structured. The rest of the document seems clear and common-sense.
+
+### Task 3
+
+Went through the "good first issues": https://github.com/Joystream/pioneer/labels/good%20first%20issue I think I found out how to fix the issue https://github.com/Joystream/pioneer/issues/1480 but need guidance on how to set up council and create WG openings in Pioneer 2. 
+
+
+Went through the [development README](https://github.com/Joystream/pioneer/blob/main/docs/README.md). One question I have is that do I need to run `joystream-node` locally or this is not required? 
+
+
+### Task 4 
+
+Honestly, I think the current Bounty process is a little heavyweight, so making community bounty out of each and every `Pioneer2` issue would probably be an overkill. Especially for smaller-sized tasks (and most "good-first" tickets are rather small.) My suggestion would be to triage all the issues which JSG doesn't plan to work on in the nearest future, and depending in their size and complexity (estimated in T-shirt sizes) decide whether to create Bounties for them or not. 
+
+To improve the presentation of the tickets, I suggest the following information to be added to the description:
+
+1. Exact steps to reproduce
+
+2. Expected result (behavior)
+
+3. Actual result 
+

+ 416 - 0
council/reports/sumer-reports/Sumer_Council27_Report_26_10_2021.md

@@ -0,0 +1,416 @@
+# Sumer - Council Election Round #30  - Performance Review and Minutes
+## 1 - Basic Information
+### 1.1 - Introduction
+The council is expected to produce reports during each round and provide feedback in the form of workflow, challenges, thinking and performance as well as minutes covering important events during the council session.
+
+Usernames referenced are Joystream usernames.
+All times are calculated based on 6.06 second blocktimes and not actual blocktimes.
+The Council Round number is taken from the chain, the KPI rounds have an offset number.
+
+### 1.2 - Council Round Overview
+* Council Election Round: #30
+* Council Term: 27
+* Start Block: #2782800
+* End Block: #2883600
+* Forum thread for round feedback: https://testnet.joystream.org/#/forum/threads/709
+
+### 1.3 - Council members & vote participation
+* All usernames are listed in the order given by `activeCouncil` from chain state.
+* Votes cast includes all types of vote (Approve, Reject, Abstain & Slash)
+* In the event a proposal is not finalized within the current council, it will be indicated and current council votes will not be recorded due to system limitations
+
+| Username             | Member ID | Prop. Votes Cast | CM Own Stake | CM Voter Stake |
+|----------------------|-----------|------------------|--------------|----------------|
+| @ilich | 2194 | 20 | 15,001,000 | 11,208,100 | 
+| @arseniy2706 | 1521 | 13 | 10,000 | 19,000,000 | 
+| @lkskrn | 644 | 17 | 1,111 | 18,000,000 | 
+| @blackmass | 361 | 17 | 25,000,000 | 0 | 
+| @joyval | 2141 | 1 | 22,000,000 | 3,100,000 | 
+| @okayko | 605 | 9 | 100,000 | 20,550,000 | 
+| @0x2bc | 2098 | 8 | 15,000,000 | 10,000,000 | 
+| @xfactorus | 635 | 24 | 18,000,000 | 0 | 
+| @svasilenko | 2096 | 23 | 7,800,000 | 10,010,100 | 
+| @nanapa6otaet | 2531 | 25 | 1,111 | 16,486,000 | 
+| @freakstatic_council | 321 | 17 | 26,000,000 | 0 | 
+| @chiffah | 2462 | 1 | 1,111,111 | 24,100,000 | 
+| @tomato | 2 | 2 | 20,000,000 | 100,000 | 
+| @kalpakci | 2137 | 7 | 20,100,000 | 5,100,000 | 
+| @laura | 2329 | 24 | 25,000,000 | 100 | 
+| @ururu | 790 | 25 | 16,001,000 | 150,000 | 
+| @igrex | 1048 | 25 | 20,000,000 | 3,000,000 | 
+| @alenleps | 2682 | 26 | 3,000,000 | 24,000,000 | 
+| @isonar | 2182 | 15 | 20,000,000 | 0 | 
+| @marat_mu | 2154 | 14 | 13,500,000 | 6,500,000 | 
+| | | Subtotal: | 267,625,333 | 171,304,300 |
+| | | Total: | 438,929,633 |  |
+
+
+### 1.4 - Council Roles
+* Council Secretary
+    * @laura
+* Council Deputy Secretary
+    * @ilich
+
+### 1.5 - Council Mint & Budget Status
+* Start minted: 781,151,882
+* End minted: 819,137,970
+* Total minted during council round: 37986088 tokens (+4.86% from start)
+
+* Budget proposal link: https://testnet.joystream.org/#/proposals/576
+* Budget forum link: not created
+
+(Note: The council budget is now based on the rewards for roles, council payments and validator payments. Jsgenesis decides how much to set the mint to.)
+
+## 2 - Minutes
+### 2.1 - Proposal Overview
+Proposal Types
+- 30 Proposals Created
+    - 20 Text Proposals
+    - 6 Spending Proposals
+    - 0 SetWorkingGroupLeaderReward Proposals
+    - 4 SetWorkingGroupMintCapacity Proposals
+    - 0 BeginReviewWorkingGroupLeaderApplication Proposals
+    - 0 TerminateWorkingGroupLeaderRole
+    - 0 FillWorkingGroupLeaderOpening
+    - 0 SetValidatorCount
+    - 0 AddWorkingGroupLeaderOpening
+    - 0 SetElectionParameters
+    - 0 RuntimeUpgrade
+
+Proposal States
+- 22 Approved & executed proposals
+- 5 Canceled proposals
+- 0 Rejected proposals
+- 0 Slashed proposals
+- 1 Expired proposals
+- 2 proposals passed to next council
+    - These proposals didn't gather enough quorum in the current council term, so the votes are reset and passed to the next council.
+
+Failed Proposals
+- 0 NotEnoughCapacity failures
+- 0 ExecutionFailed
+
+- Total time for proposals to finalize: 531.42 hours
+- Average time for proposals to finalize: 23.11 hours
+    - This average is calculated from all proposals, including expired proposals but excluding canceled proposals.
+
+### 2.2 - Proposal Breakdown
+
+#### Proposal 703 - 27.I-3 - Deputy Council Secretary
+- Proposal Link: https://testnet.joystream.org/#/proposals/703
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 6865 blocks (11.56h)
+- Created by: @ilich
+- Participants: @igrex, @svasilenko, @alenleps, @kalpakci, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @ilich, @laura, @freakstatic_council, @tomato
+
+#### Proposal 704 - 27.I-2 - Council Secretary
+- Proposal Link: https://testnet.joystream.org/#/proposals/704
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 6690 blocks (11.27h)
+- Created by: @laura
+- Participants: @igrex, @arseniy2706, @svasilenko, @alenleps, @kalpakci, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @ilich, @laura, @tomato
+
+#### Proposal 705 - Bounty 24 Payment (1 week, relaunched)
+- Proposal Link: https://testnet.joystream.org/#/proposals/705
+- Proposal Type: Spending
+	- Amount: 5350911
+	- Destination member: arseniy2706
+- Status: Canceled
+- Created by: @arseniy2706
+- Participants: @igrex, @svasilenko, @alenleps, @kalpakci, @lkskrn, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @laura, @freakstatic_council
+
+#### Proposal 706 - Bounty 24 Payment (2 week, relaunched)
+- Proposal Link: https://testnet.joystream.org/#/proposals/706
+- Proposal Type: Spending
+	- Amount: 12524324
+	- Destination member: arseniy2706
+- Status: Canceled
+- Created by: @arseniy2706
+- Participants: @igrex, @svasilenko, @alenleps, @kalpakci, @lkskrn, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @laura, @freakstatic_council
+
+#### Proposal 707 - Bounty 24 Payment (3 week )
+- Proposal Link: https://testnet.joystream.org/#/proposals/707
+- Proposal Type: Spending
+	- Amount: 10546723
+	- Destination member: arseniy2706
+- Status: Approved & Executed
+	- Time to finalize: 7413 blocks (12.48h)
+- Created by: @arseniy2706
+- Participants: @igrex, @svasilenko, @alenleps, @kalpakci, @lkskrn, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @ilich, @laura, @freakstatic_council
+
+#### Proposal 708 - Sumer - KPI 27.I-2 - Council Secretary
+- Proposal Link: https://testnet.joystream.org/#/proposals/708
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Canceled
+- Created by: @tomato
+- Participants: @svasilenko
+
+#### Proposal 709 - To fire current BM of Bounty 24
+- Proposal Link: https://testnet.joystream.org/#/proposals/709
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Canceled
+- Created by: @svasilenko
+- Participants: @igrex, @alenleps, @nanapa6otaet
+
+#### Proposal 710 - Refill Storage Mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/710
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 14119 blocks (23.78h)
+- Created by: @0x2bc
+- Participants: @igrex, @svasilenko, @alenleps, @okayko, @lkskrn, @ururu, @nanapa6otaet, @xfactorus, @ilich, @laura, @chiffah, @freakstatic_council
+
+#### Proposal 711 - Warning to the current BM of bounty 24
+- Proposal Link: https://testnet.joystream.org/#/proposals/711
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Expired
+	- Time to finalize: 72000 blocks (121.26h)
+- Created by: @svasilenko
+- Participants: @arseniy2706, @isonar, @svasilenko, @alenleps, @marat_mu, @okayko, @lkskrn, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @0x2bc, @ilich, @laura, @freakstatic_council
+
+#### Proposal 712 - New manager of "Sprocket - JSLogo"
+- Proposal Link: https://testnet.joystream.org/#/proposals/712
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 10839 blocks (18.25h)
+- Created by: @ilich
+- Participants: @igrex, @isonar, @alenleps, @kalpakci, @marat_mu, @lkskrn, @ururu, @nanapa6otaet, @xfactorus, @ilich, @laura, @freakstatic_council
+
+#### Proposal 713 - Refill Operations Mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/713
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 7595 blocks (12.79h)
+- Created by: @lkskrn
+- Participants: @igrex, @arseniy2706, @isonar, @svasilenko, @alenleps, @marat_mu, @lkskrn, @nanapa6otaet, @xfactorus, @0x2bc, @ilich, @laura
+
+#### Proposal 714 - KPI: restart Update Membership Profiles
+- Proposal Link: https://testnet.joystream.org/#/proposals/714
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 5833 blocks (9.82h)
+- Created by: @ururu
+- Participants: @igrex, @arseniy2706, @isonar, @svasilenko, @alenleps, @marat_mu, @ururu, @xfactorus, @0x2bc, @ilich, @laura, @freakstatic_council
+
+#### Proposal 715 - Tokenomics Report Round 26
+- Proposal Link: https://testnet.joystream.org/#/proposals/715
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 9016 blocks (15.18h)
+- Created by: @l1dev
+- Participants: @igrex, @isonar, @alenleps, @okayko, @lkskrn, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @ilich, @laura, @freakstatic_council
+
+#### Proposal 716 - 26.I-4 - Council Minutes
+- Proposal Link: https://testnet.joystream.org/#/proposals/716
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 8887 blocks (14.97h)
+- Created by: @ilich
+- Participants: @igrex, @svasilenko, @alenleps, @okayko, @lkskrn, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @0x2bc, @ilich, @laura
+
+#### Proposal 717 - Community Repo: Move some folders
+- Proposal Link: https://testnet.joystream.org/#/proposals/717
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 8484 blocks (14.29h)
+- Created by: @l1dev
+- Participants: @igrex, @arseniy2706, @isonar, @svasilenko, @alenleps, @okayko, @ururu, @blackmass, @nanapa6otaet, @ilich, @laura, @freakstatic_council
+
+#### Proposal 718 - Optimizing KPI "Community feedback"
+- Proposal Link: https://testnet.joystream.org/#/proposals/718
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 42376 blocks (71.37h)
+- Created by: @marat_mu
+- Participants: @arseniy2706, @isonar, @svasilenko, @alenleps, @okayko, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @0x2bc, @ilich, @freakstatic_council
+
+#### Proposal 719 - Re: Update Tokenomics Reports
+- Proposal Link: https://testnet.joystream.org/#/proposals/719
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 23664 blocks (39.85h)
+- Created by: @l1dev
+- Participants: @igrex, @svasilenko, @alenleps, @marat_mu, @okayko, @lkskrn, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @laura, @freakstatic_council
+
+#### Proposal 720 - 26.II-3 - Council Term Summary Videos
+- Proposal Link: https://testnet.joystream.org/#/proposals/720
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 9559 blocks (16.10h)
+- Created by: @laura
+- Participants: @igrex, @isonar, @svasilenko, @alenleps, @marat_mu, @lkskrn, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @ilich, @laura
+
+#### Proposal 721 - Mint Content Working Group
+- Proposal Link: https://testnet.joystream.org/#/proposals/721
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 4801 blocks (8.09h)
+- Created by: @zazik
+- Participants: @igrex, @arseniy2706, @svasilenko, @alenleps, @marat_mu, @lkskrn, @ururu, @blackmass, @xfactorus, @ilich, @laura, @freakstatic_council
+
+#### Proposal 722 - Refill Operations WG Mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/722
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 10662 blocks (17.96h)
+- Created by: @lkskrn
+- Participants: @igrex, @arseniy2706, @isonar, @svasilenko, @alenleps, @marat_mu, @lkskrn, @ururu, @blackmass, @nanapa6otaet, @ilich, @laura
+
+#### Proposal 723 - 26.II-3 - Council Term Summary Videos
+- Proposal Link: https://testnet.joystream.org/#/proposals/723
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 9499 blocks (16.00h)
+- Created by: @marat_mu
+- Participants: @igrex, @arseniy2706, @svasilenko, @alenleps, @marat_mu, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @ilich, @laura, @freakstatic_council
+
+#### Proposal 724 - Add draft for kpi presentation
+- Proposal Link: https://testnet.joystream.org/#/proposals/724
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 9965 blocks (16.78h)
+- Created by: @svasilenko
+- Participants: @igrex, @arseniy2706, @isonar, @svasilenko, @alenleps, @marat_mu, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @ilich, @laura
+
+#### Proposal 725 - Video editing Tools on Windows KPI27.CC
+- Proposal Link: https://testnet.joystream.org/#/proposals/725
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Canceled
+- Created by: @igrex
+- Participants: @igrex, @isonar, @alenleps, @marat_mu, @ururu, @nanapa6otaet, @xfactorus, @laura
+
+#### Proposal 726 - Bounty 24 Payment (4th week )
+- Proposal Link: https://testnet.joystream.org/#/proposals/726
+- Proposal Type: Spending
+	- Amount: 12341270
+- Status: Approved & Executed
+	- Time to finalize: 11082 blocks (18.66h)
+- Created by: @arseniy2706
+- Participants: @igrex, @arseniy2706, @isonar, @svasilenko, @alenleps, @okayko, @lkskrn, @ururu, @nanapa6otaet, @xfactorus, @0x2bc, @laura
+
+#### Proposal 727 - Payment Bounty 18
+- Proposal Link: https://testnet.joystream.org/#/proposals/727
+- Proposal Type: Spending
+	- Amount: 10238095
+- Status: Approved & Executed
+	- Time to finalize: 11662 blocks (19.64h)
+- Created by: @joydiesel
+- Participants: @igrex, @arseniy2706, @isonar, @svasilenko, @marat_mu, @okayko, @ururu, @nanapa6otaet, @xfactorus, @ilich, @laura, @freakstatic_council
+
+#### Proposal 728 - KPI 27.II-3 Minting and Burning - Part 2
+- Proposal Link: https://testnet.joystream.org/#/proposals/728
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 10746 blocks (18.10h)
+- Created by: @lkskrn
+- Participants: @igrex, @isonar, @alenleps, @kalpakci, @marat_mu, @lkskrn, @ururu, @nanapa6otaet, @xfactorus, @0x2bc, @freakstatic_council, @joyval
+
+#### Proposal 729 - Weekly Curator Working Group Report 27
+- Proposal Link: https://testnet.joystream.org/#/proposals/729
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 9231 blocks (15.55h)
+- Created by: @zazik
+- Participants: @igrex, @isonar, @svasilenko, @alenleps, @lkskrn, @ururu, @nanapa6otaet, @xfactorus, @0x2bc, @ilich, @laura, @freakstatic_council
+
+#### Proposal 730 - Weekly Storage WG Report 20
+- Proposal Link: https://testnet.joystream.org/#/proposals/730
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 4554 blocks (7.67h)
+- Created by: @0x2bc
+- Participants: @igrex, @arseniy2706, @svasilenko, @alenleps, @marat_mu, @lkskrn, @ururu, @blackmass, @nanapa6otaet, @xfactorus, @ilich, @laura
+
+#### Proposal 731 - Closing Bounty №26
+- Proposal Link: https://testnet.joystream.org/#/proposals/731
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Passed to next council
+- Created by: @marat_mu
+- Participants: 
+
+#### Proposal 732 - Curator Lead OKR rewards
+- Proposal Link: https://testnet.joystream.org/#/proposals/732
+- Proposal Type: Spending
+	- Amount: 2317497
+	- Destination member: laura
+- Status: Passed to next council
+- Created by: @ilich
+- Participants: 
+
+### 2.4 - Select threads & events
+N/A
+
+### 2.5 - Working Group Spotchecks
+- Storage Role Spot Check: N/A
+- Curator Role Spot Check: N/A
+- Operations Role Spot Check: N/A
+
+## 3 - Review
+### 3.1 - Workflow, Performance, Challenged & Thinking
+* N/A
+
+## 4 - Obligations
+Council obligations are payments or items that carry through council sessions. These are noted so that future councils can easily see what items they should be aware of. Items can be removed from here once they have been resolved or become outdated.
+
+### 4.1 Current Documents / Processes
+- Council Report
+    - Each council should produce a report which highlights important events, council participation, mint spending and other important facts surrounding the council term
+- Council Budget
+    - This is a proposal which tries to guide how many tokens the current council may have available to it during a term. This is a non binding proposal, so is mainly used as a guide for now.
+
+### 4.2 Regular Payments / Proposals
+- Council Mint
+    - The council mint needs to be checked on a regular basis and in the event it is near depletion, a council member should notify a member of Jsgenesis in order for it to be refilled.
+    - The council mint is set at a value decided by Jsgenesis.
+- Council Roles
+    - Council Secretary
+        - This role was introduced in Council Round #18 and the payments are now managed by KPI rewards.
+- Content Curator Mint
+    - The Content Curator Mint currently has a maximum value of 5 million tokens.
+    - The Content Curator Mint has to be filled periodically and the agreed amount was discussed earlier. The amount may change in the future, but the rewards for this role are dependent on the council passing these proposals in a timely fashion.
+    - The Content Curator Lead role is expected to keep track of their mint level and any member of the Joystream platform can create a proposal to refill this mint.
+- Storage Mint
+    - The Storage Mint currently has a maximum value of 5 million tokens.
+    - This mint has be refilled periodically
+    - The Storage Lead role is expected to keep track of their mint level and any member of the Joystream platform can create a proposal to refill this mint.
+
+### 4.2 Bounties
+- Bounties are shown on the forum Bounties section: https://testnet.joystream.org/#/forum/categories/10
+
+## 5 - Report changelog
+- 04.11.2020
+    - added working group review section
+
+- 22.10.2020
+    - updated budget section to reflect nature of new budget system
+    - updated events to be threads & events
+
+- 14.09.2020
+    - removed member addresses and replaced with member IDs since they take less space
+    - added realized and unrealized spending\

+ 398 - 0
council/reports/sumer-reports/Sumer_Council28_Report_02_11_2021.md

@@ -0,0 +1,398 @@
+# Sumer - Council Election Round #31  - Performance Review and Minutes
+## 1 - Basic Information
+### 1.1 - Introduction
+The council is expected to produce reports during each round and provide feedback in the form of workflow, challenges, thinking and performance as well as minutes covering important events during the council session.
+
+Usernames referenced are Joystream usernames.
+All times are calculated based on 6.12 second blocktimes and not actual blocktimes.
+The Council Round number is taken from the chain, the KPI rounds have an offset number.
+
+### 1.2 - Council Round Overview
+* Council Election Round: #31
+* Council Term: 28
+* Start Block: #2883600
+* End Block: #2984400
+* Forum thread for round feedback: https://testnet.joystream.org/#/forum/threads/727
+
+### 1.3 - Council members & vote participation
+* All usernames are listed in the order given by `activeCouncil` from chain state.
+* Votes cast includes all types of vote (Approve, Reject, Abstain & Slash)
+* In the event a proposal is not finalized within the current council, it will be indicated and current council votes will not be recorded due to system limitations
+
+| Username             | Member ID | Prop. Votes Cast | CM Own Stake | CM Voter Stake |
+|----------------------|-----------|------------------|--------------|----------------|
+| @ilich | 2194 | 21 | 15,001,000 | 8,000,000 | 
+| @anastasiiahurina | 2346 | 12 | 1,000 | 24,110,000 | 
+| @godshunter | 1541 | 19 | 10,600,000 | 7,600,000 | 
+| @arseniy2706 | 1521 | 11 | 3,000,000 | 19,949,357 | 
+| @lkskrn | 644 | 18 | 12,345 | 18,000,000 | 
+| @blackmass | 361 | 7 | 25,000,000 | 0 | 
+| @nanapa6otaet | 2531 | 17 | 1,111 | 19,500,000 | 
+| @ardashoff | 2697 | 11 | 1,300 | 20,000,000 | 
+| @nkhlghbl | 1962 | 21 | 25,000,000 | 0 | 
+| @freakstatic_council | 321 | 21 | 25,000,000 | 0 | 
+| @leet_joy | 957 | 4 | 21,000,000 | 0 | 
+| @kadyrovs | 1345 | 19 | 5,000,000 | 15,195,100 | 
+| @tomato | 2 | 1 | 20,000,000 | 100,200 | 
+| @kalpakci | 2137 | 0 | 20,010,000 | 4,001,000 | 
+| @laura | 2329 | 19 | 25,000,000 | 15,000 | 
+| @sparky | 319 | 0 | 25,000,000 | 0 | 
+| @igrex | 1048 | 22 | 14,000,000 | 7,000,000 | 
+| @joydiesel | 2276 | 7 | 2,500,000 | 33,007,000 | 
+| @hayabusa | 582 | 22 | 1,000 | 18,660,000 | 
+| @marat_mu | 2154 | 18 | 13,500,000 | 6,500,000 | 
+| | | Subtotal: | 249,627,756 | 201,637,657 |
+| | | Total: | 451,265,413 |  |
+
+
+### 1.4 - Council Roles
+* Council Secretary
+    * @laura
+* Council Deputy Secretary
+    * @ilich
+
+### 1.5 - Council Mint & Budget Status
+* Start minted: 819,137,970
+* End minted: 840,716,034
+* Total minted during council round: 21578064 tokens (+2.63% from start)
+
+* Budget proposal link: https://testnet.joystream.org/#/proposals/576
+* Budget forum link: not created
+
+(Note: The council budget is now based on the rewards for roles, council payments and validator payments. Jsgenesis decides how much to set the mint to.)
+
+## 2 - Minutes
+### 2.1 - Proposal Overview
+Proposal Types
+- 28 Proposals Created
+    - 17 Text Proposals
+    - 5 Spending Proposals
+    - 0 SetWorkingGroupLeaderReward Proposals
+    - 6 SetWorkingGroupMintCapacity Proposals
+    - 0 BeginReviewWorkingGroupLeaderApplication Proposals
+    - 0 TerminateWorkingGroupLeaderRole
+    - 0 FillWorkingGroupLeaderOpening
+    - 0 SetValidatorCount
+    - 0 AddWorkingGroupLeaderOpening
+    - 0 SetElectionParameters
+    - 0 RuntimeUpgrade
+
+Proposal States
+- 22 Approved & executed proposals
+- 1 Canceled proposals
+- 0 Rejected proposals
+- 0 Slashed proposals
+- 1 Expired proposals
+- 4 proposals passed to next council
+    - These proposals didn't gather enough quorum in the current council term, so the votes are reset and passed to the next council.
+
+Failed Proposals
+- 0 NotEnoughCapacity failures
+- 0 ExecutionFailed
+
+- Total time for proposals to finalize: 606.37 hours
+- Average time for proposals to finalize: 26.36 hours
+    - This average is calculated from all proposals, including expired proposals but excluding canceled proposals.
+
+### 2.2 - Proposal Breakdown
+
+#### Proposal 733 - KPI 27.I-5 - KPI Presentation - Balsamiq
+- Proposal Link: https://testnet.joystream.org/#/proposals/733
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 61517 blocks (104.65h)
+- Created by: @isonar
+- Participants: @igrex, @nkhlghbl, @marat_mu, @lkskrn, @blackmass, @anastasiiahurina, @nanapa6otaet, @ilich, @freakstatic_council, @hayabusa, @godshunter, @tomato
+
+#### Proposal 734 - Atlas Stories
+- Proposal Link: https://testnet.joystream.org/#/proposals/734
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Expired
+	- Time to finalize: 72000 blocks (122.48h)
+- Created by: @sevenup
+- Participants: @nkhlghbl, @anastasiiahurina, @nanapa6otaet, @laura, @freakstatic_council, @godshunter
+
+#### Proposal 735 - OKR Reward for Content Curator
+- Proposal Link: https://testnet.joystream.org/#/proposals/735
+- Proposal Type: Spending
+	- Amount: 2519379
+- Status: Approved & Executed
+	- Time to finalize: 6619 blocks (11.26h)
+- Created by: @laura
+- Participants: @igrex, @kadyrovs, @marat_mu, @lkskrn, @anastasiiahurina, @nanapa6otaet, @ilich, @laura, @freakstatic_council, @hayabusa, @godshunter, @ardashoff
+
+#### Proposal 736 - Refill Operations Mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/736
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 4541 blocks (7.72h)
+- Created by: @lkskrn
+- Participants: @igrex, @kadyrovs, @nkhlghbl, @marat_mu, @lkskrn, @anastasiiahurina, @nanapa6otaet, @ilich, @laura, @freakstatic_council, @hayabusa, @ardashoff
+
+#### Proposal 737 - 27.I-4 - Council Minutes
+- Proposal Link: https://testnet.joystream.org/#/proposals/737
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 14709 blocks (25.02h)
+- Created by: @ilich
+- Participants: @igrex, @nkhlghbl, @marat_mu, @lkskrn, @joydiesel, @blackmass, @anastasiiahurina, @nanapa6otaet, @ilich, @freakstatic_council, @hayabusa, @godshunter
+
+#### Proposal 738 - 28.I-2 - Council Secretary
+- Proposal Link: https://testnet.joystream.org/#/proposals/738
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 10762 blocks (18.31h)
+- Created by: @laura
+- Participants: @igrex, @kadyrovs, @nkhlghbl, @joydiesel, @blackmass, @anastasiiahurina, @nanapa6otaet, @ilich, @freakstatic_council, @hayabusa, @godshunter, @ardashoff
+
+#### Proposal 739 - 28.I-3 - Deputy Council Secretary
+- Proposal Link: https://testnet.joystream.org/#/proposals/739
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 11929 blocks (20.29h)
+- Created by: @ilich
+- Participants: @igrex, @kadyrovs, @nkhlghbl, @lkskrn, @joydiesel, @blackmass, @anastasiiahurina, @nanapa6otaet, @ilich, @laura, @freakstatic_council, @hayabusa
+
+#### Proposal 740 - Mint Content Working Group
+- Proposal Link: https://testnet.joystream.org/#/proposals/740
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 5589 blocks (9.51h)
+- Created by: @zazik
+- Participants: @igrex, @leet_joy, @kadyrovs, @nkhlghbl, @lkskrn, @anastasiiahurina, @nanapa6otaet, @ilich, @laura, @freakstatic_council, @hayabusa, @godshunter
+
+#### Proposal 741 - 27.CC-1 - Free Editing Tools 
+- Proposal Link: https://testnet.joystream.org/#/proposals/741
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 5863 blocks (9.97h)
+- Created by: @laura
+- Participants: @igrex, @leet_joy, @kadyrovs, @nkhlghbl, @marat_mu, @lkskrn, @anastasiiahurina, @nanapa6otaet, @ilich, @laura, @hayabusa, @godshunter
+
+#### Proposal 742 - Report KPI Free Editing Tools on Windows
+- Proposal Link: https://testnet.joystream.org/#/proposals/742
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 2813 blocks (4.79h)
+- Created by: @igrex
+- Participants: @igrex, @leet_joy, @kadyrovs, @nkhlghbl, @marat_mu, @lkskrn, @anastasiiahurina, @ilich, @laura, @freakstatic_council, @hayabusa, @godshunter
+
+#### Proposal 743 - JSG request for official bounty status
+- Proposal Link: https://testnet.joystream.org/#/proposals/743
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 5817 blocks (9.90h)
+- Created by: @hayabusa
+- Participants: @igrex, @leet_joy, @arseniy2706, @kadyrovs, @nkhlghbl, @marat_mu, @lkskrn, @joydiesel, @anastasiiahurina, @nanapa6otaet, @ilich, @hayabusa
+
+#### Proposal 744 - Operations Reports
+- Proposal Link: https://testnet.joystream.org/#/proposals/744
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 11713 blocks (19.92h)
+- Created by: @l1dev
+- Participants: @igrex, @arseniy2706, @kadyrovs, @nkhlghbl, @lkskrn, @anastasiiahurina, @nanapa6otaet, @ilich, @laura, @freakstatic_council, @hayabusa, @godshunter
+
+#### Proposal 745 - 27.II-4 - Council Term Summary Videos
+- Proposal Link: https://testnet.joystream.org/#/proposals/745
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 9505 blocks (16.17h)
+- Created by: @marat_mu
+- Participants: @igrex, @kadyrovs, @marat_mu, @lkskrn, @joydiesel, @blackmass, @nanapa6otaet, @ilich, @laura, @freakstatic_council, @hayabusa, @godshunter
+
+#### Proposal 746 - 27.II-4 - Council Term Summary Videos
+- Proposal Link: https://testnet.joystream.org/#/proposals/746
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 19762 blocks (33.62h)
+- Created by: @laura
+- Participants: @igrex, @arseniy2706, @kadyrovs, @nkhlghbl, @marat_mu, @lkskrn, @blackmass, @ilich, @laura, @freakstatic_council, @hayabusa, @godshunter
+
+#### Proposal 747 - 27.II-4 - Council Term Summary Videos 
+- Proposal Link: https://testnet.joystream.org/#/proposals/747
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 16239 blocks (27.62h)
+- Created by: @igrex
+- Participants: @igrex, @arseniy2706, @kadyrovs, @nkhlghbl, @marat_mu, @joydiesel, @blackmass, @ilich, @laura, @freakstatic_council, @hayabusa, @godshunter
+
+#### Proposal 748 - Update draft_kpi_presentation.json
+- Proposal Link: https://testnet.joystream.org/#/proposals/748
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 19141 blocks (32.56h)
+- Created by: @svasilenko
+- Participants: @igrex, @arseniy2706, @kadyrovs, @nkhlghbl, @marat_mu, @lkskrn, @ilich, @laura, @freakstatic_council, @hayabusa, @godshunter, @ardashoff
+
+#### Proposal 749 - 27.II-4 - Council Term Summary Videos
+- Proposal Link: https://testnet.joystream.org/#/proposals/749
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 16844 blocks (28.65h)
+- Created by: @alenleps
+- Participants: @igrex, @arseniy2706, @kadyrovs, @nkhlghbl, @marat_mu, @lkskrn, @ilich, @laura, @freakstatic_council, @hayabusa, @godshunter, @ardashoff
+
+#### Proposal 750 - Refill operations mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/750
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 22305 blocks (37.94h)
+- Created by: @lkskrn
+- Participants: @igrex, @arseniy2706, @nkhlghbl, @marat_mu, @lkskrn, @nanapa6otaet, @ilich, @laura, @freakstatic_council, @hayabusa, @godshunter, @ardashoff
+
+#### Proposal 751 - Fill Working Group Mint Capacity
+- Proposal Link: https://testnet.joystream.org/#/proposals/751
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 11294 blocks (19.21h)
+- Created by: @igrex
+- Participants: @igrex, @arseniy2706, @kadyrovs, @nkhlghbl, @marat_mu, @lkskrn, @ilich, @laura, @freakstatic_council, @hayabusa, @godshunter, @ardashoff
+
+#### Proposal 752 - Bounty 24. Payments (5-th week). 
+- Proposal Link: https://testnet.joystream.org/#/proposals/752
+- Proposal Type: Spending
+	- Amount: 11881188
+- Status: Approved & Executed
+	- Time to finalize: 3633 blocks (6.18h)
+- Created by: @arseniy2706
+- Participants: @igrex, @arseniy2706, @kadyrovs, @nkhlghbl, @marat_mu, @lkskrn, @nanapa6otaet, @ilich, @laura, @freakstatic_council, @hayabusa, @ardashoff
+
+#### Proposal 753 - Add some rules to the current bounties
+- Proposal Link: https://testnet.joystream.org/#/proposals/753
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Passed to next council
+- Created by: @svasilenko
+- Participants: 
+
+#### Proposal 754 - Payment Bounty 18
+- Proposal Link: https://testnet.joystream.org/#/proposals/754
+- Proposal Type: Spending
+	- Amount: 9440000
+- Status: Passed to next council
+- Created by: @joydiesel
+- Participants: 
+
+#### Proposal 755 - Weekly Curator Working Group Report 28
+- Proposal Link: https://testnet.joystream.org/#/proposals/755
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 11890 blocks (20.23h)
+- Created by: @zazik
+- Participants: @igrex, @kadyrovs, @nkhlghbl, @marat_mu, @lkskrn, @nanapa6otaet, @ilich, @laura, @freakstatic_council, @hayabusa, @godshunter, @ardashoff
+
+#### Proposal 756 - Refill operations mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/756
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Passed to next council
+- Created by: @l1dev
+- Participants: 
+
+#### Proposal 757 - Mint Content Working Group
+- Proposal Link: https://testnet.joystream.org/#/proposals/757
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 6175 blocks (10.50h)
+- Created by: @zazik
+- Participants: @igrex, @arseniy2706, @kadyrovs, @nkhlghbl, @marat_mu, @nanapa6otaet, @ilich, @laura, @freakstatic_council, @hayabusa, @godshunter, @ardashoff
+
+#### Proposal 758 - Completed KPI Community Feedback
+- Proposal Link: https://testnet.joystream.org/#/proposals/758
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 5800 blocks (9.87h)
+- Created by: @ardashoff
+- Participants: @igrex, @arseniy2706, @kadyrovs, @nkhlghbl, @marat_mu, @joydiesel, @nanapa6otaet, @laura, @freakstatic_council, @hayabusa, @godshunter, @ardashoff
+
+#### Proposal 759 - Bounty 21 - Spanish Translation
+- Proposal Link: https://testnet.joystream.org/#/proposals/759
+- Proposal Type: Spending
+	- Amount: 19379845
+	- Destination member: strowdeath
+- Status: Canceled
+- Created by: @freakstatic_council
+- Participants: 
+
+#### Proposal 760 - Bounty 21 - Spanish Translation
+- Proposal Link: https://testnet.joystream.org/#/proposals/760
+- Proposal Type: Spending
+	- Amount: 19379845
+	- Destination member: strowdeath
+- Status: Passed to next council
+- Created by: @freakstatic_council
+- Participants: 
+
+### 2.4 - Select threads & events
+N/A
+
+### 2.5 - Working Group Spotchecks
+- Storage Role Spot Check: N/A
+- Curator Role Spot Check: N/A
+- Operations Role Spot Check: N/A
+
+## 3 - Review
+### 3.1 - Workflow, Performance, Challenged & Thinking
+* N/A
+
+## 4 - Obligations
+Council obligations are payments or items that carry through council sessions. These are noted so that future councils can easily see what items they should be aware of. Items can be removed from here once they have been resolved or become outdated.
+
+### 4.1 Current Documents / Processes
+- Council Report
+    - Each council should produce a report which highlights important events, council participation, mint spending and other important facts surrounding the council term
+- Council Budget
+    - This is a proposal which tries to guide how many tokens the current council may have available to it during a term. This is a non binding proposal, so is mainly used as a guide for now.
+
+### 4.2 Regular Payments / Proposals
+- Council Mint
+    - The council mint needs to be checked on a regular basis and in the event it is near depletion, a council member should notify a member of Jsgenesis in order for it to be refilled.
+    - The council mint is set at a value decided by Jsgenesis.
+- Council Roles
+    - Council Secretary
+        - This role was introduced in Council Round #18 and the payments are now managed by KPI rewards.
+- Content Curator Mint
+    - The Content Curator Mint currently has a maximum value of 5 million tokens.
+    - The Content Curator Mint has to be filled periodically and the agreed amount was discussed earlier. The amount may change in the future, but the rewards for this role are dependent on the council passing these proposals in a timely fashion.
+    - The Content Curator Lead role is expected to keep track of their mint level and any member of the Joystream platform can create a proposal to refill this mint.
+- Storage Mint
+    - The Storage Mint currently has a maximum value of 5 million tokens.
+    - This mint has be refilled periodically
+    - The Storage Lead role is expected to keep track of their mint level and any member of the Joystream platform can create a proposal to refill this mint.
+
+### 4.2 Bounties
+- Bounties are shown on the forum Bounties section: https://testnet.joystream.org/#/forum/categories/10
+
+## 5 - Report changelog
+- 04.11.2020
+    - added working group review section
+
+- 22.10.2020
+    - updated budget section to reflect nature of new budget system
+    - updated events to be threads & events
+
+- 14.09.2020
+    - removed member addresses and replaced with member IDs since they take less space
+    - added realized and unrealized spending\

+ 373 - 0
council/reports/sumer-reports/Sumer_Council29_Report_09_11_2021.md

@@ -0,0 +1,373 @@
+# Sumer - Council Election Round #32  - Performance Review and Minutes
+## 1 - Basic Information
+### 1.1 - Introduction
+The council is expected to produce reports during each round and provide feedback in the form of workflow, challenges, thinking and performance as well as minutes covering important events during the council session.
+
+Usernames referenced are Joystream usernames.
+All times are calculated based on 6.18 second blocktimes and not actual blocktimes.
+The Council Round number is taken from the chain, the KPI rounds have an offset number.
+
+### 1.2 - Council Round Overview
+* Council Election Round: #32
+* Council Term: 29
+* Start Block: #2984400
+* End Block: #3085200
+* Forum thread for round feedback: https://testnet.joystream.org/#/forum/threads/741
+
+### 1.3 - Council members & vote participation
+* All usernames are listed in the order given by `activeCouncil` from chain state.
+* Votes cast includes all types of vote (Approve, Reject, Abstain & Slash)
+* In the event a proposal is not finalized within the current council, it will be indicated and current council votes will not be recorded due to system limitations
+
+| Username             | Member ID | Prop. Votes Cast | CM Own Stake | CM Voter Stake |
+|----------------------|-----------|------------------|--------------|----------------|
+| @kate_fm | 1905 | 12 | 13,000,000 | 25,000,000 | 
+| @ilich | 2194 | 18 | 15,001,000 | 14,000,000 | 
+| @arseniy2706 | 1521 | 3 | 1,900,000 | 26,000,000 | 
+| @lkskrn | 644 | 9 | 6,666 | 28,000,000 | 
+| @blackmass | 361 | 8 | 25,000,000 | 0 | 
+| @l1dev | 515 | 9 | 25,000,000 | 10,002,000 | 
+| @xfactorus | 635 | 18 | 19,000,000 | 0 | 
+| @svasilenko | 2096 | 16 | 1,000 | 42,000,000 | 
+| @freakstatic_council | 321 | 18 | 25,000,000 | 10,000,000 | 
+| @kadyrovs | 1345 | 14 | 8,000,000 | 15,000,000 | 
+| @tomato | 2 | 17 | 20,000,000 | 15,002,400 | 
+| @marinag_mary | 1997 | 7 | 1,900,000 | 22,000,000 | 
+| @laura | 2329 | 21 | 25,000,000 | 10,000,777 | 
+| @ururu | 790 | 16 | 16,000,000 | 5,000,000 | 
+| @sparky | 319 | 0 | 25,000,000 | 0 | 
+| @maxlevush | 2130 | 18 | 4,800,000 | 13,160,143 | 
+| @igrex | 1048 | 22 | 18,000,000 | 10,000,000 | 
+| @zazik | 2435 | 18 | 18,400,000 | 8,000,000 | 
+| @isonar | 2182 | 5 | 20,000,000 | 0 | 
+| @oklick | 3045 | 19 | 20,001,000 | 0 | 
+| | | Subtotal: | 301,009,666 | 253,165,320 |
+| | | Total: | 554,174,986 |  |
+
+
+### 1.4 - Council Roles
+* Council Secretary
+    * @tomato
+* Council Deputy Secretary
+    * @zazik
+
+### 1.5 - Council Mint & Budget Status
+* Start minted: 840,716,034
+* End minted: 907,400,514
+* Total minted during council round: 66684480 tokens (+7.93% from start)
+
+* Budget proposal link: https://testnet.joystream.org/#/proposals/576
+* Budget forum link: not created
+
+(Note: The council budget is now based on the rewards for roles, council payments and validator payments. Jsgenesis decides how much to set the mint to.)
+
+## 2 - Minutes
+### 2.1 - Proposal Overview
+Proposal Types
+- 25 Proposals Created
+    - 14 Text Proposals
+    - 6 Spending Proposals
+    - 0 SetWorkingGroupLeaderReward Proposals
+    - 5 SetWorkingGroupMintCapacity Proposals
+    - 0 BeginReviewWorkingGroupLeaderApplication Proposals
+    - 0 TerminateWorkingGroupLeaderRole
+    - 0 FillWorkingGroupLeaderOpening
+    - 0 SetValidatorCount
+    - 0 AddWorkingGroupLeaderOpening
+    - 0 SetElectionParameters
+    - 0 RuntimeUpgrade
+
+Proposal States
+- 21 Approved & executed proposals
+- 0 Canceled proposals
+- 0 Rejected proposals
+- 0 Slashed proposals
+- 1 Expired proposals
+- 3 proposals passed to next council
+    - These proposals didn't gather enough quorum in the current council term, so the votes are reset and passed to the next council.
+
+Failed Proposals
+- 0 NotEnoughCapacity failures
+- 0 ExecutionFailed
+
+- Total time for proposals to finalize: 381.62 hours
+- Average time for proposals to finalize: 17.35 hours
+    - This average is calculated from all proposals, including expired proposals but excluding canceled proposals.
+
+### 2.2 - Proposal Breakdown
+
+#### Proposal 761 - Curator Lead OKR rewards
+- Proposal Link: https://testnet.joystream.org/#/proposals/761
+- Proposal Type: Spending
+	- Amount: 2325581
+	- Destination member: laura
+- Status: Approved & Executed
+	- Time to finalize: 5395 blocks (9.27h)
+- Created by: @ilich
+- Participants: @igrex, @marinag_mary, @kadyrovs, @isonar, @maxlevush, @ururu, @zazik, @ilich, @laura, @freakstatic_council, @oklick, @tomato
+
+#### Proposal 762 - OKR Reward for Content Curator
+- Proposal Link: https://testnet.joystream.org/#/proposals/762
+- Proposal Type: Spending
+	- Amount: 2519379
+- Status: Approved & Executed
+	- Time to finalize: 4020 blocks (6.91h)
+- Created by: @laura
+- Participants: @igrex, @marinag_mary, @kadyrovs, @isonar, @maxlevush, @ururu, @zazik, @ilich, @laura, @freakstatic_council, @oklick, @tomato
+
+#### Proposal 763 - KPI Position: Analyst Bounty
+- Proposal Link: https://testnet.joystream.org/#/proposals/763
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 3628 blocks (6.23h)
+- Created by: @ardashoff
+- Participants: @igrex, @marinag_mary, @kadyrovs, @maxlevush, @svasilenko, @ururu, @zazik, @xfactorus, @laura, @kate_fm, @oklick, @tomato
+
+#### Proposal 764 - 29.I- 3 - Deputy Council Secretary
+- Proposal Link: https://testnet.joystream.org/#/proposals/764
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 3109 blocks (5.34h)
+- Created by: @zazik
+- Participants: @igrex, @marinag_mary, @kadyrovs, @maxlevush, @ururu, @zazik, @xfactorus, @ilich, @laura, @freakstatic_council, @kate_fm, @oklick
+
+#### Proposal 765 - 29.I-2 - Council Secretary
+- Proposal Link: https://testnet.joystream.org/#/proposals/765
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Expired
+	- Time to finalize: 72000 blocks (123.67h)
+- Created by: @laura
+- Participants: @igrex, @marinag_mary, @kadyrovs, @isonar, @maxlevush, @svasilenko, @ururu, @blackmass, @l1dev, @zazik, @xfactorus, @ilich, @laura, @freakstatic_council, @kate_fm, @oklick
+
+#### Proposal 766 - KPI 29.I-2 - Council Secretary
+- Proposal Link: https://testnet.joystream.org/#/proposals/766
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 3608 blocks (6.20h)
+- Created by: @tomato
+- Participants: @igrex, @kadyrovs, @maxlevush, @svasilenko, @ururu, @xfactorus, @ilich, @laura, @freakstatic_council, @kate_fm, @oklick, @tomato
+
+#### Proposal 767 - 28.I-4 - Council Minutes
+- Proposal Link: https://testnet.joystream.org/#/proposals/767
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 8401 blocks (14.43h)
+- Created by: @ilich
+- Participants: @igrex, @kadyrovs, @isonar, @maxlevush, @svasilenko, @ururu, @l1dev, @xfactorus, @ilich, @freakstatic_council, @oklick, @tomato
+
+#### Proposal 768 - 28.I-4 - Council Minutes (Tokenomics)
+- Proposal Link: https://testnet.joystream.org/#/proposals/768
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 12674 blocks (21.77h)
+- Created by: @ilich
+- Participants: @igrex, @kadyrovs, @maxlevush, @svasilenko, @lkskrn, @zazik, @xfactorus, @ilich, @laura, @freakstatic_council, @oklick, @tomato
+
+#### Proposal 769 - Weekly Storage WG Report 21
+- Proposal Link: https://testnet.joystream.org/#/proposals/769
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 11930 blocks (20.49h)
+- Created by: @0x2bc
+- Participants: @igrex, @kadyrovs, @maxlevush, @svasilenko, @lkskrn, @zazik, @xfactorus, @ilich, @laura, @freakstatic_council, @oklick, @tomato
+
+#### Proposal 770 - Refill operations mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/770
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 8180 blocks (14.05h)
+- Created by: @l1dev
+- Participants: @igrex, @kadyrovs, @maxlevush, @svasilenko, @lkskrn, @zazik, @xfactorus, @ilich, @laura, @freakstatic_council, @oklick, @tomato
+
+#### Proposal 771 - OWG Report Round 28
+- Proposal Link: https://testnet.joystream.org/#/proposals/771
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 8694 blocks (14.93h)
+- Created by: @l1dev
+- Participants: @igrex, @kadyrovs, @maxlevush, @svasilenko, @l1dev, @zazik, @xfactorus, @ilich, @laura, @freakstatic_council, @oklick, @tomato
+
+#### Proposal 772 - Refill operations mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/772
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 5877 blocks (10.09h)
+- Created by: @l1dev
+- Participants: @igrex, @isonar, @svasilenko, @lkskrn, @blackmass, @l1dev, @xfactorus, @ilich, @laura, @freakstatic_council, @oklick, @tomato
+
+#### Proposal 773 - Replenish my "give account" #2
+- Proposal Link: https://testnet.joystream.org/#/proposals/773
+- Proposal Type: Spending
+	- Amount: 5000000
+- Status: Approved & Executed
+	- Time to finalize: 2391 blocks (4.11h)
+- Created by: @tomato
+- Participants: @igrex, @svasilenko, @lkskrn, @ururu, @zazik, @xfactorus, @ilich, @laura, @freakstatic_council, @kate_fm, @oklick, @tomato
+
+#### Proposal 774 - Mint Content Working Group
+- Proposal Link: https://testnet.joystream.org/#/proposals/774
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 11283 blocks (19.38h)
+- Created by: @laura
+- Participants: @igrex, @svasilenko, @ururu, @blackmass, @l1dev, @zazik, @xfactorus, @ilich, @laura, @freakstatic_council, @kate_fm, @oklick
+
+#### Proposal 775 - Report KPI 29.II-5
+- Proposal Link: https://testnet.joystream.org/#/proposals/775
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 10850 blocks (18.64h)
+- Created by: @igrex
+- Participants: @igrex, @maxlevush, @svasilenko, @ururu, @blackmass, @l1dev, @zazik, @xfactorus, @ilich, @laura, @oklick, @tomato
+
+#### Proposal 776 - Payment Bounty 18
+- Proposal Link: https://testnet.joystream.org/#/proposals/776
+- Proposal Type: Spending
+	- Amount: 10565217
+- Status: Approved & Executed
+	- Time to finalize: 9272 blocks (15.93h)
+- Created by: @joydiesel
+- Participants: @igrex, @maxlevush, @svasilenko, @blackmass, @l1dev, @zazik, @xfactorus, @ilich, @laura, @freakstatic_council, @oklick, @tomato
+
+#### Proposal 777 - Movement for more democratic elections!
+- Proposal Link: https://testnet.joystream.org/#/proposals/777
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Passed to next council
+- Created by: @nanapa6otaet
+- Participants: 
+
+#### Proposal 778 - Extend responsibilities of KPI manager
+- Proposal Link: https://testnet.joystream.org/#/proposals/778
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 7427 blocks (12.76h)
+- Created by: @svasilenko
+- Participants: @igrex, @arseniy2706, @maxlevush, @svasilenko, @ururu, @l1dev, @zazik, @xfactorus, @ilich, @laura, @kate_fm, @tomato
+
+#### Proposal 779 - KPI 29.II-5 - Research Boardroom
+- Proposal Link: https://testnet.joystream.org/#/proposals/779
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 6772 blocks (11.63h)
+- Created by: @laura
+- Participants: @igrex, @arseniy2706, @marinag_mary, @kadyrovs, @maxlevush, @lkskrn, @ururu, @zazik, @xfactorus, @laura, @freakstatic_council, @kate_fm
+
+#### Proposal 780 - Refill Storage Mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/780
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 6723 blocks (11.55h)
+- Created by: @0x2bc
+- Participants: @igrex, @arseniy2706, @kadyrovs, @maxlevush, @lkskrn, @ururu, @blackmass, @zazik, @xfactorus, @laura, @freakstatic_council, @kate_fm
+
+#### Proposal 781 - Payment  Bounty 24 (6-th week)
+- Proposal Link: https://testnet.joystream.org/#/proposals/781
+- Proposal Type: Spending
+	- Amount: 12594458
+- Status: Approved & Executed
+	- Time to finalize: 7281 blocks (12.51h)
+- Created by: @arseniy2706
+- Participants: @igrex, @marinag_mary, @kadyrovs, @lkskrn, @ururu, @blackmass, @xfactorus, @laura, @freakstatic_council, @kate_fm, @oklick, @tomato
+
+#### Proposal 782 - Weekly Curator Working Group Report 29
+- Proposal Link: https://testnet.joystream.org/#/proposals/782
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 9159 blocks (15.73h)
+- Created by: @zazik
+- Participants: @igrex, @maxlevush, @svasilenko, @ururu, @blackmass, @zazik, @ilich, @laura, @freakstatic_council, @kate_fm, @oklick, @tomato
+
+#### Proposal 783 - Refill operations mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/783
+- Proposal Type: SetWorkingGroupMintCapacity
+	- Amount: N/A
+- Status: Approved & Executed
+	- Time to finalize: 3496 blocks (6.01h)
+- Created by: @l1dev
+- Participants: @igrex, @maxlevush, @svasilenko, @lkskrn, @ururu, @l1dev, @zazik, @ilich, @laura, @kate_fm, @oklick, @tomato
+
+#### Proposal 784 - Curator Lead OKR rewards
+- Proposal Link: https://testnet.joystream.org/#/proposals/784
+- Proposal Type: Spending
+	- Amount: 2400000
+	- Destination member: laura
+- Status: Passed to next council
+- Created by: @zazik
+- Participants: 
+
+#### Proposal 785 - Weekly Storage WG Report 22
+- Proposal Link: https://testnet.joystream.org/#/proposals/785
+- Proposal Type: Text
+	- Amount: N/A
+- Status: Passed to next council
+- Created by: @0x2bc
+- Participants: 
+
+### 2.4 - Select threads & events
+N/A
+
+### 2.5 - Working Group Spotchecks
+- Storage Role Spot Check: N/A
+- Curator Role Spot Check: N/A
+- Operations Role Spot Check: N/A
+
+## 3 - Review
+### 3.1 - Workflow, Performance, Challenged & Thinking
+* N/A
+
+## 4 - Obligations
+Council obligations are payments or items that carry through council sessions. These are noted so that future councils can easily see what items they should be aware of. Items can be removed from here once they have been resolved or become outdated.
+
+### 4.1 Current Documents / Processes
+- Council Report
+    - Each council should produce a report which highlights important events, council participation, mint spending and other important facts surrounding the council term
+- Council Budget
+    - This is a proposal which tries to guide how many tokens the current council may have available to it during a term. This is a non binding proposal, so is mainly used as a guide for now.
+
+### 4.2 Regular Payments / Proposals
+- Council Mint
+    - The council mint needs to be checked on a regular basis and in the event it is near depletion, a council member should notify a member of Jsgenesis in order for it to be refilled.
+    - The council mint is set at a value decided by Jsgenesis.
+- Council Roles
+    - Council Secretary
+        - This role was introduced in Council Round #18 and the payments are now managed by KPI rewards.
+- Content Curator Mint
+    - The Content Curator Mint currently has a maximum value of 5 million tokens.
+    - The Content Curator Mint has to be filled periodically and the agreed amount was discussed earlier. The amount may change in the future, but the rewards for this role are dependent on the council passing these proposals in a timely fashion.
+    - The Content Curator Lead role is expected to keep track of their mint level and any member of the Joystream platform can create a proposal to refill this mint.
+- Storage Mint
+    - The Storage Mint currently has a maximum value of 5 million tokens.
+    - This mint has be refilled periodically
+    - The Storage Lead role is expected to keep track of their mint level and any member of the Joystream platform can create a proposal to refill this mint.
+
+### 4.2 Bounties
+- Bounties are shown on the forum Bounties section: https://testnet.joystream.org/#/forum/categories/10
+
+## 5 - Report changelog
+- 04.11.2020
+    - added working group review section
+
+- 22.10.2020
+    - updated budget section to reflect nature of new budget system
+    - updated events to be threads & events
+
+- 14.09.2020
+    - removed member addresses and replaced with member IDs since they take less space
+    - added realized and unrealized spending\

+ 373 - 0
council/reports/sumer-reports/Sumer_Council30_Report_16-11-2021.md

@@ -0,0 +1,373 @@
+# Sumer - Council Election Round #32  - Performance Review and Minutes
+## 1 - Basic Information
+### 1.1 - Introduction
+The council is expected to produce reports during each round and provide feedback in the form of workflow, challenges, thinking and performance as well as minutes covering important events during the council session.
+
+Usernames referenced are Joystream usernames.
+All times are calculated based on 6.17 second blocktimes and not actual blocktimes.
+The Council Round number is taken from the chain, the KPI rounds have an offset number.
+
+### 1.2 - Council Round Overview
+* Council Election Round: #32
+* Council Term: 30
+* Start Block: #3085200
+* End Block: #3185999
+* Forum thread for round feedback: https://pioneer.joystreamstats.live/#/forum/threads/759
+
+### 1.3 - Council members & vote participation
+* All usernames are listed in the order given by `activeCouncil` from chain state.
+* Votes cast includes all types of vote (Approve, Reject, Abstain & Slash)
+* In the event a proposal is not finalized within the current council, it will be indicated and current council votes will not be recorded due to system limitations
+
+| Username             | Member ID | Prop. Votes Cast | CM Own Stake | CM Voter Stake |
+|----------------------|-----------|------------------|--------------|----------------|
+| @ilich | 2194 | 17 | 15001000 | 10000000 |
+| @arseniy2706 | 1521 | 5 | 7100000 | 15000000 |
+| @blackmass | 361 | 7 | 25000000 | 0 |
+| @joyval | 2141 | 2 | 23000000 | 0 |
+| @l1dev | 515 | 7 | 26000000 | 0 |
+| @alexznet | 2574 | 12 | 11000000 | 10950000 |
+| @nanapa6otaet | 2531 | 13 | 1111 | 26450000 |
+| @ardashoff | 2697 | 15 | 1000 | 32005200 |
+| @nkhlghbl | 1962 | 12 | 25000000 | 0 |
+| @freakstatic_council | 321 | 14 | 26000000 | 0 |
+| @kadyrovs | 1345 | 14 | 13000000 | 14500000 |
+| @chiffah | 2462 | 5 | 22000000 | 100 |
+| @tomato | 2 | 14 | 20000000 | 5000200 |
+| @kalpakci | 2137 | 4 | 25001000 | 0 |
+| @marinag_mary | 1997 | 7 | 10000 | 36659000 |
+| @laura | 2329 | 17 | 25000000 | 5000000 |
+| @sparky | 319 | 0 | 25000000 | 0 |
+| @zazik | 2435 | 18 | 21400000 | 3600000 |
+| @hayabusa | 582 | 12 | 10000 | 22000000 |
+| @marat_mu | 2154 | 11 | 21000000 | 0 |
+| | | Subtotal: | 330524111 | 181164500 |
+| | | Total: | 511688611 |  |
+
+
+### 1.4 - Council Roles
+* Council Secretary
+    * @tomato
+* Council Deputy Secretary
+    * @zazik
+
+### 1.5 - Council Mint & Budget Status
+* Start minted: 907400514
+* End minted: 932706400
+* Total minted during council round: 25305886 tokens (+2.79% from start)
+
+* Budget proposal link: https://testnet.joystream.org/#/proposals/802
+* Budget forum link: https://testnet.joystream.org/#/forum/threads/717
+
+(Note: The council budget is now based on the rewards for roles, council payments and validator payments. Jsgenesis decides how much to set the mint to.)
+
+## 2 - Minutes
+### 2.1 - Proposal Overview
+Proposal Types
+- 28 Proposals Created
+    - 17 Text Proposals
+    - 6 Spending Proposals
+    - 0 SetWorkingGroupLeaderReward Proposals
+    - 5 SetWorkingGroupMintCapacity Proposals
+    - 0 BeginReviewWorkingGroupLeaderApplication Proposals
+    - 0 TerminateWorkingGroupLeaderRole
+    - 0 FillWorkingGroupLeaderOpening
+    - 0 SetValidatorCount
+    - 0 AddWorkingGroupLeaderOpening
+    - 0 SetElectionParameters
+    - 0 RuntimeUpgrade
+
+Proposal States
+- 16 Approved & executed proposals
+- 4 Canceled proposals
+- 0 Rejected proposals
+- 0 Slashed proposals
+- 0 Expired proposals
+- 8 proposals passed to next council
+    - These proposals didn't gather enough quorum in the current council term, so the votes are reset and passed to the next council.
+
+Failed Proposals
+- 0 NotEnoughCapacity failures
+- 0 ExecutionFailed
+
+- Total time for proposals to finalize: 375.07 hours
+- Average time for proposals to finalize: 23.44 hours
+    - This average is calculated from all proposals, including expired proposals but excluding canceled proposals.
+
+### 2.2 - Proposal Breakdown
+
+#### Proposal 786 - Adjust community repo filename standards
+- Proposal Link: https://testnet.joystream.org/#/proposals/786
+- Proposal Type: Text
+- Status: Canceled
+- Created by: @tomato
+- Participants: @kadyrovs, @marat_mu, @alexznet, @zazik, @ilich, @laura, @freakstatic_council, @tomato, @ardashoff
+
+#### Proposal 787 - OKR Reward for Content Curator
+- Proposal Link: https://testnet.joystream.org/#/proposals/787
+- Proposal Type: Spending
+	- Amount: 2931726
+- Status: Approved & Executed
+	- Time to finalize: 13779 blocks (23.62h)
+- Created by: @laura
+- Participants: @marinag_mary, @kadyrovs, @marat_mu, @l1dev, @alexznet, @zazik, @ilich, @laura, @freakstatic_council, @hayabusa, @tomato, @ardashoff
+
+#### Proposal 788 - 30.I-3 - Deputy Council Secretary
+- Proposal Link: https://testnet.joystream.org/#/proposals/788
+- Proposal Type: Text
+- Status: Approved & Executed
+	- Time to finalize: 3122 blocks (5.35h)
+- Created by: @zazik
+- Participants: @marinag_mary, @kadyrovs, @marat_mu, @blackmass, @l1dev, @alexznet, @zazik, @ilich, @laura, @freakstatic_council, @tomato, @ardashoff
+
+#### Proposal 789 - KPI 30.I-2 - Council Secretary
+- Proposal Link: https://testnet.joystream.org/#/proposals/789
+- Proposal Type: Text
+- Status: Approved & Executed
+	- Time to finalize: 3618 blocks (6.20h)
+- Created by: @tomato
+- Participants: @kadyrovs, @nkhlghbl, @kalpakci, @marat_mu, @blackmass, @l1dev, @alexznet, @zazik, @ilich, @laura, @freakstatic_council, @ardashoff
+
+#### Proposal 790 - 29.I-4 - Council Minutes
+- Proposal Link: https://testnet.joystream.org/#/proposals/790
+- Proposal Type: Text
+- Status: Approved & Executed
+	- Time to finalize: 11408 blocks (19.56h)
+- Created by: @ilich
+- Participants: @nkhlghbl, @kalpakci, @marat_mu, @alexznet, @nanapa6otaet, @zazik, @ilich, @laura, @freakstatic_council, @hayabusa, @tomato, @ardashoff
+
+#### Proposal 791 - OWG Report Round 29
+- Proposal Link: https://testnet.joystream.org/#/proposals/791
+- Proposal Type: Text
+- Status: Approved & Executed
+	- Time to finalize: 8979 blocks (15.39h)
+- Created by: @l1dev
+- Participants: @kadyrovs, @nkhlghbl, @kalpakci, @marat_mu, @alexznet, @nanapa6otaet, @zazik, @ilich, @laura, @freakstatic_council, @hayabusa, @ardashoff
+
+#### Proposal 792 - Refill operations mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/792
+- Proposal Type: SetWorkingGroupMintCapacity
+- Status: Approved & Executed
+	- Time to finalize: 8085 blocks (13.86h)
+- Created by: @l1dev
+- Participants: @kadyrovs, @nkhlghbl, @kalpakci, @marat_mu, @l1dev, @alexznet, @nanapa6otaet, @zazik, @ilich, @laura, @freakstatic_council, @hayabusa
+
+#### Proposal 793 - Refactor council report generator
+- Proposal Link: https://testnet.joystream.org/#/proposals/793
+- Proposal Type: Text
+- Status: Approved & Executed
+	- Time to finalize: 19365 blocks (33.20h)
+- Created by: @l1dev
+- Participants: @nkhlghbl, @blackmass, @alexznet, @nanapa6otaet, @zazik, @ilich, @laura, @chiffah, @freakstatic_council, @hayabusa, @tomato, @ardashoff
+
+#### Proposal 794 - JSG request Sprocket - JSlogo new budget
+- Proposal Link: https://testnet.joystream.org/#/proposals/794
+- Proposal Type: Text
+- Status: Canceled
+- Created by: @hayabusa
+- Participants: @nkhlghbl
+
+#### Proposal 795 - joystream-lib & tokenomics refactor
+- Proposal Link: https://testnet.joystream.org/#/proposals/795
+- Proposal Type: Spending
+	- Amount: 50000000
+	- Destination member: joystreamstats
+- Status: Passed to next council
+- Created by: @l1dev
+- Participants: 
+
+#### Proposal 796 - Correct tokenomics & OWG reports
+- Proposal Link: https://testnet.joystream.org/#/proposals/796
+- Proposal Type: Text
+- Status: Approved & Executed
+	- Time to finalize: 60931 blocks (104.46h)
+- Created by: @l1dev
+- Participants: @marinag_mary, @blackmass, @l1dev, @nanapa6otaet, @zazik, @ilich, @chiffah, @freakstatic_council, @hayabusa, @joyval, @tomato, @ardashoff
+
+#### Proposal 797 - Refill operations mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/797
+- Proposal Type: SetWorkingGroupMintCapacity
+- Status: Approved & Executed
+	- Time to finalize: 14990 blocks (25.70h)
+- Created by: @l1dev
+- Participants: @marinag_mary, @kadyrovs, @blackmass, @l1dev, @nanapa6otaet, @zazik, @ilich, @laura, @freakstatic_council, @hayabusa, @tomato, @ardashoff
+
+#### Proposal 798 - Community Feedback Part 2
+- Proposal Link: https://testnet.joystream.org/#/proposals/798
+- Proposal Type: Text
+- Status: Approved & Executed
+	- Time to finalize: 9099 blocks (15.60h)
+- Created by: @zazik
+- Participants: @marinag_mary, @kadyrovs, @nkhlghbl, @blackmass, @alexznet, @nanapa6otaet, @zazik, @ilich, @laura, @hayabusa, @tomato, @ardashoff
+
+#### Proposal 799 - Mint Content Working Group
+- Proposal Link: https://testnet.joystream.org/#/proposals/799
+- Proposal Type: SetWorkingGroupMintCapacity
+- Status: Approved & Executed
+	- Time to finalize: 13389 blocks (22.95h)
+- Created by: @zazik
+- Participants: @arseniy2706, @marinag_mary, @kadyrovs, @nkhlghbl, @l1dev, @nanapa6otaet, @zazik, @ilich, @laura, @chiffah, @tomato, @ardashoff
+
+#### Proposal 800 - multi-lingual support for jsstats 
+- Proposal Link: https://testnet.joystream.org/#/proposals/800
+- Proposal Type: Text
+- Status: Approved & Executed
+	- Time to finalize: 12185 blocks (20.89h)
+- Created by: @l1dev
+- Participants: @arseniy2706, @kadyrovs, @nkhlghbl, @blackmass, @alexznet, @nanapa6otaet, @zazik, @ilich, @laura, @hayabusa, @joyval, @tomato
+
+#### Proposal 801 - Bill to Increase Council Seats to 25
+- Proposal Link: https://testnet.joystream.org/#/proposals/801
+- Proposal Type: Text
+- Status: Passed to next council
+- Created by: @nanapa6otaet
+- Participants: 
+
+#### Proposal 802 - JSG request Sprocket - JSlogo new budget
+- Proposal Link: https://testnet.joystream.org/#/proposals/802
+- Proposal Type: Text
+- Status: Approved & Executed
+	- Time to finalize: 12725 blocks (21.82h)
+- Created by: @hayabusa
+- Participants: @arseniy2706, @kadyrovs, @nkhlghbl, @marat_mu, @alexznet, @nanapa6otaet, @zazik, @ilich, @laura, @freakstatic_council, @tomato, @ardashoff
+
+#### Proposal 803 - Payment Bounty 18
+- Proposal Link: https://testnet.joystream.org/#/proposals/803
+- Proposal Type: Spending
+	- Amount: 4758620
+- Status: Canceled
+- Created by: @joydiesel
+- Participants: @arseniy2706, @zazik, @laura, @tomato
+
+#### Proposal 804 - Bounty 24. Payments. 7-th week. 
+- Proposal Link: https://testnet.joystream.org/#/proposals/804
+- Proposal Type: Spending
+	- Amount: 10355540
+- Status: Approved & Executed
+	- Time to finalize: 6820 blocks (11.69h)
+- Created by: @arseniy2706
+- Participants: @arseniy2706, @kadyrovs, @nkhlghbl, @marat_mu, @nanapa6otaet, @zazik, @ilich, @laura, @freakstatic_council, @hayabusa, @tomato, @ardashoff
+
+#### Proposal 805 - Bounty 18. Payments. 12-th week. 
+- Proposal Link: https://testnet.joystream.org/#/proposals/805
+- Proposal Type: Spending
+	- Amount: 4758620
+- Status: Approved & Executed
+	- Time to finalize: 13402 blocks (22.98h)
+- Created by: @joydiesel
+- Participants: @kadyrovs, @marat_mu, @alexznet, @nanapa6otaet, @zazik, @ilich, @laura, @chiffah, @freakstatic_council, @hayabusa, @tomato, @ardashoff
+
+#### Proposal 806 - Weekly Curator Working Group Report 30
+- Proposal Link: https://testnet.joystream.org/#/proposals/806
+- Proposal Type: Text
+- Status: Approved & Executed
+	- Time to finalize: 6872 blocks (11.78h)
+- Created by: @laura
+- Participants: @marinag_mary, @kadyrovs, @nkhlghbl, @marat_mu, @nanapa6otaet, @zazik, @ilich, @laura, @chiffah, @freakstatic_council, @hayabusa, @ardashoff
+
+#### Proposal 807 - Weekly Storage WG Report 23
+- Proposal Link: https://testnet.joystream.org/#/proposals/807
+- Proposal Type: Text
+- Status: Passed to next council
+- Created by: @0x2bc
+- Participants: 
+
+#### Proposal 808 - Refill Storage Mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/808
+- Proposal Type: SetWorkingGroupMintCapacity
+- Status: Passed to next council
+- Created by: @0x2bc
+- Participants: 
+
+#### Proposal 809 - Curator Lead OKR rewards
+- Proposal Link: https://testnet.joystream.org/#/proposals/809
+- Proposal Type: Spending
+	- Amount: 2113000
+	- Destination member: laura
+- Status: Passed to next council
+- Created by: @zazik
+- Participants: 
+
+#### Proposal 810 - Refill operations mint
+- Proposal Link: https://testnet.joystream.org/#/proposals/810
+- Proposal Type: SetWorkingGroupMintCapacity
+- Status: Passed to next council
+- Created by: @l1dev
+- Participants: 
+
+#### Proposal 811 - Joystream Education Series Bounty
+- Proposal Link: https://testnet.joystream.org/#/proposals/811
+- Proposal Type: Text
+- Status: Canceled
+- Created by: @zazik
+- Participants: 
+
+#### Proposal 812 - Joystream Education Series Bounty
+- Proposal Link: https://testnet.joystream.org/#/proposals/812
+- Proposal Type: Text
+- Status: Passed to next council
+- Created by: @zazik
+- Participants: 
+
+#### Proposal 813 - Council Budget 8
+- Proposal Link: https://testnet.joystream.org/#/proposals/813
+- Proposal Type: Text
+- Status: Passed to next council
+- Created by: @freakstatic_council
+- Participants: 
+
+### 2.4 - Select threads & events
+* [DAO and the problems of decentralization](https://pioneer.joystreamstats.live/#/forum/threads/743)
+* [Joystream Education Series Bounty](https://pioneer.joystreamstats.live/#/forum/threads/751)
+
+### 2.5 - Working Group Spotchecks
+- Storage Role Spot Check: https://pioneer.joystreamstats.live/#/forum/threads/409
+- Curator Role Spot Check: https://pioneer.joystreamstats.live/#/forum/threads/411
+- Operations Role Spot Check: https://pioneer.joystreamstats.live/#/forum/threads/417
+
+## 3 - Review
+### 3.1 - Workflow, Performance, Challenged & Thinking
+* * KPI Reports: https://pioneer.joystreamstats.live/#/forum/threads/757
+
+## 4 - Obligations
+Council obligations are payments or items that carry through council sessions. These are noted so that future councils can easily see what items they should be aware of. Items can be removed from here once they have been resolved or become outdated.
+
+### 4.1 Current Documents / Processes
+- Council Report
+    - Each council should produce a report which highlights important events, council participation, mint spending and other important facts surrounding the council term
+- Council Budget
+    - This is a proposal which tries to guide how many tokens the current council may have available to it during a term. This is a non binding proposal, so is mainly used as a guide for now.
+
+### 4.2 Regular Payments / Proposals
+- Council Mint
+    - The council mint needs to be checked on a regular basis and in the event it is near depletion, a council member should notify a member of Jsgenesis in order for it to be refilled.
+    - The council mint is set at a value decided by Jsgenesis.
+- Council Roles
+    - Council Secretary
+        - This role was introduced in Council Round #18 and the payments are now managed by KPI rewards.
+- Content Curator Mint
+    - The Content Curator Mint currently has a maximum value of 5 million tokens.
+    - The Content Curator Mint has to be filled periodically and the agreed amount was discussed earlier. The amount may change in the future, but the rewards for this role are dependent on the council passing these proposals in a timely fashion.
+    - The Content Curator Lead role is expected to keep track of their mint level and any member of the Joystream platform can create a proposal to refill this mint.
+- Storage Mint
+    - The Storage Mint currently has a maximum value of 5 million tokens.
+    - This mint has be refilled periodically
+    - The Storage Lead role is expected to keep track of their mint level and any member of the Joystream platform can create a proposal to refill this mint.
+
+### 4.2 Bounties
+- Bounties are shown on the forum Bounties section: https://testnet.joystream.org/#/forum/categories/10
+
+## 5 - Report changelog
+- [October, November 2021](https://github.com/Joystream/community-repo/pull/428)
+    - proposals refactor, show amount for spending proposals
+
+- 04.11.2020
+    - added working group review section
+
+- 22.10.2020
+    - updated budget section to reflect nature of new budget system
+    - updated events to be threads & events
+
+- 14.09.2020
+    - removed member addresses and replaced with member IDs since they take less space
+    - added realized and unrealized spending

+ 2 - 2
council/tokenomics/antioch-3/Council_Round1_118800-277199_Tokenomics_Report.md

@@ -19,8 +19,8 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 21487585 |
 | Bounties paid       | 18102585 |
 | Validator Role      | 6322734 |
-| Storage Role        | 1011993.61 |
-| Curator Role        | 2771982.50 |
+| Storage Role        | 0 |
+| Curator Role        | 454000.00 |
 | Operations Role     | 0 |
 
 ### 2.2 Fiat Pool

+ 2 - 2
council/tokenomics/antioch-3/Council_Round2_277200-377999_Tokenomics_Report.md

@@ -19,8 +19,8 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 21542226 |
 | Bounties paid       | 21542226 |
 | Validator Role      | 3663208 |
-| Storage Role        | 772792.33 |
-| Curator Role        | 3379566.47 |
+| Storage Role        | 667000 |
+| Curator Role        | 2863000.00 |
 | Operations Role     | 0 |
 
 ### 2.2 Fiat Pool

+ 2 - 2
council/tokenomics/antioch-3/Council_Round3_378000-478799_Tokenomics_Report.md

@@ -19,8 +19,8 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 36816486 |
 | Bounties paid       | 36816486 |
 | Validator Role      | 3313300 |
-| Storage Role        | 3506069.22 |
-| Curator Role        | 3519229.09 |
+| Storage Role        | 2785244 |
+| Curator Role        | 3418808.00 |
 | Operations Role     | 0 |
 
 ### 2.2 Fiat Pool

+ 2 - 2
council/tokenomics/antioch-3/Council_Round4_478800-579599_Tokenomics_Report.md

@@ -19,8 +19,8 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 18485327 |
 | Bounties paid       | 18485327 |
 | Validator Role      | 5566011 |
-| Storage Role        | 2975166.48 |
-| Curator Role        | 4905635.33 |
+| Storage Role        | 3073567 |
+| Curator Role        | 4681757.00 |
 | Operations Role     | 0 |
 
 ### 2.2 Fiat Pool

+ 2 - 2
council/tokenomics/antioch-3/Council_Round5_579600-680399_Tokenomics_Report.md

@@ -19,8 +19,8 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 17294942 |
 | Bounties paid       | 15144942 |
 | Validator Role      | 8440062 |
-| Storage Role        | 3506069.22 |
-| Curator Role        | 4205642.28 |
+| Storage Role        | 4457720 |
+| Curator Role        | 4755684.00 |
 | Operations Role     | 0 |
 
 ### 2.2 Fiat Pool

+ 2 - 2
council/tokenomics/antioch-3/Council_Round6_680400-781199_Tokenomics_Report.md

@@ -19,8 +19,8 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 3572490 |
 | Bounties paid       | 3572490 |
 | Validator Role      | 4168763 |
-| Storage Role        | 4154570.78 |
-| Curator Role        | 4748332.89 |
+| Storage Role        | 3689750 |
+| Curator Role        | 4348886.00 |
 | Operations Role     | 0 |
 
 ### 2.2 Fiat Pool

+ 3 - 3
council/tokenomics/sumer-4/Council_Round10_1083600-1184399_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 30456138 |
 | Bounties paid       | 30456138 |
 | Validator Role      | 10818876 |
-| Storage Role        | 5564244.8 |
-| Curator Role        | 7495525.64 |
-| Operations Role     | 2136742.8 |
+| Storage Role        | 4973885 |
+| Curator Role        | 8012000.00 |
+| Operations Role     | 1790260 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round11_1184400-1285199_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 18906015 |
 | Bounties paid       | 15906015 |
 | Validator Role      | 6082007 |
-| Storage Role        | 8420216.47 |
-| Curator Role        | 7350767.07 |
-| Operations Role     | 3850325.8 |
+| Storage Role        | 7910300 |
+| Curator Role        | 7520050.00 |
+| Operations Role     | 3275809 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round12_1285200-1385999_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 30754200 |
 | Bounties paid       | 30754200 |
 | Validator Role      | 12919403 |
-| Storage Role        | 8672213.97 |
-| Curator Role        | 8180118.85 |
-| Operations Role     | 3850325.8 |
+| Storage Role        | 8465300 |
+| Curator Role        | 8097020.00 |
+| Operations Role     | 3850347 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round13_1386000-1486799_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 66399263 |
 | Bounties paid       | 62236669 |
 | Validator Role      | 13752418 |
-| Storage Role        | 9880261.98 |
-| Curator Role        | 8426516.40 |
-| Operations Role     | 7931481.31 |
+| Storage Role        | 10633805 |
+| Curator Role        | 8031900.00 |
+| Operations Role     | 6668738 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round14_1486800-1587599_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 30879798 |
 | Bounties paid       | 23631616 |
 | Validator Role      | 12709365 |
-| Storage Role        | 10864032.22 |
-| Curator Role        | 6203758.45 |
-| Operations Role     | 17410619.27 |
+| Storage Role        | 10298715 |
+| Curator Role        | 8189365.00 |
+| Operations Role     | 12228832 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round15_1587600-1688399_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 31792993 |
 | Bounties paid       | 19745223 |
 | Validator Role      | 14270773 |
-| Storage Role        | 11028138.59 |
-| Curator Role        | 8135739.29 |
-| Operations Role     | 16377037.53 |
+| Storage Role        | 10088796 |
+| Curator Role        | 6635070.00 |
+| Operations Role     | 11268667 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round16_1688400-1789199_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 20893103 |
 | Bounties paid       | 13793103 |
 | Validator Role      | 14215503 |
-| Storage Role        | 11989705.05 |
-| Curator Role        | 5721743.24 |
-| Operations Role     | 43185931.56 |
+| Storage Role        | 11242881 |
+| Curator Role        | 7616125.00 |
+| Operations Role     | 18811221 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round17_1789200-1889999_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 3566666 |
 | Bounties paid       | 0 |
 | Validator Role      | 14740861 |
-| Storage Role        | 11687308.05 |
-| Curator Role        | 8469915.97 |
-| Operations Role     | 22186139.9 |
+| Storage Role        | 9956803 |
+| Curator Role        | 7000850.00 |
+| Operations Role     | 17497400 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round18_1890000-1990799_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 51216981 |
 | Bounties paid       | 13275805 |
 | Validator Role      | 12241670 |
-| Storage Role        | 11561085.31 |
-| Curator Role        | 8469915.97 |
-| Operations Role     | 12320857.77 |
+| Storage Role        | 8707707 |
+| Curator Role        | 8470000.00 |
+| Operations Role     | 9182695 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round19_1990800-2091599_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 36676575 |
 | Bounties paid       | 29746998 |
 | Validator Role      | 13934248 |
-| Storage Role        | 11692152.01 |
-| Curator Role        | 8766713.03 |
-| Operations Role     | 12669874.31 |
+| Storage Role        | 11687587 |
+| Curator Role        | 8554440.00 |
+| Operations Role     | 11691300 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round20_2091600-2192399_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 32923557 |
 | Bounties paid       | 23923557 |
 | Validator Role      | 11031708 |
-| Storage Role        | 11947509.47 |
-| Curator Role        | 7586524.74 |
-| Operations Role     | 11269888.19 |
+| Storage Role        | 7864628 |
+| Curator Role        | 8298500.00 |
+| Operations Role     | 9940000 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round21_2192400-2293199_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 38008919 |
 | Bounties paid       | 29097645 |
 | Validator Role      | 16566109 |
-| Storage Role        | 10203126.78 |
-| Curator Role        | 7159556.97 |
-| Operations Role     | 11269888.19 |
+| Storage Role        | 8990828 |
+| Curator Role        | 7226036.00 |
+| Operations Role     | 8220000 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round22_2293200-2393999_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 16449268 |
 | Bounties paid       | 12449799 |
 | Validator Role      | 11388562 |
-| Storage Role        | 9836190.42 |
-| Curator Role        | 5975280.72 |
-| Operations Role     | 13918157.92 |
+| Storage Role        | 5934713 |
+| Curator Role        | 6514935.00 |
+| Operations Role     | 11455596 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round23_2394000-2494799_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 17220110 |
 | Bounties paid       | 10849429 |
 | Validator Role      | 11071874 |
-| Storage Role        | 4556114.8 |
-| Curator Role        | 5975280.72 |
-| Operations Role     | 14478124.37 |
+| Storage Role        | 4744736 |
+| Curator Role        | 5975340.00 |
+| Operations Role     | 11055439 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round24_2494800-2595599_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 11246267 |
 | Bounties paid       | 6156716 |
 | Validator Role      | 10571855 |
-| Storage Role        | 4556114.8 |
-| Curator Role        | 5975280.72 |
-| Operations Role     | 14478124.37 |
+| Storage Role        | 4419897 |
+| Curator Role        | 5975340.00 |
+| Operations Role     | 5046080 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round25_2595600-2696399_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 34664099 |
 | Bounties paid       | 32748391 |
 | Validator Role      | 11152787 |
-| Storage Role        | 4556114.8 |
-| Curator Role        | 5975280.72 |
-| Operations Role     | 15458058.64 |
+| Storage Role        | 4393441 |
+| Curator Role        | 5975340.00 |
+| Operations Role     | 9407590 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round26_2696400-2782799_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 23882485 |
 | Bounties paid       | 16925509 |
 | Validator Role      | 7406957 |
-| Storage Role        | 3905234.8 |
-| Curator Role        | 5121660.72 |
-| Operations Role     | 13489691.87 |
+| Storage Role        | 3905280 |
+| Curator Role        | 5121720.00 |
+| Operations Role     | 10827026 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 166 - 0
council/tokenomics/sumer-4/Council_Round27_2782800-2883599_Tokenomics_Report.md

@@ -0,0 +1,166 @@
+# Tokenomics + Network Report
+This is a report which explains the current state of the Joystream network in numbers. It pulls figures from the chain and tries to provide a basic level of information about the network, tokens and more. 
+
+## 1.0 Basic Information
+* Block range: 2782800 - 2883599
+* Date Range: 10/18/2021 - 10/26/2021
+* Council session #: 27
+
+## 2.0 Tokenomics
+### 2.1 Token generation breakdown
+| Property            | Start Block | End Block | % Change |
+|---------------------|--------------|--------------|----------|
+| Total Tokens Minted |  1723332699 | 1810940381 | 5.08 |
+| USD Pool |  44222.48 | 46752.63 | 5.72 |
+
+| Property            | Value        |
+|---------------------|--------------|
+| Total Tokens Burned | 76352100 |
+| Spending Proposals (Executed) | 33126088 |
+| Bounties paid       | 33126088 |
+| Validator Role      | 13954081 |
+| Storage Role        | 4556160 |
+| Curator Role        | 5975340.00 |
+| Operations Role     | 14524458 |
+
+### 2.2 Fiat Pool
+| Property            | Start Block, USD | End Block, USD | % Change |
+|---------------------|--------------|--------------|----------|
+| USD Pool | 44222.48 | 46752.63 | 5.72 |
+
+| Refill, USD | Reason | Block # |
+|---------------------|--------------|--------------|
+| 2245 | kpi-sumer-26 | 2864078 |
+| 2015 | recurring-sumer-26 | 2864114 |
+
+
+### 2.3 Mints
+| Property                    | Start Block           | End Block | % Change |
+|-----------------------------|-----------------------|--------------|----------|
+| Council Mint Total Minted   | 781151882  | 819137970 |4.86 |
+| Curator Mint Total Minted   | 163030373 | 169005713 | 3.67 |
+| Storage Mint Total Minted   | 159616204 | 164172364 | 2.85 |
+| Operations Mint Total Minted | 164098381 | 178622839 | 8.85 |
+
+
+### 2.4 tJOY Inflation
+
+* Start Block Exchange Rate, USD/1M tJOY: 25.80
+* End Block Exchange Rate, USD/1M tJOY: 25.94
+* Inflation, %: -0.55
+
+Negative value indicates deflation
+
+## 3.0 Council
+* Council session #: 27
+* Number of council members: 20
+* Total number of proposals: 30
+* Total number of Approved proposals: 24
+
+### 3.1 Elections
+| Property                    | Start Block  |
+|-----------------------------|--------------|
+| Total Applicants            | 37 |
+| Total Applicant Stake       | 168076122 |
+| Total Votes                 | 59 |
+
+## 4 Roles
+### 4.1 Validator Information
+* Block generation time (average): 6.06
+
+| Property                   | Start Block | End Block | % Change |
+|----------------------------|--------------|--------------|----------|
+| Number of Validators       | 92 / 105 | 96 / 105 | 4.35 |
+| Validator Total Stake      | 247946630 | 273061817 | 10.13 |
+
+
+### 4.2 Storage Role
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Storage Workers | 11 | 11 | 0 |
+| Total Storage Stake (workers + lead) | 1100000 | 1100000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 3 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 4 | 0.4 | 16.4 |
+| 4 | [@julysake](https://pioneer.joystreamstats.live/#/members/julysake) | active | 4 | 0.4 | 16.2 |
+| 6 | [@kalpakci](https://pioneer.joystreamstats.live/#/members/kalpakci) | active | 4 | 0.4 | 16.5 |
+| 15 | [@maxlevush](https://pioneer.joystreamstats.live/#/members/maxlevush) | active | 4 | 0.4 | 11.8 |
+| 16 | [@joyval](https://pioneer.joystreamstats.live/#/members/joyval) | active | 4 | 0.4 | 12.1 |
+| 17 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 4 | 0.4 | 11.7 |
+| 18 | [@godshunter](https://pioneer.joystreamstats.live/#/members/godshunter) | active | 4 | 0.4 | 9.3 |
+| 19 | [@bwhm0](https://pioneer.joystreamstats.live/#/members/bwhm0) | active | 0 | 0.0 | 0.0 |
+| 21 | [@seainvestor](https://pioneer.joystreamstats.live/#/members/seainvestor) | active | 4 | 0.4 | 6.0 |
+| 22 | [@0x2bc](https://pioneer.joystreamstats.live/#/members/0x2bc) | active | 16 | 1.6 | 9.3 |
+
+
+### 4.3 Curator Role
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Curators      | 7 | 7 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 7 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 0 | 0.0 | 10.4 |
+| 16 | [@kiraa](https://pioneer.joystreamstats.live/#/members/kiraa) | active | 8 | 0.8 | 15.1 |
+| 18 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 8 | 0.8 | 12.9 |
+| 19 | [@kadyrovs](https://pioneer.joystreamstats.live/#/members/kadyrovs) | active | 8 | 0.8 | 10.2 |
+| 20 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 8 | 0.8 | 10.2 |
+| 21 | [@laura](https://pioneer.joystreamstats.live/#/members/laura) | active | 20 | 2.0 | 21.6 |
+| 22 | [@igrex](https://pioneer.joystreamstats.live/#/members/igrex) | active | 8 | 0.8 | 8.4 |
+
+
+### 4.4 Operations Role
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 24 | 25 | 4.17 |
+| Total Operations Stake (workers + lead) | 2150000 | 2150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 2.5 | 37.4 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.3 | 11.1 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 28 | 2.4 | 36.8 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 1 | 0.1 | 12.7 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 14 | 0.4 | 11.2 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 1.3 | 10.6 |
+| 21 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 7 | 0.6 | 1.3 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 4 | 0.4 | 0.6 |
+| 23 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 6 | 0.5 | 1.9 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 3 | 0.3 | 0.5 |
+| 25 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 27 | [@chasil](https://pioneer.joystreamstats.live/#/members/chasil) | active | 0 | 0.0 | 0.0 |
+| 28 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 30 | [@metralunab](https://pioneer.joystreamstats.live/#/members/metralunab) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 0 | 0.0 | 0.0 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.3 | 1.2 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 0 | 0.0 | 0.0 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 56 | 4.8 | 21.2 |
+| 35 | [@kriptos](https://pioneer.joystreamstats.live/#/members/kriptos) | active | 0 | 0.0 | 0.0 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 4 | 0.4 | 0.6 |
+| 37 | [@surpaul](https://pioneer.joystreamstats.live/#/members/surpaul) | active | 0 | 0.0 | 0.0 |
+| 38 | [@allyes](https://pioneer.joystreamstats.live/#/members/allyes) | active | 0 | 0.0 | 0.0 |
+| 39 | [@whitebarbie](https://pioneer.joystreamstats.live/#/members/whitebarbie) | active | 14 | 0.5 | 0.5 |
+
+
+## 5.0 User Generated Content
+### 5.1 Membership Information
+| Property          | Start Block | End Block | % Change |
+|-------------------|--------------|--------------|----------|
+| Number of members | 3018|  3034 | 0.53 |
+
+### 5.2 Media & Uploads
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of uploads       | 7024 | 7214  |  2.71 |
+| Size of content (MB)    |  915690.03 |  949049.76 | 3.64 |
+| Number of channels      |  526 | 537 | 2.09 |
+
+### 5.3 Forum Activity
+| Property          | Start Block | End Block | % Change |
+|-------------------|--------------|--------------|----------|
+| Number of categories | 57 | 57 | 0 |
+| Number of threads    | 686 | 707 | 3.06 |
+| Number of posts      | 6344 | 6687 | 5.41 |

+ 169 - 0
council/tokenomics/sumer-4/Council_Round28_2883600-2984399_Tokenomics_Report.md

@@ -0,0 +1,169 @@
+# Tokenomics + Network Report
+This is a report which explains the current state of the Joystream network in numbers. It pulls figures from the chain and tries to provide a basic level of information about the network, tokens and more. 
+
+## 1.0 Basic Information
+* Block range: 2883600 - 2984399
+* Date Range: 10/26/2021 - 11/2/2021
+* Council session #: 28
+
+## 2.0 Tokenomics
+### 2.1 Token generation breakdown
+| Property            | Start Block | End Block | % Change |
+|---------------------|--------------|--------------|----------|
+| Total Tokens Minted |  1810940381 | 1961230176 | 8.3 |
+| USD Pool |  46726.82 | 45073.92 | -3.54 |
+
+| Property            | Value        |
+|---------------------|--------------|
+| Total Tokens Burned | 70560000 |
+| Spending Proposals (Executed) | 16718064 |
+| Bounties paid       | 11881188 |
+| Validator Role      | 7702182 |
+| Storage Role        | 2603532 |
+| Curator Role        | 5975340.00 |
+| Operations Role     | 6965534 |
+
+### 2.2 Fiat Pool
+| Property            | Start Block, USD | End Block, USD | % Change |
+|---------------------|--------------|--------------|----------|
+| USD Pool | 46726.82 | 45073.92 | -3.54 |
+
+
+
+### 2.2 Fiat Pool
+| Property            | Start Block, USD | End Block, USD | % Change |
+|---------------------|--------------|--------------|----------|
+| USD Pool | 46726.82 | 45073.92 | -3.54 |
+
+
+
+### 2.3 Mints
+| Property                    | Start Block           | End Block | % Change |
+|-----------------------------|-----------------------|--------------|----------|
+| Council Mint Total Minted   | 819137970  | 840716034 |2.63 |
+| Curator Mint Total Minted   | 169005713 | 174981053 | 3.54 |
+| Storage Mint Total Minted   | 164172364 | 166775896 | 1.59 |
+| Operations Mint Total Minted | 178622839 | 185588373 | 3.9 |
+
+
+### 2.4 tJOY Inflation
+
+* Start Block Exchange Rate, USD/1M tJOY: 25.81
+* End Block Exchange Rate, USD/1M tJOY: 23.02
+* Inflation, %: 12.1
+
+Negative value indicates deflation
+
+## 3.0 Council
+* Council session #: 28
+* Number of council members: 20
+* Total number of proposals: 28
+* Total number of Approved proposals: 25
+
+### 3.1 Elections
+| Property                    | Start Block  |
+|-----------------------------|--------------|
+| Total Applicants            | 34 |
+| Total Applicant Stake       | 135271445 |
+| Total Votes                 | 69 |
+
+## 4 Roles
+### 4.1 Validator Information
+* Block generation time (average): 6.12
+
+| Property                   | Start Block | End Block | % Change |
+|----------------------------|--------------|--------------|----------|
+| Number of Validators       | 96 / 105 | 88 / 105 | -8.33 |
+| Validator Total Stake      | 273061817 | 283971303 | 4 |
+
+
+### 4.2 Storage Role
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Storage Workers | 11 | 11 | 0 |
+| Total Storage Stake (workers + lead) | 1100000 | 1100000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 3 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 4 | 0.2 | 16.6 |
+| 4 | [@julysake](https://pioneer.joystreamstats.live/#/members/julysake) | active | 4 | 0.2 | 16.4 |
+| 6 | [@kalpakci](https://pioneer.joystreamstats.live/#/members/kalpakci) | active | 4 | 0.2 | 16.7 |
+| 15 | [@maxlevush](https://pioneer.joystreamstats.live/#/members/maxlevush) | active | 4 | 0.2 | 12.0 |
+| 16 | [@joyval](https://pioneer.joystreamstats.live/#/members/joyval) | active | 4 | 0.2 | 12.3 |
+| 17 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 4 | 0.2 | 11.9 |
+| 18 | [@godshunter](https://pioneer.joystreamstats.live/#/members/godshunter) | active | 4 | 0.2 | 9.5 |
+| 19 | [@bwhm0](https://pioneer.joystreamstats.live/#/members/bwhm0) | active | 0 | 0.0 | 0.0 |
+| 21 | [@seainvestor](https://pioneer.joystreamstats.live/#/members/seainvestor) | active | 4 | 0.2 | 6.3 |
+| 22 | [@0x2bc](https://pioneer.joystreamstats.live/#/members/0x2bc) | active | 16 | 0.9 | 10.2 |
+
+
+### 4.3 Curator Role
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Curators      | 7 | 7 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 7 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 0 | 0.0 | 10.4 |
+| 16 | [@kiraa](https://pioneer.joystreamstats.live/#/members/kiraa) | active | 8 | 0.8 | 15.9 |
+| 18 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 8 | 0.8 | 13.7 |
+| 19 | [@kadyrovs](https://pioneer.joystreamstats.live/#/members/kadyrovs) | active | 8 | 0.8 | 11.0 |
+| 20 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 8 | 0.8 | 11.0 |
+| 21 | [@laura](https://pioneer.joystreamstats.live/#/members/laura) | active | 20 | 2.0 | 23.6 |
+| 22 | [@igrex](https://pioneer.joystreamstats.live/#/members/igrex) | active | 8 | 0.8 | 9.2 |
+
+
+### 4.4 Operations Role
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 25 | 25 | 0 |
+| Total Operations Stake (workers + lead) | 2150000 | 2150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 1.1 | 38.5 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.1 | 11.2 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 28 | 1.1 | 37.9 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 1 | 0.1 | 12.7 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 14 | 0.6 | 11.7 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 0.5 | 11.1 |
+| 21 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 7 | 0.3 | 1.6 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 4 | 0.2 | 0.8 |
+| 23 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 6 | 0.2 | 2.1 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 3 | 0.1 | 0.7 |
+| 25 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 27 | [@chasil](https://pioneer.joystreamstats.live/#/members/chasil) | active | 0 | 0.0 | 0.0 |
+| 28 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 30 | [@metralunab](https://pioneer.joystreamstats.live/#/members/metralunab) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 0 | 0.0 | 0.0 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.1 | 1.3 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 0 | 0.0 | 0.0 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 56 | 2.0 | 23.2 |
+| 35 | [@kriptos](https://pioneer.joystreamstats.live/#/members/kriptos) | active | 0 | 0.0 | 0.0 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 4 | 0.1 | 0.8 |
+| 37 | [@surpaul](https://pioneer.joystreamstats.live/#/members/surpaul) | active | 0 | 0.0 | 0.0 |
+| 38 | [@allyes](https://pioneer.joystreamstats.live/#/members/allyes) | active | 0 | 0.0 | 0.0 |
+| 39 | [@whitebarbie](https://pioneer.joystreamstats.live/#/members/whitebarbie) | active | 14 | 0.5 | 0.9 |
+
+
+## 5.0 User Generated Content
+### 5.1 Membership Information
+| Property          | Start Block | End Block | % Change |
+|-------------------|--------------|--------------|----------|
+| Number of members | 3034|  3048 | 0.46 |
+
+### 5.2 Media & Uploads
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of uploads       | 7214 | 7370  |  2.16 |
+| Size of content (MB)    |  949049.76 |  967808.61 | 1.98 |
+| Number of channels      |  537 | 541 | 0.74 |
+
+### 5.3 Forum Activity
+| Property          | Start Block | End Block | % Change |
+|-------------------|--------------|--------------|----------|
+| Number of categories | 57 | 57 | 0 |
+| Number of threads    | 707 | 726 | 2.69 |
+| Number of posts      | 6687 | 7009 | 4.82 |

+ 167 - 0
council/tokenomics/sumer-4/Council_Round29_2984400-3085199_Tokenomics_Report.md

@@ -0,0 +1,167 @@
+# Tokenomics + Network Report
+This is a report which explains the current state of the Joystream network in numbers. It pulls figures from the chain and tries to provide a basic level of information about the network, tokens and more. 
+
+## 1.0 Basic Information
+* Block range: 2984400 - 3085199
+* Date Range: 11/2/2021 - 11/9/2021
+* Council session #: 29
+
+## 2.0 Tokenomics
+### 2.1 Token generation breakdown
+| Property            | Start Block | End Block | % Change |
+|---------------------|--------------|--------------|----------|
+| Total Tokens Minted |  1961230176 | 2029325955 | 3.47 |
+| USD Pool |  45065.04 | 50570.92 | 12.22 |
+
+| Property            | Value        |
+|---------------------|--------------|
+| Total Tokens Burned | 55886209 |
+| Spending Proposals (Executed) | 61824480 |
+| Bounties paid       | 51979520 |
+| Validator Role      | 13511525 |
+| Storage Role        | 4556160 |
+| Curator Role        | 5975340.00 |
+| Operations Role     | 14927062 |
+
+### 2.2 Fiat Pool
+| Property            | Start Block, USD | End Block, USD | % Change |
+|---------------------|--------------|--------------|----------|
+| USD Pool | 45065.04 | 50570.92 | 12.22 |
+
+| Refill, USD | Reason | Block # |
+|---------------------|--------------|--------------|
+| 1941 | kpi-sumer-28 | 3064011 |
+| 2062 | recurring-sumer-28 | 3064017 |
+| 2804 | kpi-sumer-27 | 3075071 |
+
+
+### 2.3 Mints
+| Property                    | Start Block           | End Block | % Change |
+|-----------------------------|-----------------------|--------------|----------|
+| Council Mint Total Minted   | 840716034  | 907400514 |7.93 |
+| Curator Mint Total Minted   | 174981053 | 180956393 | 3.41 |
+| Storage Mint Total Minted   | 166775896 | 171332056 | 2.73 |
+| Operations Mint Total Minted | 185588373 | 200515435 | 8.04 |
+
+
+### 2.4 tJOY Inflation
+
+* Start Block Exchange Rate, USD/1M tJOY: 22.98
+* End Block Exchange Rate, USD/1M tJOY: 24.96
+* Inflation, %: -7.92
+
+Negative value indicates deflation
+
+## 3.0 Council
+* Council session #: 29
+* Number of council members: 20
+* Total number of proposals: 25
+* Total number of Approved proposals: 23
+
+### 3.1 Elections
+| Property                    | Start Block  |
+|-----------------------------|--------------|
+| Total Applicants            | 38 |
+| Total Applicant Stake       | 164091811 |
+| Total Votes                 | 58 |
+
+## 4 Roles
+### 4.1 Validator Information
+* Block generation time (average): 6.18
+
+| Property                   | Start Block | End Block | % Change |
+|----------------------------|--------------|--------------|----------|
+| Number of Validators       | 88 / 105 | 83 / 105 | -5.68 |
+| Validator Total Stake      | 283971303 | 301744985 | 6.26 |
+
+
+### 4.2 Storage Role
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Storage Workers | 11 | 11 | 0 |
+| Total Storage Stake (workers + lead) | 1100000 | 1100000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 3 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 4 | 0.4 | 17.0 |
+| 4 | [@julysake](https://pioneer.joystreamstats.live/#/members/julysake) | active | 4 | 0.4 | 16.8 |
+| 6 | [@kalpakci](https://pioneer.joystreamstats.live/#/members/kalpakci) | active | 4 | 0.4 | 17.0 |
+| 15 | [@maxlevush](https://pioneer.joystreamstats.live/#/members/maxlevush) | active | 4 | 0.4 | 12.4 |
+| 16 | [@joyval](https://pioneer.joystreamstats.live/#/members/joyval) | active | 4 | 0.4 | 12.7 |
+| 17 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 4 | 0.4 | 12.3 |
+| 18 | [@godshunter](https://pioneer.joystreamstats.live/#/members/godshunter) | active | 4 | 0.4 | 9.9 |
+| 19 | [@bwhm0](https://pioneer.joystreamstats.live/#/members/bwhm0) | active | 0 | 0.0 | 0.0 |
+| 21 | [@seainvestor](https://pioneer.joystreamstats.live/#/members/seainvestor) | active | 4 | 0.4 | 6.6 |
+| 22 | [@0x2bc](https://pioneer.joystreamstats.live/#/members/0x2bc) | active | 16 | 1.6 | 11.8 |
+
+
+### 4.3 Curator Role
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Curators      | 7 | 7 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 7 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 0 | 0.0 | 10.4 |
+| 16 | [@kiraa](https://pioneer.joystreamstats.live/#/members/kiraa) | active | 8 | 0.8 | 16.7 |
+| 18 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 8 | 0.8 | 14.5 |
+| 19 | [@kadyrovs](https://pioneer.joystreamstats.live/#/members/kadyrovs) | active | 8 | 0.8 | 11.8 |
+| 20 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 8 | 0.8 | 11.8 |
+| 21 | [@laura](https://pioneer.joystreamstats.live/#/members/laura) | active | 20 | 2.0 | 25.6 |
+| 22 | [@igrex](https://pioneer.joystreamstats.live/#/members/igrex) | active | 8 | 0.8 | 10.0 |
+
+
+### 4.4 Operations Role
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 25 | 25 | 0 |
+| Total Operations Stake (workers + lead) | 2150000 | 2150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 1.9 | 40.4 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.2 | 11.4 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 28 | 1.9 | 39.8 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 1 | 0.1 | 12.8 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 14 | 0.9 | 12.6 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 0.9 | 12.1 |
+| 21 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 7 | 0.4 | 2.0 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 4 | 0.3 | 1.0 |
+| 23 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 6 | 0.4 | 2.5 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 3 | 0.2 | 0.8 |
+| 25 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 27 | [@chasil](https://pioneer.joystreamstats.live/#/members/chasil) | active | 0 | 0.0 | 0.0 |
+| 28 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 30 | [@metralunab](https://pioneer.joystreamstats.live/#/members/metralunab) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 0 | 0.0 | 0.0 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.2 | 1.5 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 0 | 0.0 | 0.0 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 111 | 6.4 | 29.6 |
+| 35 | [@kriptos](https://pioneer.joystreamstats.live/#/members/kriptos) | active | 0 | 0.0 | 0.0 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 4 | 0.3 | 1.1 |
+| 37 | [@surpaul](https://pioneer.joystreamstats.live/#/members/surpaul) | active | 0 | 0.0 | 0.0 |
+| 38 | [@allyes](https://pioneer.joystreamstats.live/#/members/allyes) | active | 0 | 0.0 | 0.0 |
+| 39 | [@whitebarbie](https://pioneer.joystreamstats.live/#/members/whitebarbie) | active | 14 | 0.9 | 1.9 |
+
+
+## 5.0 User Generated Content
+### 5.1 Membership Information
+| Property          | Start Block | End Block | % Change |
+|-------------------|--------------|--------------|----------|
+| Number of members | 3048|  3056 | 0.26 |
+
+### 5.2 Media & Uploads
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of uploads       | 7370 | 7510  |  1.9 |
+| Size of content (MB)    |  967808.61 |  992751.47 | 2.58 |
+| Number of channels      |  541 | 544 | 0.55 |
+
+### 5.3 Forum Activity
+| Property          | Start Block | End Block | % Change |
+|-------------------|--------------|--------------|----------|
+| Number of categories | 57 | 57 | 0 |
+| Number of threads    | 726 | 741 | 2.07 |
+| Number of posts      | 7009 | 7280 | 3.87 |

+ 163 - 0
council/tokenomics/sumer-4/Council_Round30_3085200-3185999_Tokenomics_Report.md

@@ -0,0 +1,163 @@
+# Tokenomics + Network Report
+This is a report which explains the current state of the Joystream network in numbers. It pulls figures from the chain and tries to provide a basic level of information about the network, tokens and more. 
+
+## 1.0 Basic Information
+* Block range: 3085200 - 3185999
+* Date Range: 11/9/2021 - 11/16/2021
+* Council session #: 30
+
+## 2.0 Tokenomics
+### 2.1 Token generation breakdown
+| Property            | Start Block | End Block | % Change |
+|---------------------|--------------|--------------|----------|
+| Total Tokens Minted |  2029325955 | 2062950894 | 1.66 |
+| USD Pool |  50531.83 | 60548.70 | 19.82 |
+
+| Property            | Value        |
+|---------------------|--------------|
+| Total Tokens Burned | 132379200 |
+| Spending Proposals (Executed) | 20445886 |
+| Bounties paid       | 15114160 |
+| Validator Role      | 16295731 |
+| Storage Role        | 4340529 |
+| Curator Role        | 5975340.00 |
+| Operations Role     | 13081427 |
+
+### 2.2 Fiat Pool
+| Property            | Start Block, USD | End Block, USD | % Change |
+|---------------------|--------------|--------------|----------|
+| USD Pool | 50531.83 | 60548.70 | 19.82 |
+
+| Refill, USD | Reason | Block # |
+|---------------------|--------------|--------------|
+| 191 | Bounty 9 | 3106978 |
+| 1447 | Bounty 18 | 3106981 |
+| 900 | Bounty 21 | 3106983 |
+| 1664 | Bounty 24 | 3106985 |
+| 2015 | recurring-sumer-27 | 3108499 |
+| 3107 | kpi-sumer-14/18 | 3132782 |
+| 2567 | kpi-sumer-29 | 3177871 |
+| 1842 | recurring-sumer-29 | 3177877 |
+
+
+### 2.3 Mints
+| Property                    | Start Block           | End Block | % Change |
+|-----------------------------|-----------------------|--------------|----------|
+| Council Mint Total Minted   | 907400514  | 932706400 |2.79 |
+| Curator Mint Total Minted   | 180956393 | 186931733 | 3.3 |
+| Storage Mint Total Minted   | 171332056 | 175672585 | 2.53 |
+| Operations Mint Total Minted | 200515435 | 213596862 | 6.52 |
+
+
+### 2.4 tJOY Inflation
+
+* Start Block Exchange Rate, USD/1M tJOY: 24.90
+* End Block Exchange Rate, USD/1M tJOY: 29.35
+* Inflation, %: -15.16
+
+Negative value indicates deflation
+
+## 3.0 Council
+* Council session #: 30
+* Number of council members: 20
+* Total number of proposals: 28
+* Total number of Approved proposals: 18
+
+### 3.1 Elections
+| Property                    | Start Block  |
+|-----------------------------|--------------|
+| Total Applicants            | 37 |
+| Total Applicant Stake       | 148216111 |
+| Total Votes                 | 63 |
+
+## 4 Roles
+### 4.1 Validator Information
+* Block generation time (average): 6.17
+
+| Property                   | Start Block | End Block | % Change |
+|----------------------------|--------------|--------------|----------|
+| Number of Validators       | 83 / 105 | 85 / 105 | 2.41 |
+| Validator Total Stake      | 301744985 | 377268795 | 25.03 |
+
+
+### 4.2 Storage Role
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Storage Workers | 11 | 11 | 0 |
+| Total Storage Stake (workers + lead) | 1100000 | 1100000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 3 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 4 | 0.4 | 17.3 |
+| 4 | [@julysake](https://pioneer.joystreamstats.live/#/members/julysake) | active | 4 | 0.3 | 17.2 |
+| 6 | [@kalpakci](https://pioneer.joystreamstats.live/#/members/kalpakci) | active | 4 | 0.4 | 17.4 |
+| 15 | [@maxlevush](https://pioneer.joystreamstats.live/#/members/maxlevush) | active | 4 | 0.3 | 12.7 |
+| 16 | [@joyval](https://pioneer.joystreamstats.live/#/members/joyval) | active | 4 | 0.4 | 13.0 |
+| 17 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 4 | 0.3 | 12.6 |
+| 18 | [@godshunter](https://pioneer.joystreamstats.live/#/members/godshunter) | active | 4 | 0.3 | 10.2 |
+| 19 | [@bwhm0](https://pioneer.joystreamstats.live/#/members/bwhm0) | active | 0 | 0.0 | 0.0 |
+| 21 | [@seainvestor](https://pioneer.joystreamstats.live/#/members/seainvestor) | active | 4 | 0.4 | 7.0 |
+| 22 | [@0x2bc](https://pioneer.joystreamstats.live/#/members/0x2bc) | active | 16 | 1.5 | 13.3 |
+
+
+### 4.3 Curator Role
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Curators      | 7 | 7 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 7 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 0 | 0.0 | 10.4 |
+| 16 | [@kiraa](https://pioneer.joystreamstats.live/#/members/kiraa) | active | 8 | 0.8 | 17.5 |
+| 18 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 8 | 0.8 | 15.3 |
+| 19 | [@kadyrovs](https://pioneer.joystreamstats.live/#/members/kadyrovs) | active | 8 | 0.8 | 12.6 |
+| 20 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 8 | 0.8 | 12.6 |
+| 21 | [@laura](https://pioneer.joystreamstats.live/#/members/laura) | active | 20 | 2.0 | 27.6 |
+| 22 | [@igrex](https://pioneer.joystreamstats.live/#/members/igrex) | active | 8 | 0.8 | 10.8 |
+
+
+### 4.4 Operations Role
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 25 | 16 | -36 |
+| Total Operations Stake (workers + lead) | 2150000 | 1150000 | -46.51 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 2.0 | 42.4 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.2 | 11.6 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 14 | 1.5 | 41.3 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 1 | 0.1 | 13.0 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 3 | 0.5 | 13.1 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 1.0 | 13.1 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 7 | 0.4 | 1.4 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 3 | 0.2 | 1.0 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 3 | 0.1 | 0.1 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.2 | 1.7 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 14 | 0.9 | 0.9 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 28 | 4.6 | 34.2 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 4 | 0.3 | 1.4 |
+| 39 | [@whitebarbie](https://pioneer.joystreamstats.live/#/members/whitebarbie) | active | 14 | 0.9 | 2.8 |
+
+
+## 5.0 User Generated Content
+### 5.1 Membership Information
+| Property          | Start Block | End Block | % Change |
+|-------------------|--------------|--------------|----------|
+| Number of members | 3056|  3074 | 0.59 |
+
+### 5.2 Media & Uploads
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of uploads       | 7510 | 7640  |  1.73 |
+| Size of content (MB)    |  992751.47 |  1019172.18 | 2.66 |
+| Number of channels      |  544 | 552 | 1.47 |
+
+### 5.3 Forum Activity
+| Property          | Start Block | End Block | % Change |
+|-------------------|--------------|--------------|----------|
+| Number of categories | 57 | 57 | 0 |
+| Number of threads    | 741 | 758 | 2.29 |
+| Number of posts      | 7280 | 7563 | 3.89 |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round7_781200-881999_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 8633519 |
 | Bounties paid       | 8633519 |
 | Validator Role      | 9957579 |
-| Storage Role        | 4031260.01 |
-| Curator Role        | 7615084.45 |
-| Operations Role     | 923990.83 |
+| Storage Role        | 3993021 |
+| Curator Role        | 4092847.00 |
+| Operations Role     | 33000 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round8_882000-982799_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 23793787 |
 | Bounties paid       | 23793787 |
 | Validator Role      | 10311013 |
-| Storage Role        | 3753502.76 |
-| Curator Role        | 7615084.45 |
-| Operations Role     | 923990.83 |
+| Storage Role        | 3813060 |
+| Curator Role        | 7495460.00 |
+| Operations Role     | 924000 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 3 - 3
council/tokenomics/sumer-4/Council_Round9_982800-1083599_Tokenomics_Report.md

@@ -19,9 +19,9 @@ This is a report which explains the current state of the Joystream network in nu
 | Spending Proposals (Executed) | 23602198 |
 | Bounties paid       | 23602198 |
 | Validator Role      | 8148871 |
-| Storage Role        | 3837501.93 |
-| Curator Role        | 7712803.48 |
-| Operations Role     | 923990.83 |
+| Storage Role        | 2917540 |
+| Curator Role        | 7705900.00 |
+| Operations Role     | 924000 |
 
 ### 2.2 Fiat Pool
 | Property            | Start Block, USD | End Block, USD | % Change |

+ 109 - 0
governance/Storage_WG_OKR_2.md

@@ -0,0 +1,109 @@
+# Storage working group Objectives and Key Results - Part 2
+
+### Overview
+
+Main quality criteria for Storage Providers:
+- Speed
+- Capacity
+- Reliability
+- Geographic Location
+- Resilience
+
+Detailed quality criteria for Storage Providers were outlined [here](https://github.com/Joystream/community-repo/blob/master/governance/Storage_WG_OKR.md).
+
+Based on that, a new OKR system with “quantitative” criteria was developed. 
+
+New OKRs are applicable to every Storage provider from the Strorage Working Group.
+
+### Sanctions and Bonuses 
+
+In the event that a Storage Provider has violated our new OKRs, some sanctions will be assigned. The goal of assigning sanctions is to help Storage Providers understand the impact their actions have on Storage WG functioning and Atlas' users experience, prevent future violations, and repair any harm caused. Sanctions are not meant to punish, but to provide growth and development so better choices can be made in the future.
+
+The following guidelines are not absolute, but provide an outline for potential sanctions based on the specific violation. This allows for greater consistency across our Storage standards. Sanctions are assigned to be effective and appropriate based on the circumstances of the individual Storage provider and incident, including aggravating or mitigating factors, and the Storage providers' previous record within Storage WG history.
+
+## OKRs
+
+### KR6 - Uptime
+
+#### Definition
+
+Uptime is the percentage of time when the server is available.
+
+#### Goal 
+
+Any downtime should be avoided as much as possible.
+
+#### Assessment criteria
+
+| Condition          | Action<sup>*</sup>                             |
+| ------------------ | --------------------------------------------- |
+| Uptime > 90%               | No impact on salary                     |
+| Uptime < 90%               | Salary can be decreased by 20%          |
+| Uptime < 50%               | Storage provider can be replaced        |
+
+
+| Condition                                                   | Action<sup>*</sup>              |
+| ----------------------------------------------------------- | -------------------------------------- |
+| Node is down & URL is not set to empty < 12 hours  | No impact on salary                    |
+| Node is down & URL is not set to empty > 12 hours  | Salary can be decreased by 20%      |
+| Node is down & URL is not set to empty > 48 hours  | Storage provider can be replaced     |
+
+<sup>*</sup> Sanctions (salary impacts) are not compounded. If there are few sanctions, the most strict one should be applied.
+Sanctions can only be removed after 1 month from the incident.
+
+#### Data source
+
+- [Dashboard](http://194.163.131.85:3000/d/pIinMgN7k/joystream-monitoring?orgId=1&refresh=10s&from=now-7d&to=now) 
+- [Helios Report Archive](https://joystreamstats.live/static/helios/)
+
+### KR4 - Free storage
+
+#### Definition
+
+Free storage space on Storage provider node that is instantly available for any purposes.
+
+#### Goal 
+
+Maintain an extra storage capacity, in order to handle the increased needs of the platform.
+Storage providers must maintain as much free space as has been uploaded during the last three months.
+
+#### Assessment criteria
+
+| Condition                                                                        | Action<sup>*</sup>              |
+| ------------------------------------------------------------------------------- | -------------------------------------- |
+| FreeStorageSpace  > [ContentDirectory<sub>now</sub>-ContentDirectory<sub>3 months ago</sub>]           | No impact on salary                    |
+| FreeStorageSpace  < [ContentDirectory<sub>now</sub>-ContentDirectory<sub>2 months ago</sub>]           | Salary can be decreased by 20%      |
+| FreeStorageSpace  < [ContentDirectory<sub>now</sub>-ContentDirectory<sub>1 months ago</sub>] / 4   |  Storage provider can be replaced     |                                        |
+ 
+ 
+ #### Data source
+
+- Data provided by Storage Providers
+- Discord Joystream-bot (shows the current size of Content Directory)
+
+### KR 10 - Datacenter Diversification 
+
+#### Definition
+
+A risk management strategy when Storage providers' nodes are diversified among different data centers or autonomous system (AS).
+
+#### Goal 
+
+Maintain diversity of autonomous system in which Storage nodes are located. Diverse set of Storage nodes is crucial to the success of a well-formed blockchain network.
+
+#### Assessment criteria
+
+- If Storage nodes are in the same AS with the total concentration of nodes > 50%, the last Storage provider (SP) who joined should leave the AS. 
+- If that's not clear who is the last one to join, WG Lead will ask one of the SPs to leave the AS. 
+- If there is no change after 1 week, the chosen SP will be reduced in salary by 20%. 
+- If there is no change after 2 weeks, this SP can be replaced.  
+
+ #### Data source
+
+[Dashboard](http://194.163.131.85:3000/d/pIinMgN7k/joystream-monitoring?orgId=1&refresh=10s&from=now-7d&to=now) 
+Autonomous system information can be manually derived from the URLs (IPs) of Storage Provider's node. This information 
+
+## Bonus
+
+If any Storage provider works with no sanctions straight for 3 months, its salary can be increased by 10% in total.  
+If any Storage provider works with no sanctions straight for 6 months, its salary can be increased by 25% in total.   

+ 2 - 1
governance/continuously_updated_files.md

@@ -5,4 +5,5 @@ Some files on the community repo recieve regular minor updates and it would crea
 * `community-repo/governance/spending_proposal_categories.csv` - This file is used to categorize the spending done by the council. This document is usually updated by the Council Secretary or Deputy Council Secretary and is used to understand how funding is used on the platform. Note that it only records approved spending by the council and does not set out budgets for use.
 * `community-repo/bounties/overview/bounties-status.json` - This file is updated when new bounties are added or old bounties removed.
 * `community-repo/bounties/overview/README.md` - This file contains the table of bounties, which is updated whenever new bounties are added/approved
-* `community-repo/governance/jsg_requests.md` - This file contains a list of approved proposals that are addressed to Jsgenesis. It will be updated when proposals recieve a response.
+* `community-repo/governance/jsg_requests.md` - This file contains a list of approved proposals that are addressed to Jsgenesis. It will be updated when proposals recieve a response.
+* `community-repo/governance/council_member_discord_usernames.md` - This file contains a list of Discord and Telegram handles of Council Members, it is now being used by a bot so updating it regularly is essential.

+ 38 - 20
governance/council_member_discord_usernames.md

@@ -1,23 +1,41 @@
 This document lists out the usernames of people who sit on the council or are working group leads, which will hopefully make communication easier.
 
 
-| Joystream Username  | Discord Username | Telegram Username |
-|---------------------|------------------|-------------------|
-| tomato              | tomato           |                   |
-| freakstatic_council | freakstatic      |                   |
-| l1dev               | l1dev            |                   |
-| nexusfallout        | nexusfallout     |                   |
-| doppelganger23      | doppelganger23   |                   |
-| lopegor             | lopegor          |                   |
-| seainvestor         | Pavel-LV         |                   |
-| leet_joy            | ?                |                   |
-| blackmass           | ?                |                   |
-| supunssw            | ?                |                   |
-| fierydev            | fierydev         |                   |
-| leopold             | Leopold          |                   |
-| cheomsk             | CheOmsk          |                   |
-| sparky              | ?                |                   |
-| manipal             | ?                |                   |
-| 2themoon            | 2themoon         |                   |
-| Xandrell            | Xandrell         | merit_now         |
-| Wasabi              | IeSua#9971       | @Alladar2         |
+| Joystream Username  | Discord Username      | Discord ID         | Telegram Username   | GitHub Username |
+|---------------------|-----------------------|--------------------|---------------------|-----------------|
+| tomato              | @tomato#9464          | 811215697182326805 | @s7hhr6ugfruf       | mochet          |
+| freakstatic_council | @freakstatic#0197     | 913016053532069899 | @freakstatic        | freakstatic     |
+| l1dev               | @l1dev#4675           | 811698189182173204 | @l1                 | traumschule     |
+| nexusfallout        | @ColdGunnerX#8266     | 895309633198121070 |                     |                 |
+| doppelganger23      | @doppelganger23#1836  | 910664201389883392 |                     |                 |
+| lopegor             | @lopegor#5668         | 905835066100449301 | @Gate_gate_paragate |                 |
+| seainvestor         | @Pavel-LV#7698        | 911626955101716480 | @SeaInvestor        | PavelMoneyIn    |
+| leet_joy            | @cooloNe#6314         | 849355244566741033 | @EL33T              |                 |
+| oiclid              | @oiclid#4024          | 880407688952053781 |                     | giada42         |
+| fierydev            | @fierydev#4953        | 877163735578468352 |                     |                 |
+| leopold             | @Leopold#8689         | 843605909807824916 | @leopold89          |                 |
+| cheomsk             | @CheOmsk#9542         | 911022228731211797 | @CheOmsk            | CheOmsk         |
+| 2themoon            | @2TheMoon ッ#3371     | 893864302765801472 |                     | 2TheMooon       |
+| Xandrell            | @Xandrell#9401        | 913133796587626597 | @merit_now          | Xandrell        |
+| Wasabi              | @IeSua#9971           | 861694857172353075 | @Alladar2           | IeSua-lab       |
+| XFactorus           | @XFactorus#3606       | 913087949418164295 | @xfactorus          | XFactorus       |
+| ilich               | @Ilich#3455           | 913005494900260875 | @ilichhh            | Ilichhh         |
+| nkhlghbl            | @nkhlghbl#7752        | 909862354966151259 |                     | nkhlghbl        |
+| oxygen              | @MikeShipa#1881       | 907990276142932029 | @mikeshipa          | MikeShipa       |
+| marinag_mary        | @mary75#0325          | 913362371840446484 | @mary_mary75        | MGavrilo        |
+| art_khabibullin     | @art_khabibullin#8969 | 912784970471321670 | @art_khabibullin    | ArturBarker     |
+| zazik               | @ZAZIK#5400           | 913368396861698108 | @perspektiva13      | ZAZIK3          |
+| marat_mu            | @MarikJudo#1899       | 913351712704704552 | @МмМ                | MarikJudo       |
+| igrex               | @IgreX#0267           | 913098824338276433 | @igrex              | igrexac         |
+| isonar              | @isonar#5236          | 913370951763259422 | @isonar             | singulart       |
+| laura               | @LauraKhar#8714       | 913375388170862613 | @LauraKhar          | laura2727       |
+| ardashoff           | @ardashoff#1826       | 913132717657440317 | @ardashoff          | ardashoff       |
+| nanapa6otaet        | @nanaPa6oTaeT#8630    | 758796203671945249 | @f_ck3r0fm1nd       | nanapa6otaet    |
+| svasilenko          | @swasilenko#9850      | 913371745354920006 | @swasilenko         | swasilenko      |
+| lkskrn              | @lkskrn#8336          | 912259973050937354 | @lkskrn             | oleksanderkorn  |
+| maxlevush           | @Lelik_maxi#6419      | 912643636871700520 | @maxlevush          | maxlevush       |
+| blackmass           |                       |                    |                     |                 |
+| supunssw            | @Supun#7200           | 768544805579653140 |                     |                 |
+| sparky              | @sparky#0502          | 530302795207933955 |                     |                 |
+| manipal             |                       |                    |                     |                 |
+| kadyrovs            | @Ruslan#4019          | 913082078436941885 | @frentston          |                 |

+ 6 - 3
governance/jsg_requests.md

@@ -2,6 +2,9 @@
 
 This is a list of proposals that have been approved by the council and are address to Jsgenesis, the company developing Joystream. The Council Secretary or Deputy Secretary are responsible for keeping the list up to date.
 
-| Date | Proposal Link | Proposal Title | JSG response | Date closed |
-|---|---|---|---|---|
-| 30-Sep-21 | https://testnet.joystream.net/#/proposals/633 | JSG Request - Bounty OfficialMusicTheme | Pending | Pending |
+| Date       | Proposal Link                                                                                                                                                    | Proposal Title                           | JSG response | Date closed |
+| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- | ------------ | ----------- |
+| 30.09.2021 | [https://testnet.joystream.net/#/proposals/633](https://testnet.joystream.net/#/proposals/633)                                                                   | JSG Request - Bounty OfficialMusicTheme  | Pending      | Pending     |
+| 27.10.2021 | [https://pioneer.joystreamstats.live/#/proposals/743](https://pioneer.joystreamstats.live/#/proposals/743 "https://pioneer.joystreamstats.live/#/proposals/743") | JSG request for official bounty status   | Pending      | Pending     |
+| 23.09.2021 | [https://pioneer.joystreamstats.live/#/proposals/605](https://pioneer.joystreamstats.live/#/proposals/605)                                                       | JSG Request - Bounty #26 official status | Approved     | Approved    |
+| 13.11.2021 | https://pioneer.joystreamstats.live/#/proposals/802                                                                                                              | JSG request Sprocket - JSlogo new budget | Approved     | Approved    |

+ 220 - 18
governance/spending_proposal_categories.csv

@@ -600,7 +600,7 @@ Antioch,378,,,,,,,,,,
 Antioch,379,,,,,,,,,,
 Antioch,380,,,,,,,,,,
 Antioch,381,,,,,,,,,,
-Antioch,382,Payment for Community Bounty #19,Approved,13793103,13793103,0.000029,400,Bounties,19,,N
+Antioch,382,Payment for Community Bounty #19,Approved,13793103,13793103,0.000029,400,Bounties,19,,Y
 Antioch,383,,,,,,,,,,
 Antioch,384,,,,,,,,,,
 Antioch,385,,,,,,,,,,
@@ -673,7 +673,7 @@ Antioch,451,Payment for code development,Approved,26000000,26000000,0.00003,780,
 Antioch,452,,,,,,,,,,
 Antioch,453,,,,,,,,,,
 Antioch,454,,,,,,,,,,
-Antioch,455,Reward for @ilich for Bounty 20,Approved,13275805,13275805,0.00003013,400,Bounties,20,,N
+Antioch,455,Reward for @ilich for Bounty 20,Approved,13275805,13275805,0.00003013,400,Bounties,20,,Y
 Antioch,456,,,,,,,,,,
 Antioch,457,Storage Notifier Bot for discord,Approved,9000000,9000000,,,Tools,,,
 Antioch,458,,,,,,,,,,
@@ -702,10 +702,10 @@ Antioch,480,,,,,,,,,,
 Antioch,481,,,,,,,,,,
 Antioch,482,,,,,,,,,,
 Antioch,483,,,,,,,,,,
-Antioch,484,Payment for @andybut for Bounty #9,Approved,3988800,3988800,0.00002858,114,Bounties,9,,N
+Antioch,484,Payment for @andybut for Bounty #9,Approved,3988800,3988800,0.00002858,114,Bounties,9,,Y
 Antioch,485,,,,,,,,,,
 Antioch,486,,,,,,,,,,
-Antioch,487,Payment for @spat_sochi for Bounty #9,Approved,140845,140845,0.0000284,3.999998,Bounties,9,,N
+Antioch,487,Payment for @spat_sochi for Bounty #9,Approved,140845,140845,0.0000284,3.999998,Bounties,9,,Y
 Antioch,488,,,,,,,,,,
 Antioch,489,,,,,,,,,,
 Antioch,490,,,,,,,,,,
@@ -713,14 +713,14 @@ Antioch,491,,,,,,,,,,
 Antioch,492,,,,,,,,,,
 Antioch,493,,,,,,,,,,
 Antioch,494,,,,,,,,,,
-Antioch,495,Reward for work. Bounty 16,Approved,9076000,9076000,0.00002692,244.32592,Bounties,16,,N
+Antioch,495,Reward for work. Bounty 16,Approved,9076000,9076000,0.00002692,244.32592,Bounties,16,,Y
 Antioch,496,,,,,,,,,,
 Antioch,497,,,,,,,,,,
 Antioch,498,,,,,,,,,,
 Antioch,499,Awarded for creating a faucet,Approved,9000000,9000000,0.0000267,240.3,Tools,,,
 Antioch,500,,,,,,,,,,
 Antioch,501,,,,,,,,,,
-Antioch,502,Bounty payment 18,Approved,16541353,16541353,0.0000266,440,Bounties,18,,N
+Antioch,502,Bounty payment 18,Approved,16541353,16541353,0.0000266,440,Bounties,18,,Y
 Antioch,503,,,,,,,,,,
 Antioch,504,,,,,,,,,,
 Antioch,505,,,,,,,,,,
@@ -734,7 +734,7 @@ Antioch,512,,,,,,,,,,
 Antioch,513,,,,,,,,,,
 Antioch,514,,,,,,,,,,
 Antioch,515,,,,,,,,,,
-Antioch,516,Reward for @OlgaKuzia for Bounty 20,Approved,15043249,15043249,0.00002659,400,Bounties,20,,N
+Antioch,516,Reward for @OlgaKuzia for Bounty 20,Approved,15043249,15043249,0.00002659,400,Bounties,20,,Y
 Antioch,517,,,,,,,,,,
 Antioch,518,,,,,,,,,,
 Antioch,519,,,,,,,,,,
@@ -751,7 +751,7 @@ Antioch,529,,,,,,,,,,
 Antioch,530,,,,,,,,,,
 Antioch,531,,,,,,,,,,
 Antioch,532,,,,,,,,,,
-Antioch,533,Bounty payment 18,Approved,8880300,8880300,0.0000259,230,Bounties,18,,N
+Antioch,533,Bounty payment 18,Approved,8880300,8880300,0.0000259,230,Bounties,18,,Y
 Antioch,534,,,,,,,,,,
 Antioch,535,,,,,,,,,,
 Antioch,536,,,,,,,,,,
@@ -782,11 +782,11 @@ Antioch,560,,,,,,,,,,
 Antioch,561,,,,,,,,,,
 Antioch,562,,,,,,,,,,
 Antioch,563,,,,,,,,,,
-Antioch,564,Bounty payment 18,Approved,9607843,9607843,0.0000255,245,Bounties,18,,N
+Antioch,564,Bounty payment 18,Approved,9607843,9607843,0.0000255,245,Bounties,18,,Y
 Antioch,565,OKR Reward for Content Curato,Approved,1686200,1686200,0.0000255,43,OKR,,Curators,
 Antioch,566,,,,,,,,,,
 Antioch,567,,,,,,,,,,
-Antioch,568,Bounty #21 - Reward Translation to RU,Approved,19489800,19489800,0.0000256,500,Bounties,21,,N
+Antioch,568,Bounty #21 - Reward Translation to RU,Approved,19489800,19489800,0.0000256,500,Bounties,21,,Y
 Antioch,569,,,,,,,,,,
 Antioch,570,Payment Curator Lead OKR,Approved,1570320,1570320,0.0000254,40,OKR,,Curators,
 Antioch,571,,,,,,,,,,
@@ -804,7 +804,7 @@ Antioch,582,,,,,,,,,,
 Antioch,583,,,,,,,,,,
 Antioch,584,,,,,,,,,,
 Antioch,585,,,,,,,,,,
-Antioch,586,Bounty payment 18,Approved,12449799,12449799,0.0000249,310,Bounties,18,,N
+Antioch,586,Bounty payment 18,Approved,12449799,12449799,0.0000249,310,Bounties,18,,Y
 Antioch,587,,,,,,,,,,
 Antioch,588,,,,,,,,,,
 Antioch,589,OKR Reward for Content Curator,Approved,2429149,2429149,0.0000247,60,OKR,,Curators,
@@ -832,13 +832,13 @@ Antioch,610,,,,,,,,,,
 Antioch,611,,,,,,,,,,
 Antioch,612,,,,,,,,,,
 Antioch,613,,,,,,,,,,
-Antioch,614,,,,,,,,,,
+Antioch,614,Payment Bounty 18,Approved,10849429,10849429,0.0000259,281,Bounties,18,,Y
 Antioch,615,,,,,,,,,,
 Antioch,616,,,,,,,,,,
 Antioch,617,,,,,,,,,,
-Antioch,618,,,,,,,,,,
+Antioch,618,OKR Reward for Content Curator,Approved,2382812,2382812,0.0000256,61,OKR,,Curators,
 Antioch,619,,,,,,,,,,
-Antioch,620,,,,,,,,,,
+Antioch,620,OKR rewards for Curator Lead,Approved,2352941,2352941,0.0000255,60,OKR,,Curators,
 Antioch,621,,,,,,,,,,
 Antioch,622,,,,,,,,,,
 Antioch,623,,,,,,,,,,
@@ -848,7 +848,7 @@ Antioch,626,,,,,,,,,,
 Antioch,627,,,,,,,,,,
 Antioch,628,,,,,,,,,,
 Antioch,629,,,,,,,,,,
-Antioch,630,,,,,,,,,,
+Antioch,630,Faucet funds,Approved,500000,500000,0.0000255,12.75,Community Rewards,,,
 Antioch,631,,,,,,,,,,
 Antioch,632,,,,,,,,,,
 Antioch,633,,,,,,,,,,
@@ -859,7 +859,209 @@ Antioch,637,,,,,,,,,,
 Antioch,638,,,,,,,,,,
 Antioch,639,,,,,,,,,,
 Antioch,640,,,,,,,,,,
-Antioch,641,,,,,,,,,,
+Antioch,641,OKR Reward for Content Curator,Approved,2350746,2350746,0.0000268,63,OKR,,Curators,
 Antioch,642,,,,,,,,,,
-Antioch,643,,,,,,,,,,
-Antioch,644,,,,,,,,,,
+Antioch,643,Curator Lead OKR rewards,Approved,2238805,2238805,0.0000268,60,OKR,,Curators,
+Antioch,644,Payment Bounty 18,Approved,6156716,6156716,0.0000268,165,Bounties,18,,Y
+Antioch,645,,,,,,,,,,
+Antioch,646,,,,,,,,,,
+Antioch,647,Payment Bounty 24,Approved,5088496,5088496,0.0000271,138,Bounties,24,,Y
+Antioch,648,,,,,,,,,,
+Antioch,649,Bounty #21 - Review of Translation to RU,Approved,14869888,14869888.48,0.0000269,400,Bounties,21,,Y
+Antioch,650,,,,,,,,,,
+Antioch,651,,,,,,,,,,
+Antioch,652,,,,,,,,,,
+Antioch,653,Payment for @andybut for Bounty #9,Approved,3275000,3275000,0.0000268,88,Bounties,9,,Y
+Antioch,654,,,,,,,,,,
+Antioch,655,,,,,,,,,,
+Antioch,656,,,,,,,,,,
+Antioch,657,,,,,,,,,,
+Antioch,658,Payment for @kate_fm for Bounty #9,Approved,3885300,3885300,0.0000265,103,Bounties,9,,Y
+Antioch,659,,,,,,,,,,
+Antioch,660,,,,,,,,,,
+Antioch,661,,,,,,,,,,
+Antioch,662,Payment Bounty 18,Approved,5665399,5665399,0.0000263,149,Bounties,18,,Y
+Antioch,663,,,,,,,,,,
+Antioch,664,,,,,,,,,,
+Antioch,665,,,,,,,,,,
+Antioch,666,,,,,,,,,,
+Antioch,667,,,,,,,,,,
+Antioch,668,,,,,,,,,,
+Antioch,669,,,,,,,,,,
+Antioch,670,,,,,,,,,,
+Antioch,671,,,,,,,,,,
+Antioch,672,,,,,,,,,,
+Antioch,673,OKR Reward for Content Curator,Approved,1915708,1915708,0.0000261,50,OKR,,Curators,
+Antioch,674,,,,,,,,,,
+Antioch,675,,,,,,,,,,
+Antioch,676,,,,,,,,,,
+Antioch,677,,,,,,,,,,
+Antioch,678,,,,,,,,,,
+Antioch,679,,,,,,,,,,
+Antioch,680,,,,,,,,,,
+Antioch,681,,,,,,,,,,
+Antioch,682,Curator Lead OKR rewards,Approved,2321981,2321981,0.0000258,60,OKR,,Curators,
+Antioch,683,Payment Bounty 24 (2-nd week),Approved,12519379,12519379,0.0000258,323,Bounties,24,,Y
+Antioch,684,,,,,,,,,,
+Antioch,685,,,,,,,,,,
+Antioch,686,,,,,,,,,,
+Antioch,687,,,,,,,,,,
+Antioch,688,,,,,,,,,,
+Antioch,689,,,,,,,,,,
+Antioch,690,,,,,,,,,,
+Antioch,691,,,,,,,,,,
+Antioch,692,,,,,,,,,,
+Antioch,693,Payment Bounty 18,Approved,4406130,4406130,0.0000261,115,Bounties,18,,Y
+Antioch,694,,,,,,,,,,
+Antioch,695,,,,,,,,,,
+Antioch,696,,,,,,,,,,
+Antioch,697,,,,,,,,,,
+Antioch,698,OKR Reward for Content Curator,Approved,2316602,2316602,0.0000259,60,OKR,,Curators,
+Antioch,699,Curator Lead OKR rewards,Approved,2318393,2318393,0.0000258,60,OKR,,Curators,
+Antioch,700,,,,,,,,,,
+Antioch,701,,,,,,,,,,
+Antioch,702,,,,,,,,,,
+Antioch,703,,,,,,,,,,
+Antioch,704,,,,,,,,,,
+Antioch,705,,,,,,,,,,
+Antioch,706,,,,,,,,,,
+Antioch,707,Bounty 24 Payment (3 week ),Approved,10546723,10546723,0.0000257,272,Bounties,24,,Y
+Antioch,708,,,,,,,,,,
+Antioch,709,,,,,,,,,,
+Antioch,710,,,,,,,,,,
+Antioch,711,,,,,,,,,,
+Antioch,712,,,,,,,,,,
+Antioch,713,,,,,,,,,,
+Antioch,714,,,,,,,,,,
+Antioch,715,,,,,,,,,,
+Antioch,716,,,,,,,,,,
+Antioch,717,,,,,,,,,,
+Antioch,718,,,,,,,,,,
+Antioch,719,,,,,,,,,,
+Antioch,720,,,,,,,,,,
+Antioch,721,,,,,,,,,,
+Antioch,722,,,,,,,,,,
+Antioch,723,,,,,,,,,,
+Antioch,724,,,,,,,,,,
+Antioch,725,,,,,,,,,,
+Antioch,726,Bounty 24 Payment (4th week ),Approved,12341270,12341270,0.0000252,311,Bounties,24,,Y
+Antioch,727,Payment Bounty 18,Approved,10238095,10238095,0.0000252,258,Bounties,18,,Y
+Antioch,728,,,,,,,,,,
+Antioch,729,,,,,,,,,,
+Antioch,730,,,,,,,,,,
+Antioch,731,,,,,,,,,,
+Antioch,732,Curator Lead OKR rewards,Approved,2317497,2317497,0.00002589,60,OKR,,Curators,
+Antioch,733,,,,,,,,,,
+Antioch,734,,,,,,,,,,
+Antioch,735,OKR Reward for Content Curator,Approved,2519379,2519379,0.0000258,65,OKR,,Curators,
+Antioch,736,,,,,,,,,,
+Antioch,737,,,,,,,,,,
+Antioch,738,,,,,,,,,,
+Antioch,739,,,,,,,,,,
+Antioch,740,,,,,,,,,,
+Antioch,741,,,,,,,,,,
+Antioch,742,,,,,,,,,,
+Antioch,743,,,,,,,,,,
+Antioch,744,,,,,,,,,,
+Antioch,745,,,,,,,,,,
+Antioch,746,,,,,,,,,,
+Antioch,747,,,,,,,,,,
+Antioch,748,,,,,,,,,,
+Antioch,749,,,,,,,,,,
+Antioch,750,,,,,,,,,,
+Antioch,751,,,,,,,,,,
+Antioch,752,Bounty 24. Payments (5-th week).,Approved,11881188,11881188,0.00002525,300,Bounties,24,,Y
+Antioch,753,,,,,,,,,,
+Antioch,754,Payment Bounty 18,Approved,9440000,9440000,0.000025,236,Bounties,18,,Y
+Antioch,755,,,,,,,,,,
+Antioch,756,,,,,,,,,,
+Antioch,757,,,,,,,,,,
+Antioch,758,,,,,,,,,,
+Antioch,759,,,,,,,,,,
+Antioch,760,Bounty 21 - Spanish Translation,Approved,19379800,19379800,0.0000258,500,Bounties,21,,Y
+Antioch,761,Curator Lead OKR rewards,Approved,2325581,2325581,0.0000258,60,OKR,,Curators,
+Antioch,762,OKR Reward for Content Curator,Approved,2519379,2519379,0.0000258,65,OKR,,Curators,
+Antioch,763,,,,,,,,,,
+Antioch,764,,,,,,,,,,
+Antioch,765,,,,,,,,,,
+Antioch,766,,,,,,,,,,
+Antioch,767,,,,,,,,,,
+Antioch,768,,,,,,,,,,
+Antioch,769,,,,,,,,,,
+Antioch,770,,,,,,,,,,
+Antioch,771,,,,,,,,,,
+Antioch,772,,,,,,,,,,
+Antioch,773,"Replenish my ""give account"" #2",Approved,5000000,5000000,0.0000231,115,Community Rewards,,,
+Antioch,774,,,,,,,,,,
+Antioch,775,,,,,,,,,,
+Antioch,776,Payment Bounty 18,Approved,10565217,10565217,0.000023,243,Bounties,18,,Y
+Antioch,777,,,,,,,,,,
+Antioch,778,,,,,,,,,,
+Antioch,779,,,,,,,,,,
+Antioch,780,,,,,,,,,,
+Antioch,781,Payment Bounty 24 (6-th week),Approved,12594458,12594458,0.00002382,300,Bounties,24,,Y
+Antioch,782,,,,,,,,,,
+Antioch,783,,,,,,,,,,
+Antioch,784,Curator Lead OKR rewards,Approved,2400000,2400000,0.000025,60,OKR,,Curators,
+Antioch,785,,,,,,,,,,
+Antioch,786,,,,,,,,,,
+Antioch,787,OKR Reward for Content Curator,Approved,2931700,2931700,0.0000249,73,OKR,,Curators,
+Antioch,788,,,,,,,,,,
+Antioch,789,,,,,,,,,,
+Antioch,790,,,,,,,,,,
+Antioch,791,,,,,,,,,,
+Antioch,792,,,,,,,,,,
+Antioch,793,,,,,,,,,,
+Antioch,794,,,,,,,,,,
+Antioch,795,joystream-lib & tokenomics refactor,Cancelled,50000000,0,,,,,,
+Antioch,796,,,,,,,,,,
+Antioch,797,,,,,,,,,,
+Antioch,798,,,,,,,,,,
+Antioch,799,,,,,,,,,,
+Antioch,800,,,,,,,,,,
+Antioch,801,,,,,,,,,,
+Antioch,802,,,,,,,,,,
+Antioch,803,,,,,,,,,,
+Antioch,804,Bounty 24. Payments. 7-th week.,Approved,10355500,10355500,0.00002897,300,Bounties,24,,N
+Antioch,805,Bounty 18. Payments. 12-th week.,Approved,4758600,4758600,0.000029,138,Bounties,18,,N
+Antioch,806,,,,,,,,,,
+Antioch,807,,,,,,,,,,
+Antioch,808,,,,,,,,,,
+Antioch,809,Curator Lead OKR rewards,Approved,2113000,2113000,0.0000287,60,OKR,,Curators,
+Antioch,810,,,,,,,,,,
+Antioch,811,,,,,,,,,,
+Antioch,812,,,,,,,,,,
+Antioch,813,,,,,,,,,,
+Antioch,814,,,,,,,,,,
+Antioch,815,,,,,,,,,,
+Antioch,816,,,,,,,,,,
+Antioch,817,,,,,,,,,,
+Antioch,818,,,,,,,,,,
+Antioch,819,OKR Reward for Content Curator,Approved,1911262,1911262,0.0000293,56,OKR,,Curators,
+Antioch,820,,,,,,,,,,
+Antioch,821,,,,,,,,,,
+Antioch,822,,,,,,,,,,
+Antioch,823,,,,,,,,,,
+Antioch,824,Re: joystream-lib & tokenomics refactor,Approved,46000000,46000000,0.000029,1334,Tools,,,
+Antioch,825,Bounty 18. Payments. 13-th week.,Approved,5496400,5496400,0.0000282,155,Bounties,18,,N
+Antioch,826,,,,,,,,,,
+Antioch,827,,,,,,,,,,
+Antioch,828,,,,,,,,,,
+Antioch,829,,,,,,,,,,
+Antioch,830,Bounty 18 + 24 Static information report,Approved,3472222,3472222,0.0000288,100,Tools,,,
+Antioch,831,Bounty 24. Payments. 8-th week.,Cancelled,10420200,0,,,,,,
+Antioch,832,Bounty 24. Payments. 8-th week.,Approved,10420284,10420284,0.00002879,300,Bounties,24,,N
+Antioch,833,,,,,,,,,,
+Antioch,834,,,,,,,,,,
+Antioch,835,,,,,,,,,,
+Antioch,836,,,,,,,,,,
+Antioch,837,,,,,,,,,,
+Antioch,838,Curator Lead OKR rewards,Approved,2113000,2113000,0.0000287,60,OKR,,Curators,
+Antioch,839,,,,,,,,,,
+Antioch,840,,,,,,,,,,
+Antioch,841,,,,,,,,,,
+Antioch,842,,,,,,,,,,
+Antioch,843,,,,,,,,,,
+Antioch,844,,,,,,,,,,
+Antioch,845,,,,,,,,,,
+Antioch,846,OKR Reward for Content Curator,Approved,2439024,2439024,0.0000287,70,OKR,,Curators,

+ 88 - 0
joystream-api/.gitignore

@@ -0,0 +1,88 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+mintingAndBurning.log
+mintingAndBurning.json
+!unknownSources.log
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+.coverage
+.jest-cache
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Typescript v1 declaration files
+typings/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# cache and distribution folders
+.parcel-cache
+.cache/
+.now
+dist/
+storybook-static
+# Mac files
+.DS_Store
+
+# Yarn
+yarn-error.log
+.pnp/
+.pnp.js
+.yarn
+.yarnrc.yml
+# Yarn Integrity file
+.yarn-integrity
+
+# vscode/extensions
+.history
+
+# JetBrains
+.idea
+
+sprites/*/**
+sprites/*
+frames/*
+**.mp4
+
+src/*.js
+.env

+ 44 - 0
joystream-api/Readme.md

@@ -0,0 +1,44 @@
+# KPI 27.II-3 - Minting and Burning
+
+Warn report is `unknownSources.log` which contains all the `WARN` blocks, where we cannot calculate what affected the issuance (e.g. a bug with burned stake for Working Groups)
+
+Full report is `mintingAndBurning.log` which contains all the blocks, where minting and/or burning affected the total issuance
+
+**Full minting and burning log** is uploaded as a github gist as per request, and can be accessed [here](https://gist.github.com/oleksanderkorn/d8fef9e023737645ac0bb971978e389b)
+## Minting Sources:
+### Event-based
+* `balances.BalanceSet` - when sudo account sets new balance, amount is taken from event data
+* `proposalsEngine.ProposalStatusUpdated` - when proposal with type **Spending** (`isSpending`) is approved and executed, amount is taken from proposal params
+* `staking.Reward` - when validators and nominators are getting staking reward, amount is taken from event data
+### Non-event-based
+* `Working groups workers recurring rewards` - to understand when reward increase issuance we check `next_payment_at_block` at the previous block hash, assuming next block worker will be paid out
+## Burning Sources
+### Event-based
+* `proposalsEngine.ProposalStatusUpdated` - when proposal is rejected or expired, fee is burned (hardcoded value of 5000 JOY)
+### Extrinsic-based
+* `balances.transfer` - transfer to burn address leads to burning, amount taken from extrinsics tip
+* `members.buyMembership` - when new member is registered, fee amount is taken from `members.paidMembershipTermsById`
+* `proposalsEngine.cancelProposal` - when proposal is cancelled, cancellation fee is burned (hardcoded value of 10000 JOY)
+* `utility.batch` - burned amount taken from extrinsics tip
+* `staking.bond` - burned amount taken from extrinsics tip
+* `session.setKeys` - burned amount taken from extrinsics tip
+* `staking.nominate` - burned amount taken from extrinsics tip
+* `members.buyMembership` - burned amount taken from extrinsics tip
+* `operationsWorkingGroup.updateRewardAmount` - when storage worker reward amount is updated, amount is added to `amount_per_payout` property of specific worker rewardRelationship
+* `contentDirectoryWorkingGroup.updateRewardAmount` - when storage worker reward amount is updated, amount is added to `amount_per_payout` property of specific worker rewardRelationship
+* `storageWorkingGroup.updateRewardAmount` - when storage worker reward amount is updated, amount is added to `amount_per_payout` property of specific worker rewardRelationship
+
+### Unknown Sources
+All the minting and burning changes which are not calculated by the script are listed in `unknownSources.log`. 
+One is [`balances.BalanceSet`](https://pioneer.joystreamstats.live/#/explorer/query/1609074) to the wrong address, which lead to the burning of `4909336 JOY` by `sudo.sudo` extrinsics.
+All the other warnings (22 of 23 warnings) are burning events caused by the runtime bug, when working groups workers application stake was burned.
+
+## Running script
+`yarn ` - load project dependencies
+
+`yarn start <startBlock> <endBlock>` - Generates some files in `report` folder:
+ - `mintingAndBurning.log`: every line is a block where totalIssuance has been changed, showing new issuance, previous issuance, tokens minted and burned. Every line is prefixed with `INFO` if minting and burning source is calculated, `WARN` if the source is unknown
+
+ - `unknownSources.log`: every line is a block where totalIssuance has been changed, showing new issuance, previous issuance, tokens minted and burnedbut the source is **unknown**, meaning we only add `WARN` lines here
+
+ - `mintingAndBurning.json`: detailed report of what exactly changed the issuance in a specific block (e.g. Staking Reward, Cancelled Proposal, Spending Proposal, Set Sudo Balance, Recurring Rewards, Membership Creation, Transfer to Burn Address, Proposal Rejection, Proposal Expiration)

+ 45 - 0
joystream-api/package.json

@@ -0,0 +1,45 @@
+{
+    "name": "joystream-minting-and-burning",
+    "version": "1.0.0",
+    "description": "KPI #25.II-3 - Minting and Burning",
+    "main": "src/mintingAndBurning.ts",
+    "author": "lkskrn",
+    "license": "MIT",
+    "scripts": {
+        "build": "tsc",
+        "prestart": "tsc",
+        "start": "nodemon --ignore 'report/*.json' src/mintingAndBurning.ts"
+    },
+    "dependencies": {
+        "@joystream/types": "^0.16.1",
+        "axios": "^0.21.1",
+        "body-parser": "^1.18.3",
+        "compression": "^1.7.4",
+        "cors": "^2.8.5",
+        "dotenv": "^10.0.0",
+        "express": "^4.17.1",
+        "express-static-gzip": "^2.1.1",
+        "fs": "^0.0.1-security",
+        "node-cron": "^3.0.0",
+        "pg": "^8.7.1",
+        "pg-hstore": "^2.3.4",
+        "reflect-metadata": "^0.1.13",
+        "zlib": "^1.0.5"
+    },
+    "devDependencies": {
+        "@types/body-parser": "^1.17.0",
+        "@types/compression": "^1.7.2",
+        "@types/cors": "^2.8.12",
+        "@types/express": "^4.17.13",
+        "@types/node": "^16.4.2",
+        "@types/node-cron": "^2.0.4",
+        "@types/pg": "^8.6.1",
+        "@types/strong-error-handler": "^2.3.0",
+        "nodemon": "^2.0.12",
+        "pm2": "^5.1.1",
+        "prettier": "^2.3.2",
+        "ts-node": "^10.2.1",
+        "tslint": "^6.1.3",
+        "typescript": "^4.4.2"
+    }
+}

+ 0 - 0
joystream-api/report/.gitkeep


+ 24 - 0
joystream-api/report/unknownSources.log

@@ -0,0 +1,24 @@
+[operationsWorkingGroup.fillOpening]   [WARN] Block: [850463]  Issuance: [747439913]  Previous issuance: [747989913]  Delta: [-550000]  Calculated Delta: [0]   Total Minted: [0]   Total Burned: [0]
+[operationsWorkingGroup.fillOpening]   [WARN] Block: [1137747] Issuance: [848283397]  Previous issuance: [848683397]  Delta: [-400000]  Calculated Delta: [0]   Total Minted: [0]   Total Burned: [0]
+[operationsWorkingGroup.fillOpening]   [WARN] Block: [1141735] Issuance: [848370389]  Previous issuance: [848970389]  Delta: [-600000]  Calculated Delta: [0]   Total Minted: [0]   Total Burned: [0]
+[operationsWorkingGroup.fillOpening]   [WARN] Block: [1191287] Issuance: [873373008]  Previous issuance: [873673008]  Delta: [-300000]  Calculated Delta: [0]   Total Minted: [0]   Total Burned: [0]
+[operationsWorkingGroup.fillOpening]   [WARN] Block: [1191406] Issuance: [873073329]  Previous issuance: [873373326]  Delta: [-299997]  Calculated Delta: [3]   Total Minted: [3]   Total Burned: [0]
+[operationsWorkingGroup.fillOpening]   [WARN] Block: [1236973] Issuance: [927930868]  Previous issuance: [928030861]  Delta: [-99993]   Calculated Delta: [7]   Total Minted: [7]   Total Burned: [0]
+[staking bug? - no events]             [WARN] Block: [1247725] Issuance: [909448729]  Previous issuance: [909948712]  Delta: [-499983]  Calculated Delta: [17]  Total Minted: [17]  Total Burned: [0]
+[staking bug? - no events]             [WARN] Block: [1292116] Issuance: [921213567]  Previous issuance: [921713550]  Delta: [-499983]  Calculated Delta: [17]  Total Minted: [17]  Total Burned: [0]
+[staking bug? - no events]             [WARN] Block: [1292121] Issuance: [920713652]  Previous issuance: [921213635]  Delta: [-499983]  Calculated Delta: [17]  Total Minted: [17]  Total Burned: [0]
+[staking bug? - no events]             [WARN] Block: [1292125] Issuance: [920213720]  Previous issuance: [920713703]  Delta: [-499983]  Calculated Delta: [17]  Total Minted: [17]  Total Burned: [0]
+[operationsWorkingGroup.fillOpening]   [WARN] Block: [1505062] Issuance: [1032124915] Previous issuance: [1032624775] Delta: [-499860]  Calculated Delta: [140] Total Minted: [140] Total Burned: [0]
+[balances.BalanceSet]                  [WARN] Block: [1609074] Issuance: [1069126289] Previous issuance: [1074035625] Delta: [-4909336] Calculated Delta: [0]   Total Minted: [0]   Total Burned: [0]
+[operationsWorkingGroup.fillOpening]   [WARN] Block: [1659176] Issuance: [1076573667] Previous issuance: [1076593667] Delta: [-20000]   Calculated Delta: [0]   Total Minted: [0]   Total Burned: [0]
+[operationsWorkingGroup.terminateRole] [WARN] Block: [1726540] Issuance: [1119759144] Previous issuance: [1120259000] Delta: [-499856]  Calculated Delta: [144] Total Minted: [144] Total Burned: [0]
+[operationsWorkingGroup.terminateRole] [WARN] Block: [1726545] Issuance: [1119259854] Previous issuance: [1119759720] Delta: [-499866]  Calculated Delta: [144] Total Minted: [144] Total Burned: [0]
+[operationsWorkingGroup.terminateRole] [WARN] Block: [1726550] Issuance: [1118760523] Previous issuance: [1119260390] Delta: [-499867]  Calculated Delta: [134] Total Minted: [134] Total Burned: [0]
+[operationsWorkingGroup.terminateRole] [WARN] Block: [1726554] Issuance: [1118261054] Previous issuance: [1118760922] Delta: [-499868]  Calculated Delta: [133] Total Minted: [133] Total Burned: [0]
+[operationsWorkingGroup.terminateRole] [WARN] Block: [1726559] Issuance: [1117761713] Previous issuance: [1118261582] Delta: [-499869]  Calculated Delta: [132] Total Minted: [132] Total Burned: [0]
+[operationsWorkingGroup.terminateRole] [WARN] Block: [1726575] Issuance: [1117263789] Previous issuance: [1117763678] Delta: [-499889]  Calculated Delta: [131] Total Minted: [131] Total Burned: [0]
+[operationsWorkingGroup.terminateRole] [WARN] Block: [1726579] Issuance: [1116764203] Previous issuance: [1117264122] Delta: [-499919]  Calculated Delta: [111] Total Minted: [111] Total Burned: [0]
+[operationsWorkingGroup.terminateRole] [WARN] Block: [1726588] Issuance: [1116264921] Previous issuance: [1116764851] Delta: [-499930]  Calculated Delta: [81]  Total Minted: [81]  Total Burned: [0]
+[operationsWorkingGroup.terminateRole] [WARN] Block: [1726592] Issuance: [1115765181] Previous issuance: [1116265131] Delta: [-499950]  Calculated Delta: [70]  Total Minted: [70]  Total Burned: [0]
+[operationsWorkingGroup.terminateRole] [WARN] Block: [1726596] Issuance: [1115665331] Previous issuance: [1115765331] Delta: [-100000]  Calculated Delta: [50]  Total Minted: [50]  Total Burned: [0]
+[staking bug? - no events]             [WARN] Block: [2150656] Issuance: [1353171600] Previous issuance: [1353771600] Delta: [-600000] Calculated Delta: [0] Total Minted: [0] Total Burned: [0]

+ 544 - 0
joystream-api/src/joystream-lib/api.ts

@@ -0,0 +1,544 @@
+import { ApiPromise, WsProvider } from "@polkadot/api";
+import moment from "moment";
+
+// types
+import { AccountBalance, ElectionInfo, Round, ProposalDetail } from "./types";
+import { Option, u32, u64, Vec, StorageKey } from "@polkadot/types";
+import type { Codec, Observable } from "@polkadot/types/types";
+import {
+  AccountId,
+  AccountInfo,
+  AccountData,
+  Balance,
+  BlockNumber,
+  EraIndex,
+  EventRecord,
+  Hash,
+  Moment,
+} from "@polkadot/types/interfaces";
+import { SignedBlock } from "@polkadot/types/interfaces/runtime";
+import { types } from "@joystream/types";
+import { PostId, ThreadId } from "@joystream/types/common";
+import { CategoryId, Category, Thread, Post } from "@joystream/types/forum";
+import {
+  ElectionStage,
+  ElectionStake,
+  SealedVote,
+  Seats,
+} from "@joystream/types/council";
+import { Entity, EntityId } from "@joystream/types/content-directory";
+import { ContentId, DataObject } from "@joystream/types/media";
+import { MemberId, Membership, PaidMembershipTerms, PaidTermId } from "@joystream/types/members";
+import { Mint, MintId } from "@joystream/types/mint";
+import {
+  Proposal,
+  ProposalId,
+  DiscussionPost,
+  SpendingParams,
+  VoteKind,
+} from "@joystream/types/proposals";
+import { Stake, StakeId } from "@joystream/types/stake";
+import {
+  RewardRelationship,
+  RewardRelationshipId,
+} from "@joystream/types/recurring-rewards";
+import { WorkerId, Worker } from "@joystream/types/working-group";
+import { ProposalOf, ProposalDetailsOf } from "@joystream/types/augment/types";
+
+import { WorkerOf } from "@joystream/types/augment-codec/all";
+
+export const connectApi = async (url: string): Promise<ApiPromise> => {
+  const provider = new WsProvider(url);
+  return await ApiPromise.create({ provider, types });
+};
+
+// blocks
+export const getBlock = (api: ApiPromise, hash: Hash): Promise<SignedBlock> =>
+  api.rpc.chain.getBlock(hash);
+
+export const getBlockHash = (
+  api: ApiPromise,
+  block: BlockNumber | number
+): Promise<Hash> => {
+  try {
+    return api.rpc.chain.getBlockHash(block);
+  } catch (e) {
+    return api.rpc.chain.getFinalizedHead();
+  }
+};
+
+export const getHead = (api: ApiPromise) => api.derive.chain.bestNumber();
+
+export const getTimestamp = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number> =>
+  moment.utc((await api.query.timestamp.now.at(hash)).toNumber()).valueOf();
+
+export const getIssuance = (api: ApiPromise, hash: Hash): Promise<Balance> =>
+  api.query.balances.totalIssuance.at(hash);
+
+export const getEvents = (
+  api: ApiPromise,
+  hash: Hash
+): Promise<Vec<EventRecord>> => api.query.system.events.at(hash);
+
+export const getEra = async (api: ApiPromise, hash: Hash): Promise<number> =>
+  Number(api.query.staking.currentEra.at(hash));
+
+export const getEraStake = async (
+  api: ApiPromise,
+  hash: Hash,
+  era: EraIndex | number
+): Promise<number> =>
+  (await api.query.staking.erasTotalStake.at(hash, era)).toNumber();
+
+// council
+export const getCouncil = (api: ApiPromise, hash: Hash): Promise<Seats> =>
+  api.query.council.activeCouncil.at(hash);
+
+export const getCouncils = async (
+  api: ApiPromise,
+  head: number
+): Promise<Round[]> => {
+  // durations: [ announcing, voting, revealing, term, sum ]
+  // each chain starts with an election (duration: d[0]+d[1]+d[2])
+  // elections are repeated if not enough apply (round increments though)
+  // first term starts at begin of d[3] or some electionDuration later
+  // term lasts till the end of the next successful election
+  // `council.termEndsAt` returns the end of the current round
+  // to determine term starts check every electionDuration blocks
+
+  const d: number[] = await getCouncilElectionDurations(
+    api,
+    await getBlockHash(api, 1)
+  );
+  const electionDuration = d[0] + d[1] + d[2];
+
+  const starts: number[] = [];
+  let lastEnd = 1;
+  for (let block = lastEnd; block < head; block += electionDuration) {
+    const hash = await getBlockHash(api, block);
+    const end = Number(await api.query.council.termEndsAt.at(hash));
+    if (end === lastEnd) continue;
+    lastEnd = end;
+    starts.push(end - d[3]);
+  }
+
+  // index by round: each start is the end of the previous term
+  const rounds: { [key: number]: Round } = {};
+  await Promise.all(
+    starts.map(async (start: number, index: number) => {
+      const hash = await getBlockHash(api, start);
+      const round = await getCouncilRound(api, hash);
+      const isLast = index === starts.length - 1;
+      const end = isLast ? start + d[4] - 1 : starts[index + 1] - 1;
+      rounds[round] = { start, round, end };
+    })
+  );
+  return Object.values(rounds);
+};
+
+export const getCouncilRound = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number> =>
+  ((await api.query.councilElection.round.at(hash)) as u32).toNumber();
+
+export const getCouncilElectionStage = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<ElectionStage> =>
+  (await api.query.councilElection.stage.at(hash)) as ElectionStage;
+
+export const getCouncilTermEnd = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number> =>
+  ((await api.query.council.termEndsAt.at(hash)) as BlockNumber).toNumber();
+
+export const getCouncilElectionStatus = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<ElectionInfo> => {
+  const durations = await getCouncilElectionDurations(api, hash);
+  const round = await getCouncilRound(api, hash);
+  const stage: ElectionStage = await getCouncilElectionStage(api, hash);
+  const stageEndsAt: number = Number(stage.value as BlockNumber);
+  const termEndsAt: number = await getCouncilTermEnd(api, hash);
+  return { round, stageEndsAt, termEndsAt, stage, durations };
+};
+
+export const getCouncilSize = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number> =>
+  ((await api.query.councilElection.councilSize.at(hash)) as u32).toNumber();
+
+export const getCouncilApplicants = (
+  api: ApiPromise,
+  hash: Hash
+): Promise<Vec<AccountId>> => api.query.councilElection.applicants.at(hash);
+
+export const getCouncilApplicantStakes = (
+  api: ApiPromise,
+  hash: Hash,
+  applicant: AccountId
+): Promise<ElectionStake> =>
+  api.query.councilElection.applicantStakes.at(hash, applicant);
+
+export const getCouncilCommitments = (
+  api: ApiPromise,
+  hash: Hash
+): Promise<Vec<Hash>> => api.query.councilElection.commitments.at(hash);
+
+export const getCouncilPayoutInterval = (
+  api: ApiPromise,
+  hash: Hash
+): Promise<Option<BlockNumber>> => api.query.council.payoutInterval.at(hash);
+
+export const getCouncilPayout = (
+  api: ApiPromise,
+  hash: Hash
+): Promise<Balance> => api.query.council.amountPerPayout.at(hash);
+
+const getCouncilElectionPeriod = (
+  api: ApiPromise,
+  hash: Hash,
+  period: string
+): Promise<BlockNumber> => api.query.councilElection[period].at(hash);
+
+export const getCouncilElectionDurations = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number[]> => {
+  const periods = [
+    "announcingPeriod",
+    "votingPeriod",
+    "revealingPeriod",
+    "newTermDuration",
+  ];
+  let durations = await Promise.all(
+    periods.map((period: string) => getCouncilElectionPeriod(api, hash, period))
+  ).then((d) => d.map((block: BlockNumber) => block.toNumber()));
+  durations.push(durations[0] + durations[1] + durations[2] + durations[3]);
+  return durations;
+};
+
+export const getCommitments = (api: ApiPromise, hash: Hash): Promise<Hash[]> =>
+  api.query.councilElection.commitments.at(hash);
+
+export const getCommitment = (
+  api: ApiPromise,
+  blockHash: Hash,
+  voteHash: Hash
+): Promise<SealedVote> =>
+  api.query.councilElection.votes.at(blockHash, voteHash);
+
+// working groups
+export const getNextWorker = async (
+  api: ApiPromise,
+  group: string,
+  hash: Hash
+): Promise<number> =>
+  ((await api.query[group].nextWorkerId.at(hash)) as WorkerId).toNumber();
+
+export const getWorker = (
+  api: ApiPromise,
+  group: string,
+  hash: Hash,
+  id: number
+): Promise<WorkerOf> => api.query[group].workerById.at(hash, id);
+
+export const getWorkers = (
+  api: ApiPromise,
+  group: string,
+  hash: Hash
+): Promise<number> => api.query[group].activeWorkerCount.at(hash);
+
+export const getStake = async (
+  api: ApiPromise,
+  id: StakeId | number
+): Promise<Stake> => (await api.query.stake.stakes(id)) as Stake;
+
+export const getWorkerReward = (
+  api: ApiPromise,
+  hash: Hash,
+  id: RewardRelationshipId | number
+): Promise<RewardRelationship> =>
+  api.query.recurringRewards.rewardRelationships.at(hash, id);
+
+// mints
+export const getCouncilMint = (api: ApiPromise, hash: Hash): Promise<MintId> =>
+  api.query.council.councilMint.at(hash);
+
+export const getGroupMint = (
+  api: ApiPromise,
+  group: string,
+  hash: Hash
+): Promise<MintId> => api.query[group].mint.at(hash);
+
+export const getMintsCreated = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number> => parseInt(await api.query.minting.mintsCreated.at(hash));
+
+export const getMint = (
+  api: ApiPromise,
+  hash: Hash,
+  id: MintId | number
+): Promise<Mint> => api.query.minting.mints.at(hash, id);
+
+export const getPaidMembershipTermsById = (
+  api: ApiPromise,
+  hash: Hash,
+  id: PaidTermId | number
+): Promise<PaidMembershipTerms> => api.query.members.paidMembershipTermsById.at(hash, id);
+
+// members
+export const getAccounts = async (
+  api: ApiPromise
+): Promise<AccountBalance[]> => {
+  let accounts: AccountBalance[] = [];
+  const entries = await api.query.system.account.entries();
+  for (const account of entries) {
+    const accountId = String(account[0].toHuman());
+    const balance = account[1].data.toJSON() as unknown as AccountData;
+    accounts.push({ accountId, balance });
+  }
+  return accounts;
+};
+
+export const getAccount = (
+  api: ApiPromise,
+  hash: Hash,
+  account: AccountId | string
+): Promise<AccountInfo> => api.query.system.account.at(hash, account);
+
+export const getNextMember = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number> =>
+  ((await api.query.members.nextMemberId.at(hash)) as MemberId).toNumber();
+
+export const getMember = async (
+  api: ApiPromise,
+  id: MemberId | number,
+  hash?: Hash
+): Promise<Membership> =>
+  (await (hash
+    ? api.query.members.membershipById.at(hash, id)
+    : api.query.members.membershipById(id))) as Membership;
+
+export const getMemberIdByAccount = async (
+  api: ApiPromise,
+  accountId: AccountId
+): Promise<MemberId> => {
+  const ids = (await api.query.members.memberIdsByRootAccountId(
+    accountId
+  )) as Vec<MemberId>;
+  return ids[0];
+};
+
+// forum
+export const getNextPost = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number> =>
+  ((await api.query.forum.nextPostId.at(hash)) as PostId).toNumber();
+
+export const getNextThread = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number> =>
+  ((await api.query.forum.nextThreadId.at(hash)) as ThreadId).toNumber();
+
+export const getNextCategory = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number> =>
+  ((await api.query.forum.nextCategoryId.at(hash)) as CategoryId).toNumber();
+
+export const getCategory = async (
+  api: ApiPromise,
+  id: number
+): Promise<Category> => (await api.query.forum.categoryById(id)) as Category;
+
+export const getThread = async (api: ApiPromise, id: number): Promise<Thread> =>
+  (await api.query.forum.threadById(id)) as Thread;
+
+export const getPost = async (api: ApiPromise, id: number): Promise<Post> =>
+  (await api.query.forum.postById(id)) as Post;
+
+// proposals
+export const getProposalCount = async (
+  api: ApiPromise,
+  hash?: Hash
+): Promise<number> =>
+  (
+    (await (hash
+      ? api.query.proposalsEngine.proposalCount.at(hash)
+      : api.query.proposalsEngine.proposalCount())) as u32
+  ).toNumber();
+
+export const getProposalInfo = async (
+  api: ApiPromise,
+  id: ProposalId
+): Promise<ProposalOf> =>
+  (await api.query.proposalsEngine.proposals(id)) as ProposalOf;
+
+export const getProposalDetails = async (
+  api: ApiPromise,
+  id: ProposalId
+): Promise<ProposalDetailsOf> =>
+  (await api.query.proposalsCodex.proposalDetailsByProposalId(
+    id
+  )) as ProposalDetailsOf;
+
+export const getProposalType = async (
+  api: ApiPromise,
+  id: ProposalId
+): Promise<string> => {
+  const details = (await getProposalDetails(api, id)) as ProposalDetailsOf;
+  const [type]: string[] = Object.getOwnPropertyNames(details.toJSON());
+  return type;
+};
+
+export const getProposal = async (
+  api: ApiPromise,
+  id: ProposalId
+): Promise<ProposalDetail> => {
+  const proposal: ProposalOf = await getProposalInfo(api, id);
+  const status: { [key: string]: any } = proposal.status;
+  const stage: string = status.isActive ? "Active" : "Finalized";
+  const { finalizedAt, proposalStatus } = status[`as${stage}`];
+  const result: string = proposalStatus
+    ? (proposalStatus.isApproved && "Approved") ||
+      (proposalStatus.isCanceled && "Canceled") ||
+      (proposalStatus.isExpired && "Expired") ||
+      (proposalStatus.isRejected && "Rejected") ||
+      (proposalStatus.isSlashed && "Slashed") ||
+      (proposalStatus.isVetoed && "Vetoed")
+    : "Pending";
+  const exec = proposalStatus ? proposalStatus["Approved"] : null;
+
+  const { description, parameters, proposerId, votingResults } = proposal;
+  const member: Membership = await getMember(api, proposerId);
+  const author = String(member ? member.handle : proposerId);
+  const title = proposal.title.toString();
+  const type: string = await getProposalType(api, id);
+  const args: string[] = [String(id), title, type, stage, result, author];
+  const message: string = ``; //formatProposalMessage(args)
+  const created: number = Number(proposal.createdAt);
+
+  return {
+    id: Number(id),
+    title,
+    created,
+    finalizedAt,
+    parameters: JSON.stringify(parameters),
+    message,
+    stage,
+    result,
+    exec,
+    description: description.toHuman(),
+    votes: votingResults,
+    type,
+    author,
+    authorId: Number(proposerId),
+  };
+};
+
+export const getProposalVotes = async (
+  api: ApiPromise,
+  id: ProposalId | number
+): Promise<{ memberId: number; vote: string }[]> => {
+  let votes: { memberId: number; vote: string }[] = [];
+  const entries =
+    await api.query.proposalsEngine.voteExistsByProposalByVoter.entries(id);
+  entries.forEach((entry: any) => {
+    const memberId = entry[0].args[1].toJSON();
+    const vote = entry[1].toString();
+    votes.push({ memberId, vote });
+  });
+  return votes;
+};
+
+export const getProposalPost = async (
+  api: ApiPromise,
+  threadId: ThreadId | number,
+  postId: PostId | number
+): Promise<DiscussionPost> =>
+  (await api.query.proposalsDiscussion.postThreadIdByPostId(
+    threadId,
+    postId
+  )) as DiscussionPost;
+
+export const getProposalPosts = (
+  api: ApiPromise
+): Promise<[StorageKey<any>, DiscussionPost][]> =>
+  api.query.proposalsDiscussion.postThreadIdByPostId.entries();
+
+export const getProposalPostCount = async (api: ApiPromise): Promise<number> =>
+  Number((await api.query.proposalsDiscussion.postCount()) as u64);
+
+export const getProposalThreadCount = async (
+  api: ApiPromise
+): Promise<number> =>
+  Number((await api.query.proposalsDiscussion.threadCount()) as u64);
+
+// validators
+export const getValidatorCount = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number> =>
+  ((await api.query.staking.validatorCount.at(hash)) as u32).toNumber();
+
+export const getValidators = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<AccountId[]> => {
+  const snapshot = (await api.query.staking.snapshotValidators.at(
+    hash
+  )) as Option<Vec<AccountId>>;
+  return snapshot.isSome ? snapshot.unwrap() : [];
+};
+
+// media
+export const getNextEntity = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number> =>
+  (
+    (await api.query.contentDirectory.nextEntityId.at(hash)) as EntityId
+  ).toNumber();
+
+export const getNextChannel = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number> => api.query.content.nextChannelId.at(hash);
+
+export const getNextVideo = async (
+  api: ApiPromise,
+  hash: Hash
+): Promise<number> => api.query.content.nextVideoId.at(hash);
+
+export const getEntity = (
+  api: ApiPromise,
+  hash: Hash,
+  id: number
+): Promise<Entity> => api.query.contentDirectory.entityById.at(hash, id);
+
+export const getDataObjects = async (
+  api: ApiPromise
+): Promise<Map<ContentId, DataObject>> =>
+  (await api.query.dataDirectory.dataByContentId.entries()) as unknown as Map<
+    ContentId,
+    DataObject
+  >;
+
+export const getDataObject = async (
+  api: ApiPromise,
+  id: ContentId
+): Promise<Option<DataObject>> =>
+  (await api.query.dataDirectory.dataByContentId(id)) as Option<DataObject>;

+ 132 - 0
joystream-api/src/joystream-lib/types.ts

@@ -0,0 +1,132 @@
+import { AccountId, AccountData } from "@polkadot/types/interfaces";
+import { GenericEventData } from "@polkadot/types/generic/Event";
+import { MemberId } from "@joystream/types/members";
+import { Stake } from "@joystream/types/stake";
+import { RewardRelationship } from "@joystream/types/recurring-rewards";
+import { VotingResults } from "@joystream/types/augment/all";
+
+export interface AccountBalance {
+  accountId: string;
+  balance: AccountData;
+}
+
+export interface ElectionInfo {
+  durations: number[];
+  stage: any;
+  round: number;
+  stageEndsAt: number;
+  termEndsAt: number;
+}
+
+export interface Vote {
+  vote: string;
+  handle: string;
+}
+
+export interface ProposalDetail {
+  created: number;
+  finalizedAt: number;
+  message: string;
+  parameters: string;
+  stage: any;
+  result: string;
+  exec: any;
+  id: number;
+  title: string;
+  description: any;
+  votes: VotingResults;
+  type: string;
+  votesByAccount?: Vote[];
+  author?: string;
+  authorId: number;
+}
+
+export interface SpendingProposal {
+  id: number;
+  title: string;
+  amount: number;
+}
+
+export interface Round {
+  round: number;
+  start: number;
+  end: number;
+}
+
+export class Bounty {
+  constructor(
+    public testnet: string,
+    public proposalId: number,
+    public title: string,
+    public status: string,
+    public amountAsked: number,
+    public amountMinted: number
+  ) {}
+}
+
+export class CacheEvent {
+  constructor(
+    public section: string,
+    public method: string,
+    public data: GenericEventData
+  ) {}
+}
+
+export interface BlockEvent {
+  blockId: number;
+  section: string;
+  method: string;
+  data: string;
+}
+
+export interface WorkerReward {
+  id: number;
+  memberId: MemberId;
+  account: AccountId;
+  handle: string;
+  stake: Stake;
+  reward: RewardRelationship;
+  status: string;
+}
+
+// status endpoint at https://status.joystream.org/status
+export interface StatusData {
+  burns: Burn[];
+  dollarPoolChanges: DollarPoolChange[];
+  exchanges: Exchange[];
+  extecutedBurnsAmount: number;
+  price: string;
+  totalIssuance: string;
+  validators: { total_stake: string };
+}
+
+export interface DollarPoolChange {
+  blockHeight: number;
+  blockTime: string;
+  change: number;
+  reason: string;
+  issuance: number;
+  valueAfter: number;
+  rateAfter: number;
+}
+
+export interface Burn {
+  amount: number;
+  blockHeight: number;
+  date: string;
+  logTime: string;
+}
+
+export interface Exchange {
+  amount: number;
+  amountUSD: number;
+  blockHeight: number;
+  date: string;
+  logTime: string;
+  price: number;
+  recipient: string;
+  sender: string;
+  senderMemo: string;
+  status: string;
+  xmrAddress: string;
+}

+ 549 - 0
joystream-api/src/mintingAndBurning.ts

@@ -0,0 +1,549 @@
+import {
+  connectApi,
+  getBlockHash,
+  getEvents,
+  getIssuance,
+  getBlock,
+  getMint,
+  getPaidMembershipTermsById,
+  getWorker,
+} from "./joystream-lib/api";
+import {
+  AccountId,
+  EventRecord,
+  BlockHash,
+  SignedBlock,
+} from "@polkadot/types/interfaces";
+import { u128 } from "@polkadot/types/primitive";
+import { Extrinsic } from "@polkadot/types/interfaces";
+import path from "path";
+import {
+  MintingBlockData,
+  MintingAndBurningData,
+  StakingReward,
+  WorkingGroupMint,
+  BurningBlockData,
+  MintingAndBurningReport,
+  SpendingProposalMint,
+  RecurringRewards,
+  ExtrinsicsData,
+} from "./types";
+import { Vec } from "@polkadot/types";
+import { ProposalDetails, ProposalOf } from "@joystream/types/augment/types";
+import { RewardRelationship } from "@joystream/types/recurring-rewards";
+import { ApiPromise } from "@polkadot/api";
+import fs, { PathLike } from "fs";
+import { Mint } from "@joystream/types/mint";
+import { FinalizationData, ProposalStatus } from "@joystream/types/proposals";
+
+const saveFile = (jsonString: string, path: PathLike) => {
+  try {
+    fs.rmSync(path);
+  } catch (err) {
+    console.log("Error deleting file", err);
+  }
+  try {
+    fs.writeFile(path, jsonString, (err) => {
+      if (err) {
+        console.log("Error writing file", err);
+      } else {
+        console.log("Successfully wrote file");
+      }
+    });
+  } catch (err) {}
+};
+
+const appentToFile = (line: string, path: PathLike) =>
+  fs.appendFileSync(path, line);
+
+const saveMintingAndBurningJson = (report: MintingAndBurningReport) => {
+  // TODO Update final write to make the json valid instead of full overwrite
+  // saveFile(JSON.stringify(report, undefined, 4), mintingJsonPath);
+};
+
+const addToMintingAndBurningJson = (data: MintingAndBurningData) =>
+  appentToFile(`${JSON.stringify(data, undefined, 4)},\n`, mintingJsonPath);
+
+const saveToLog = (shouldWarn: boolean, line: string) => {
+  const logLine = `[${shouldWarn ? "WARN" : "INFO"}] ${line}`;
+  console.log(logLine);
+  if (shouldWarn) {
+    appentToFile(`${logLine}\n`, unknownSourcesLogPath);
+  }
+  appentToFile(`${logLine}\n`, mintingLogPath);
+};
+
+const filterBlockExtrinsicsByMethod = (block: SignedBlock, name: string) =>
+  block.block.extrinsics.filter(
+    ({ method: { method, section } }) => `${section}.${method}` === name
+  );
+
+const filterBlockExtrinsicsByMethods = (block: SignedBlock, names: string[]) =>
+  block.block.extrinsics.filter(
+    ({ method: { method, section } }) =>
+      names.indexOf(`${section}.${method}`) >= 0
+  );
+
+const filterByEvent = (eventName: string, events: Vec<EventRecord>) => {
+  return events.filter((event) => {
+    const { section, method } = event.event;
+    return `${section}.${method}` === eventName;
+  });
+};
+
+/**
+ * Every balances.BalanceSet event is minting new tokens.
+ */
+const processSudoEvents = (
+  events: Vec<EventRecord>,
+  report: MintingAndBurningData
+) => {
+  const setBalanceEvents = filterByEvent("balances.BalanceSet", events);
+  const { minting } = report;
+  if (setBalanceEvents.length > 0) {
+    setBalanceEvents.forEach((event: EventRecord) => {
+      const { data } = event.event;
+      const amount = Number(data[1]);
+      minting.sudoEvents.push({ amount });
+      minting.totalSudoMint += amount;
+    });
+  }
+};
+
+/**
+ * When spending proposal is executed, the amount is minted from a council mint.
+ */
+const getSpendingProposalAmount = async (
+  api: ApiPromise,
+  hash: BlockHash,
+  proposalId: number
+): Promise<number | undefined> => {
+  const proposalInfo = (await api.query.proposalsEngine.proposals.at(
+    hash,
+    proposalId
+  )) as ProposalOf;
+  const finalizedData = proposalInfo.status.asFinalized;
+  const proposalDetail =
+    (await api.query.proposalsCodex.proposalDetailsByProposalId.at(
+      hash,
+      proposalId
+    )) as ProposalDetails;
+  if (
+    finalizedData.proposalStatus.isApproved &&
+    finalizedData.proposalStatus.asApproved.isExecuted &&
+    proposalDetail.isSpending
+  ) {
+    const spendingParams = proposalDetail.asSpending;
+    return Number(spendingParams[0]);
+  }
+  return undefined;
+};
+
+/**
+ * When transfer occurs to a specific BURN_ADDRESS then in another transfer it converts to a tip and gets burned.
+ */
+const processBurnTransfers = async (
+  api: ApiPromise,
+  blockNumber: number,
+  report: MintingAndBurningData
+) => {
+  const { burning } = report;
+  const hash = await getBlockHash(api, blockNumber);
+  const block = await getBlock(api, hash);
+  const extrinsics = filterBlockExtrinsicsByMethod(block, "balances.transfer");
+  for (const ext of extrinsics) {
+    const extData = ext as unknown as Extrinsic;
+    const args = extData.method.args;
+    const tip = extData.tip.toNumber();
+    if (tip > 0 && args[0].toString() === BURN_ADDRESS) {
+      burning.tokensBurned += tip;
+    }
+  }
+};
+
+/**
+ * When operationsWorkingGroup.updateRewardAmount happens at the block when worker is expected to be rewarded,
+ * the reward is changed immidiately, so we need to update recurring rewards which we have generated on the previous block.
+ */
+const processWorkerRewardAmountUpdated = async (
+  api: ApiPromise,
+  blockNumber: number,
+  recurringRewards: RecurringRewards
+) => {
+  const hash = await getBlockHash(api, blockNumber);
+  const block = await getBlock(api, hash);
+  const groups = [
+    "operationsWorkingGroup",
+    "contentDirectoryWorkingGroup",
+    "storageWorkingGroup",
+  ];
+  for await (const group of groups) {
+    const extrinsics = filterBlockExtrinsicsByMethod(
+      block,
+      `${group}.updateRewardAmount`
+    );
+    for (const ext of extrinsics) {
+      const extData = ext as unknown as Extrinsic;
+      const args = extData.method.args;
+      const workerId = Number(args[0]);
+      const newAmount = Number(args[1]);
+      const worker = await getWorker(api, group, hash, workerId);
+      const relationship = Number(worker.reward_relationship.unwrap());
+      const previousBlockWorkerReward = recurringRewards.rewards[
+        blockNumber
+      ].filter((r) => Number(r.recipient) === relationship);
+      if (previousBlockWorkerReward.length == 0) {
+        const reward = (
+          await api.query.recurringRewards.rewardRelationships.at(
+            hash,
+            relationship
+          )
+        ).toJSON() as unknown as RewardRelationship;
+        recurringRewards.rewards[blockNumber].push(reward);
+      } else {
+        previousBlockWorkerReward.forEach(async (reward) => {
+          const mint = (
+            await getMint(api, hash, reward.mint_id)
+          ).toJSON() as unknown as Mint;
+          reward.amount_per_payout = newAmount as unknown as u128;
+        });
+      }
+    }
+  }
+};
+
+/**
+ * Every membership creation burns tokens, checking `members.MemberRegistered` events to detect such burnings.
+ */
+const processMembershipCreation = async (
+  api: ApiPromise,
+  hash: BlockHash,
+  events: Vec<EventRecord>,
+  report: MintingAndBurningData
+) => {
+  const membershipEvents = filterByEvent("members.MemberRegistered", events);
+  const { burning } = report;
+  if (membershipEvents.length > 0) {
+    const block = await getBlock(api, hash);
+    // intentionally skipping `members.addScreenedMember` because there is no paid fee in this case
+    const extrinsics = filterBlockExtrinsicsByMethod(
+      block,
+      "members.buyMembership"
+    );
+    for await (const ext of extrinsics) {
+      const data = ext.toHuman() as unknown as ExtrinsicsData;
+      const paidTermId = Number(data.method.args[0]);
+      const terms = await getPaidMembershipTermsById(api, hash, paidTermId);
+      const membershipCreationFee = Number(terms.fee);
+      burning.totalMembershipCreation += membershipCreationFee;
+    }
+    membershipEvents.forEach((event) => {
+      const { data } = event.event;
+      const dataJson = data.toJSON() as object[];
+      const memberId = dataJson[0] as unknown as number;
+      const accountId = dataJson[0] as unknown as string;
+      burning.membershipCreation.push({ memberId, accountId });
+    });
+  }
+};
+
+/**
+ * Working Groups recurring reward payments do not emit event, so this is used to detect if there was a specific reward payment.
+ */
+const reloadRecurringRewards = async (
+  api: ApiPromise,
+  recurringRewards: RecurringRewards,
+  blockNumber: number,
+  hash: BlockHash
+) => {
+  const totalRewards = Number(
+    await api.query.recurringRewards.rewardRelationshipsCreated.at(hash)
+  );
+  recurringRewards.rewards = {};
+  for (let id = 0; id < totalRewards; ++id) {
+    const reward = (
+      await api.query.recurringRewards.rewardRelationships.at(hash, id)
+    ).toJSON() as unknown as RewardRelationship;
+    if (reward.next_payment_at_block && reward.amount_per_payout) {
+      const paymentBlock = reward.next_payment_at_block as unknown as number;
+      if (paymentBlock == blockNumber + 1) {
+        if (recurringRewards.rewards[paymentBlock] === undefined) {
+          recurringRewards.rewards[paymentBlock] = [];
+        }
+        const mint = (
+          await getMint(api, hash, reward.mint_id)
+        ).toJSON() as unknown as Mint;
+
+        const nextBlockPaymentFromCurrentMint = recurringRewards.rewards[
+          paymentBlock
+        ]
+          .filter((r) => r.mint_id == reward.mint_id)
+          .reduce((sum, current) => sum + Number(current.amount_per_payout), 0);
+        if (
+          nextBlockPaymentFromCurrentMint + Number(reward.amount_per_payout) <=
+          Number(mint.capacity)
+        ) {
+          recurringRewards.rewards[paymentBlock].push(reward);
+        }
+      }
+    }
+  }
+};
+
+/**
+ * Event `staking.Reward` means validator/nominator got rewarderd.
+ */
+const processStakingRewards = (
+  events: Vec<EventRecord>,
+  report: MintingAndBurningData
+) => {
+  const stakingEvents = filterByEvent("staking.Reward", events);
+  const { minting } = report;
+  if (stakingEvents.length > 0) {
+    stakingEvents.forEach((event) => {
+      const { data } = event.event;
+      const dataJson = data.toJSON() as object[];
+      const reward = dataJson[1] as unknown as number;
+      const accountId = dataJson[0] as AccountId;
+      minting.stakingRewardsTotal += reward;
+      minting.stakingRewards.push({
+        address: accountId,
+        reward,
+      });
+    });
+  }
+};
+
+/**
+ * When some tip is added, it gets burned.
+ */
+const processTips = async (
+  api: ApiPromise,
+  events: EventRecord[],
+  report: MintingAndBurningData,
+  hash: BlockHash
+) => {
+  const { burning } = report;
+  if (events.length > 0) {
+    const block = await getBlock(api, hash);
+    const burnExtrinsics = filterBlockExtrinsicsByMethods(block, [
+      "utility.batch",
+      "staking.bond",
+      "session.setKeys",
+      "staking.nominate",
+      "members.buyMembership",
+    ]);
+    for (const item of burnExtrinsics) {
+      const ext = item as unknown as Extrinsic;
+      const tip = ext.tip.toNumber();
+      burning.tokensBurned += tip;
+    }
+  }
+};
+
+const getTotalMinted = (report: MintingAndBurningData) => {
+  return (
+    report.minting.totalSudoMint +
+    report.minting.totalSpendingProposalsMint +
+    report.minting.stakingRewardsTotal +
+    report.minting.totalRecurringRewardsMint
+  );
+};
+
+const getTotalBurned = (report: MintingAndBurningData) => {
+  return (
+    report.burning.tokensBurned +
+    report.burning.totalProposalCancellationFee +
+    report.burning.totalMembershipCreation
+  );
+};
+
+/**
+ * Process event `proposalsEngine.ProposalStatusUpdated`
+ * If proposal is cancelled, update the burning with cancellation fee.
+ * If proposal is spendind and executed, update the minting with the spending amount.
+ */
+const processProposals = async (
+  api: ApiPromise,
+  events: Vec<EventRecord>,
+  report: MintingAndBurningData,
+  hash: BlockHash
+) => {
+  const proposalEvents = filterByEvent(
+    "proposalsEngine.ProposalStatusUpdated",
+    events
+  );
+  const { minting, burning } = report;
+  if (proposalEvents.length > 0) {
+    for (const event of proposalEvents) {
+      const { data } = event.event;
+      const dataJson = data.toJSON() as object[];
+      const proposalId = dataJson[0] as unknown as number;
+      const block = await getBlock(api, hash);
+      const cancelledProposals = filterBlockExtrinsicsByMethod(
+        block,
+        "proposalsEngine.cancelProposal"
+      );
+      for (const {} of cancelledProposals) {
+        burning.totalProposalCancellationFee += 10000; // TODO get proposal cancellation fee from chains
+        burning.cancelledProposals.push(proposalId);
+      }
+      const proposalStatusWrapper = dataJson[1] as unknown as ProposalStatus;
+      const finalizationData = (
+        proposalStatusWrapper as unknown as {
+          [key: string]: FinalizationData[];
+        }
+      )["finalized"] as unknown as FinalizationData;
+      for await (const key of Object.keys(finalizationData.proposalStatus)) {
+        if (key.toString() === "expired" || key.toString() === "rejected") {
+          burning.totalProposalCancellationFee += 5000; // TODO get proposal rejected/expired fee from chains
+        }
+      }
+
+      const spendingProposalAmount = await getSpendingProposalAmount(
+        api,
+        hash,
+        proposalId
+      );
+      if (
+        spendingProposalAmount &&
+        minting.spendingProposals.filter(
+          (p) =>
+            p.proposalId === proposalId && p.amount === spendingProposalAmount
+        ).length === 0
+      ) {
+        minting.spendingProposals.push({
+          proposalId,
+          amount: spendingProposalAmount,
+        });
+        minting.totalSpendingProposalsMint += spendingProposalAmount;
+      }
+    }
+  }
+};
+const mintingJsonPath = path.resolve(
+  __dirname,
+  "..",
+  "report",
+  "mintingAndBurning.json"
+);
+const mintingLogPath = path.resolve(
+  __dirname,
+  "..",
+  "report",
+  "mintingAndBurning.log"
+);
+const unknownSourcesLogPath = path.resolve(
+  __dirname,
+  "..",
+  "report",
+  "unknownSources.log"
+);
+const endpoint = "ws://localhost:9944"; // "wss://rome-rpc-endpoint.joystream.org:9944"
+const BURN_ADDRESS = "5D5PhZQNJzcJXVBxwJxZcsutjKPqUPydrvpu6HeiBfMaeKQu";
+const args = process.argv.slice(2);
+const startBlock = Number(args[0]) || 720370;
+const endBlock = Number(args[1]) || 2862336;
+
+export async function readMintingAndBurning() {
+  const api = await connectApi(endpoint);
+  await api.isReady;
+  await processBlockRange(api, startBlock, endBlock);
+  // TODO uncommment and fill the array with specific blocks if you need to check some specific list of blocks
+  // const specificBlocks = [1556265, 1606888];
+  // for (const block of specificBlocks) {
+  //   await processBlockRange(api, block - 1, block);
+  // }
+}
+
+async function processBlockRange(api: ApiPromise, start: number, end: number) {
+  console.log(`Process events in a range [${start} - ${end}]`);
+  const recurringRewards = {
+    rewards: {},
+  } as RecurringRewards;
+  const mintingAndBurningReport = {
+    blocks: [],
+  } as unknown as MintingAndBurningReport;
+  let prevIssuance: number = 0;
+  for (let blockNumber = start; blockNumber <= end; blockNumber += 1) {
+    if (blockNumber % 10 === 0) {
+      console.log(
+        `Block [${blockNumber}] Timestamp: [${new Date().toISOString()}]`
+      );
+    }
+    const hash = await getBlockHash(api, blockNumber);
+    const issuance = await getIssuance(api, hash);
+    const events = await getEvents(api, hash);
+    const report = {
+      block: Number(blockNumber),
+      issuance: Number(issuance),
+      minting: {
+        sudoEvents: [],
+        totalSudoMint: 0,
+        totalWorkingGroupsMint: 0,
+        workingGroupsMints: [] as WorkingGroupMint[],
+        stakingRewardsTotal: 0,
+        stakingRewards: [] as StakingReward[],
+        spendingProposals: [] as SpendingProposalMint[],
+        totalSpendingProposalsMint: 0,
+        totalRecurringRewardsMint: 0,
+      } as MintingBlockData,
+      burning: {
+        tokensBurned: 0,
+        totalMembershipCreation: 0,
+        totalProposalCancellationFee: 0,
+        cancelledProposals: [],
+        membershipCreation: [],
+      } as BurningBlockData,
+    } as MintingAndBurningData;
+
+    const totalIssuance = report.issuance;
+    const actualIssuanceDelta = totalIssuance - prevIssuance;
+    if (prevIssuance !== 0 && totalIssuance !== prevIssuance) {
+      await processTips(api, events, report, hash);
+      await processProposals(api, events, report, hash);
+      processStakingRewards(events, report);
+      processMembershipCreation(api, hash, events, report);
+      processSudoEvents(events, report);
+      await processWorkerRewardAmountUpdated(
+        api,
+        blockNumber,
+        recurringRewards
+      );
+      await processBurnTransfers(api, blockNumber, report);
+      if (recurringRewards.rewards[blockNumber]) {
+        report.minting.totalRecurringRewardsMint = recurringRewards.rewards[
+          blockNumber
+        ].reduce((a, b) => a + Number(b.amount_per_payout), 0);
+      }
+      const totalMinted = getTotalMinted(report);
+      const totalBurned = getTotalBurned(report);
+      const calculatedDelta = totalMinted - totalBurned;
+      if (
+        report.burning.tokensBurned > 0 ||
+        report.burning.totalProposalCancellationFee > 0 ||
+        report.burning.totalMembershipCreation > 0 ||
+        report.minting.totalSudoMint > 0 ||
+        report.minting.totalWorkingGroupsMint > 0 ||
+        report.minting.totalSpendingProposalsMint > 0 ||
+        report.minting.stakingRewardsTotal > 0
+      ) {
+        mintingAndBurningReport.blocks.push(report);
+      }
+      const shouldWarn =
+        totalIssuance !== actualIssuanceDelta &&
+        prevIssuance !== actualIssuanceDelta &&
+        calculatedDelta !== actualIssuanceDelta;
+      const issuanceInfo = `Issuance: [${issuance}] Previous issuance: [${prevIssuance}] Delta: [${actualIssuanceDelta}] Calculated Delta: [${calculatedDelta}]`;
+      const mintBurnInfo = `Total Minted: [${totalMinted}] Total Burned: [${totalBurned}]`;
+      const logLine = `Block: [${blockNumber}] ${issuanceInfo} ${mintBurnInfo}`;
+      saveToLog(shouldWarn, logLine);
+      addToMintingAndBurningJson(report);
+    }
+    await reloadRecurringRewards(api, recurringRewards, blockNumber, hash);
+    prevIssuance = totalIssuance;
+  }
+  saveMintingAndBurningJson(mintingAndBurningReport);
+}
+
+readMintingAndBurning();

+ 558 - 0
joystream-api/src/types.ts

@@ -0,0 +1,558 @@
+import { ProposalParameters, VotingResults } from "@joystream/types/proposals";
+import { AccountId, Nominations } from "@polkadot/types/interfaces";
+import { Option } from "@polkadot/types/codec";
+import { StorageKey } from "@polkadot/types/primitive";
+import { IElectionStake } from "@joystream/types/council";
+import { Channel } from "@joystream/types/content";
+import { WorkerId } from "@joystream/types/working-group";
+import { MemberId } from "@joystream/types/members";
+import { RewardRelationship } from "@joystream/types/recurring-rewards";
+
+export interface Api {
+  query: any;
+  rpc: any;
+  derive: any;
+}
+
+export interface ProposalVote {
+  id: number;
+  consulId: number;
+  memberId: number;
+  proposalId: number;
+  proposal: { title: string };
+  vote: string;
+}
+
+export interface CouncilVote {
+  id: number;
+  stake: number;
+  memberId: number;
+  member: { handle: string };
+}
+
+export interface Consul {
+  consulId: number;
+  councilRound: number;
+  memberId: number;
+  member: { handle: string };
+  stake: number;
+  voters: CouncilVote[];
+  votes: ProposalVote[];
+}
+
+export interface Council {
+  round: number;
+  start: number;
+  end: number;
+  startDate: string;
+  endDate: string;
+  consuls: Consul[];
+}
+
+export interface ElectionStage {
+  durations: number[];
+  stage: any;
+  round: number;
+  stageEndsAt: number;
+  termEndsAt: number;
+}
+
+export interface IApplicant {
+  member: Member;
+  electionStake: IElectionStake;
+}
+
+export interface IElectionState {
+  applicants: IApplicant[];
+  votes: IVote[];
+  stage: { [key: string]: Number };
+  councilRound: Number;
+}
+
+export interface IVote {
+  voterHandle: string;
+  voterId: Number;
+  candidateHandle: string | undefined;
+  candidateId: Number | undefined;
+  newStake: Number;
+  transferredStake: Number;
+}
+
+export interface Status {
+  status: Seat[];
+  members: number;
+  proposalPosts: any;
+  councilApplicants: IApplicant[];
+  councilVotes: IVote[];
+  version: number;
+  now: number;
+  block: Block;
+  era: number;
+  connecting: boolean;
+  loading: string;
+  council?: Council;
+  election: ElectionStage;
+  durations: number[];
+  issued: number;
+  price: number;
+  proposals: number;
+  channels: number;
+  categories: number;
+  threads: number;
+  posts: number;
+  lastReward: number;
+  startTime: number;
+}
+
+export interface FAQItem {
+  question: string;
+  answer: string;
+}
+
+export interface IState {
+  assets: string[];
+  connecting: boolean;
+  loading: string;
+  processingTasks: number;
+  faq: FAQItem[];
+  fetching: string;
+  providers: any[];
+  status: Status;
+  blocks: Block[];
+  nominators: string[];
+  validators: string[];
+  stashes: string[];
+  councils: Seat[][];
+  channels: Channel[];
+  categories: Category[];
+  proposals: ProposalDetail[];
+  posts: Post[];
+  threads: Thread[];
+  domain: string;
+  proposalPosts: any[];
+  members: Member[];
+  mints: any[];
+  tokenomics?: Tokenomics;
+  reports: { [key: string]: string };
+  [key: string]: any;
+  stars: { [key: string]: boolean };
+  stakes?: { [key: string]: Stakes };
+  rewardPoints?: RewardPoints;
+  hideFooter: boolean;
+  showStatus: boolean;
+  getMember: (m: string | number) => Member;
+}
+
+export interface RewardPoints {
+  total: number;
+  individual: { [account: string]: number };
+}
+
+export interface Stake {
+  who: string;
+  value: number;
+}
+
+export interface Stakes {
+  total: number;
+  own: number;
+  others: Stake[];
+  commission: number;
+}
+
+export interface Seat {
+  member: string;
+  handle?: string;
+  id?: number;
+  stake: number;
+  backers: Backer[];
+}
+
+export interface Backer {
+  member: string;
+  stake: number;
+}
+
+export interface Council {
+  round: number;
+  last: string;
+}
+
+export interface Options {
+  verbose: number;
+  channel: boolean;
+  council: boolean;
+  forum: boolean;
+  proposals: boolean;
+}
+
+export interface ProposalDetail {
+  createdAt: number;
+  finalizedAt: number;
+  message: string;
+  parameters: ProposalParameters;
+  stage: any;
+  result: string;
+  executed?: { Executed: null } | { ExecutionFailed: { error: string } };
+  id: number;
+  title: string;
+  description: any;
+  votes: VotingResults;
+  type: string;
+  votesByAccount?: Vote[];
+  author: string;
+  authorId: number;
+  detail?: any;
+}
+
+interface Vote {
+  id: number;
+  vote: String;
+  member: { id: number; handle: string };
+}
+
+export type ProposalArray = number[];
+
+export interface ProposalPost {
+  threadId: number;
+  text: string;
+  id: number;
+  handle?: string;
+}
+
+export interface Proposals {
+  current: number;
+  last: number;
+  active: ProposalArray;
+  executing: ProposalArray;
+}
+
+// export interface Channel {
+//   id: number;
+//   handle: string;
+//   title: string;
+//   description: string;
+//   avatar: string;
+//   banner: string;
+//   content: string;
+//   ownerId: number;
+//   accountId: string;
+//   publicationStatus: boolean;
+//   curation: string;
+//   createdAt: string;
+//   principal: number;
+// }
+
+export interface Category {
+  id: number;
+  threadId: number;
+  title: string;
+  description: string;
+  createdAt: number;
+  deleted: boolean;
+  archived: boolean;
+  subcategories: number;
+  unmoderatedThreads: number;
+  moderatedThreads: number;
+  position: number;
+  moderatorId: string;
+}
+
+export interface Post {
+  id: number;
+  text: string;
+  threadId: number;
+  authorId: string;
+  createdAt: { block: number; time: number };
+}
+
+export interface Thread {
+  id: number;
+  title: string;
+  categoryId: number;
+  nrInCategory: number;
+  moderation: string;
+  createdAt: string;
+  authorId: string;
+}
+
+export interface Member {
+  rootKey: string;
+  account: string;
+  handle: string;
+  id: number;
+  registeredAt: number;
+  about: string;
+}
+
+export interface Block {
+  id: number;
+  timestamp: number;
+  duration: number;
+}
+
+export interface Summary {
+  blocks: Block[];
+  validators: number[];
+  nominators: number[];
+}
+
+export type NominatorsEntries = [StorageKey, Option<Nominations>][];
+
+export interface ProviderStatus {
+  [propName: string]: boolean;
+}
+
+export interface DollarPoolChange {
+  blockheight: number;
+  blockTime: string;
+  change: number;
+  reason: string;
+  issuance: number;
+  valueAfter: number;
+  rateAfter: number;
+}
+
+export interface Tokenomics {
+  dollarPoolChanges: DollarPoolChange[];
+  price: string;
+  totalIssuance: string;
+  validators: { total_stake: string };
+  burns: Burn[];
+  exchanges: Exchange[];
+  extecutedBurnsAmount: number;
+}
+
+export interface Burn {
+  amount: number;
+  blockHeight: number;
+  date: string; // "2020-09-21T11:07:54.000Z"
+  logTime: string; //"2020-09-21T11:08:54.091Z"
+}
+
+export interface Exchange {
+  amount: number;
+  amountUSD: number;
+  blockHeight: number;
+  date: string; // "2020-09-21T11:07:48.000Z"
+  logTime: string; // "2020-09-21T11:08:48.552Z"
+  price: number; // 0.000053676219442924057
+  recipient: string; //"5D5PhZQNJzcJXVBxwJxZcsutjKPqUPydrvpu6HeiBfMaeKQu"
+  sender: string; // "5DACzSg65taZ2NRktUtzBjhLZr8H5T8rwNoZUng9gQV6ayqT"
+  senderMemo: string; //"4Testing1337SendToBurnerAddressHopingItWorksOfc5D5PhZQNJzcJXVBxwJxZcsutjKPqUPydrvpu6HeiBfMaeKQu"
+  status: string; // FINALIZED | PENDING
+  xmrAddress: string; //"No address found"
+}
+
+export interface Event {
+  text: string;
+  date: number;
+  category: {
+    tag: string;
+    color: string;
+  };
+  link: {
+    url: string;
+    text: string;
+  };
+}
+
+export interface Transaction {
+  id: number;
+  block: number;
+  from: string;
+  to: string;
+  amount: number;
+}
+
+export interface Burner {
+  wallet: string;
+  totalburned: number;
+}
+
+export interface Burner {
+  wallet: string;
+  totalburned: number;
+}
+
+export interface ValidatorApiResponse {
+  pageSize: number;
+  totalCount: number;
+  startBlock: number;
+  endBlock: number;
+  startTime: string;
+  endTime: string;
+  startEra: number;
+  endEra: number;
+  totalBlocks: number;
+  report: ValidatorReportLineItem[];
+}
+
+export interface ValidatorReportLineItem {
+  id: number;
+  stakeTotal: string;
+  stakeOwn: string;
+  points: number;
+  rewards: number;
+  commission: number;
+  blocksCount: number;
+}
+
+export interface CalendarGroup {
+  id: number;
+  title: string;
+}
+
+export interface SeatData {
+  accountId: AccountId;
+  member: Member;
+  ownStake: number;
+  backersStake: number;
+  jsgStake: number;
+  totalStake: number;
+  backers: BakerData[];
+}
+
+export interface Member {
+  accountId: AccountId;
+  handle: string;
+  id: number;
+}
+
+export interface BakerData {
+  member: Member;
+  stake: number;
+}
+
+export interface CouncilRound {
+  round: number;
+  termEndsAt: number;
+  seats: SeatData[];
+}
+
+export interface CouncilRounds {
+  rounds: CouncilRound[];
+}
+
+export interface DataDirectorySize {
+  block: number;
+  date: Date;
+  size: String;
+}
+
+export interface DataDirectorySizes {
+  sizes: DataDirectorySize[];
+}
+
+export interface ChannelInfo {
+  channelId: number,
+  memberId: number,
+  memberHandle: string,
+  rewardAccount: string,
+  videos: Array<Number>,
+  // channel: Channel
+}
+export interface PeriodChannels {
+  block: number;
+  date: Date;
+  channelsCreated: number,
+  videosUploaded: number,
+  channels: ChannelInfo[];
+}
+
+export interface ChannelsByPeriod {
+  periods: PeriodChannels[]
+}
+
+export interface OwnerInfo {
+  member: number
+}
+export interface WorkerOf {
+  member_id: MemberId,
+  reward_relationship: number | null
+}
+
+export interface CurationByPeriods {
+  periods: PeriodCurators[]
+}
+
+export interface PeriodCurators {
+  block: number;
+  date: Date;
+  curatorLead: Curator,
+  curators: Curator[]
+}
+
+export interface Curator {
+  workerId: WorkerId,
+  memberId: MemberId | null,
+  memberHandle: string | null,
+}
+
+
+export interface StakingReward {
+  address: AccountId,
+  reward: number
+}
+
+export interface WorkingGroupMint {
+  event: string,
+  mintId: number,
+  amount: number
+}
+
+export interface SpendingProposalMint {
+  proposalId: number,
+  amount: number
+}
+
+export interface SudoMintEvent {
+  amount: number,
+}
+
+export interface MintingBlockData {
+  sudoEvents: SudoMintEvent[],
+  totalSudoMint: number,
+  totalWorkingGroupsMint: number,
+  workingGroupsMints: WorkingGroupMint[],
+  stakingRewardsTotal: number,
+  stakingRewards: StakingReward[],
+  totalSpendingProposalsMint: number,
+  totalRecurringRewardsMint: number,
+  spendingProposals: SpendingProposalMint[]
+}
+
+export interface MembershipCreation {
+  accountId: string,
+  memberId: number
+}
+
+export interface BurningBlockData {
+  tokensBurned: number,
+  totalMembershipCreation: number,
+  membershipCreation: MembershipCreation[],
+  totalProposalCancellationFee: number,
+  cancelledProposals: number[]
+}
+
+export interface MintingAndBurningData {
+  block: number,
+  issuance: number,
+  minting: MintingBlockData,
+  burning: BurningBlockData,
+}
+
+export interface MintingAndBurningReport {
+  blocks: MintingAndBurningData[]
+}
+
+export interface RecurringRewards {
+  rewards: { [key: number]: RewardRelationship[] };
+}
+
+export interface ExtrinsicsData {
+  method: {
+    args: string[]
+  },
+  tip: string
+}

+ 72 - 0
joystream-api/tsconfig.json

@@ -0,0 +1,72 @@
+{
+  "compilerOptions": {
+    /* Visit https://aka.ms/tsconfig.json to read more about this file */
+
+    /* Basic Options */
+    // "incremental": true,                         /* Enable incremental compilation */
+    "target": "es6",                                /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */
+    "module": "commonjs",                           /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
+    "lib": ["es2019"],                              /* Specify library files to be included in the compilation. */
+    // "allowJs": true,                             /* Allow javascript files to be compiled. */
+    // "checkJs": true,                             /* Report errors in .js files. */
+    // "jsx": "preserve",                           /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
+    // "declaration": true,                         /* Generates corresponding '.d.ts' file. */
+    // "declarationMap": true,                      /* Generates a sourcemap for each corresponding '.d.ts' file. */
+    "sourceMap": true,                           /* Generates corresponding '.map' file. */
+    // "outFile": "./",                             /* Concatenate and emit output to single file. */
+    "outDir": "./dist",                              /* Redirect output structure to the directory. */
+    "rootDir": "./src",                               /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
+    // "composite": true,                           /* Enable project compilation */
+    // "tsBuildInfoFile": "./",                     /* Specify file to store incremental compilation information */
+    // "removeComments": true,                      /* Do not emit comments to output. */
+    // "noEmit": true,                              /* Do not emit outputs. */
+    // "importHelpers": true,                       /* Import emit helpers from 'tslib'. */
+    // "downlevelIteration": true,                  /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
+    // "isolatedModules": true,                     /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
+
+    /* Strict Type-Checking Options */
+    "strict": true,                                 /* Enable all strict type-checking options. */
+    "noImplicitAny": true,                          /* Raise error on expressions and declarations with an implied 'any' type. */
+    "strictNullChecks": true,                    /* Enable strict null checks. */
+    // "strictFunctionTypes": true,                 /* Enable strict checking of function types. */
+    // "strictBindCallApply": true,                 /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
+    // "strictPropertyInitialization": true,        /* Enable strict checking of property initialization in classes. */
+    // "noImplicitThis": true,                      /* Raise error on 'this' expressions with an implied 'any' type. */
+    // "alwaysStrict": true,                        /* Parse in strict mode and emit "use strict" for each source file. */
+
+    /* Additional Checks */
+    // "noUnusedLocals": true,                      /* Report errors on unused locals. */
+    // "noUnusedParameters": true,                  /* Report errors on unused parameters. */
+    // "noImplicitReturns": true,                   /* Report error when not all code paths in function return a value. */
+    // "noFallthroughCasesInSwitch": true,          /* Report errors for fallthrough cases in switch statement. */
+    // "noUncheckedIndexedAccess": true,            /* Include 'undefined' in index signature results */
+    // "noImplicitOverride": true,                  /* Ensure overriding members in derived classes are marked with an 'override' modifier. */
+    // "noPropertyAccessFromIndexSignature": true,  /* Require undeclared properties from index signatures to use element accesses. */
+
+    /* Module Resolution Options */
+    // "moduleResolution": "node",                  /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
+    // "baseUrl": "./",                             /* Base directory to resolve non-absolute module names. */
+    // "paths": {},                                 /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
+    // "rootDirs": [],                              /* List of root folders whose combined content represents the structure of the project at runtime. */
+    // "typeRoots": [],                             /* List of folders to include type definitions from. */
+    // "types": [],                                 /* Type declaration files to be included in compilation. */
+    // "allowSyntheticDefaultImports": true,        /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
+    "esModuleInterop": true,                        /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
+    // "preserveSymlinks": true,                    /* Do not resolve the real path of symlinks. */
+    // "allowUmdGlobalAccess": true,                /* Allow accessing UMD globals from modules. */
+
+    /* Source Map Options */
+    // "sourceRoot": "",                            /* Specify the location where debugger should locate TypeScript files instead of source locations. */
+    // "mapRoot": "",                               /* Specify the location where debugger should locate map files instead of generated locations. */
+    // "inlineSourceMap": true,                     /* Emit a single file with source maps instead of having a separate file. */
+    // "inlineSources": true,                       /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
+
+    /* Experimental Options */
+    "experimentalDecorators": true,              /* Enables experimental support for ES7 decorators. */
+    "emitDecoratorMetadata": true,               /* Enables experimental support for emitting type metadata for decorators. */
+
+    /* Advanced Options */
+    "skipLibCheck": true,                           /* Skip type checking of declaration files. */
+    "forceConsistentCasingInFileNames": true        /* Disallow inconsistently-cased references to the same file. */
+  }
+}

+ 15 - 0
joystream-api/tslint.json

@@ -0,0 +1,15 @@
+{
+    "defaultSeverity": "error",
+    "extends": [
+        "tslint:recommended"
+    ],
+    "jsRules": {},
+    "rules": {},
+    "rulesDirectory": [],
+    "linterOptions": {
+        "exclude": [
+            "src/joystream-lib/media.ts",
+            "src/joystream-lib/rewards.ts"
+        ]
+    }
+}

+ 3259 - 0
joystream-api/yarn.lock

@@ -0,0 +1,3259 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0":
+  version "7.15.8"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503"
+  integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==
+  dependencies:
+    "@babel/highlight" "^7.14.5"
+
+"@babel/helper-validator-identifier@^7.14.5":
+  version "7.15.7"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389"
+  integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==
+
+"@babel/highlight@^7.14.5":
+  version "7.14.5"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
+  integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.14.5"
+    chalk "^2.0.0"
+    js-tokens "^4.0.0"
+
+"@babel/runtime@^7.13.10", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.3":
+  version "7.15.4"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a"
+  integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
+"@cspotcode/source-map-consumer@0.8.0":
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
+  integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
+
+"@cspotcode/source-map-support@0.6.1":
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz#118511f316e2e87ee4294761868e254d3da47960"
+  integrity sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==
+  dependencies:
+    "@cspotcode/source-map-consumer" "0.8.0"
+
+"@joystream/types@^0.16.1":
+  version "0.16.1"
+  resolved "https://registry.yarnpkg.com/@joystream/types/-/types-0.16.1.tgz#40f5014a9b64928ccea634a1f0f5d2b0392de293"
+  integrity sha512-Jz8M6F4oRKH4WtEn8kpZvSMi0mVbfGSmjt38CcEu2946TYmCwlC3Ad1RFH8Wlcylqz/fMLL+pe0z1Dvo6dfzJA==
+  dependencies:
+    "@polkadot/api" "4.2.1"
+    "@polkadot/keyring" "^6.0.5"
+    "@polkadot/types" "4.2.1"
+    "@types/lodash" "^4.14.157"
+    "@types/vfile" "^4.0.0"
+    ajv "^6.11.0"
+    lodash "^4.17.15"
+    moment "^2.24.0"
+
+"@opencensus/core@0.0.9":
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/@opencensus/core/-/core-0.0.9.tgz#b16f775435ee309433e4126af194d37313fc93b3"
+  integrity sha512-31Q4VWtbzXpVUd2m9JS6HEaPjlKvNMOiF7lWKNmXF84yUcgfAFL5re7/hjDmdyQbOp32oGc+RFV78jXIldVz6Q==
+  dependencies:
+    continuation-local-storage "^3.2.1"
+    log-driver "^1.2.7"
+    semver "^5.5.0"
+    shimmer "^1.2.0"
+    uuid "^3.2.1"
+
+"@opencensus/core@^0.0.8":
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/@opencensus/core/-/core-0.0.8.tgz#df01f200c2d2fbfe14dae129a1a86fb87286db92"
+  integrity sha512-yUFT59SFhGMYQgX0PhoTR0LBff2BEhPrD9io1jWfF/VDbakRfs6Pq60rjv0Z7iaTav5gQlttJCX2+VPxFWCuoQ==
+  dependencies:
+    continuation-local-storage "^3.2.1"
+    log-driver "^1.2.7"
+    semver "^5.5.0"
+    shimmer "^1.2.0"
+    uuid "^3.2.1"
+
+"@opencensus/propagation-b3@0.0.8":
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/@opencensus/propagation-b3/-/propagation-b3-0.0.8.tgz#0751e6fd75f09400d9d3c419001e9e15a0df68e9"
+  integrity sha512-PffXX2AL8Sh0VHQ52jJC4u3T0H6wDK6N/4bg7xh4ngMYOIi13aR1kzVvX1sVDBgfGwDOkMbl4c54Xm3tlPx/+A==
+  dependencies:
+    "@opencensus/core" "^0.0.8"
+    uuid "^3.2.1"
+
+"@pm2/agent@~2.0.0":
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/@pm2/agent/-/agent-2.0.1.tgz#0edffc54cd8ee2b12f90136264e7880f3f78c79d"
+  integrity sha512-QKHMm6yexcvdDfcNE7PL9D6uEjoQPGRi+8dh+rc4Hwtbpsbh5IAvZbz3BVGjcd4HaX6pt2xGpOohG7/Y2L4QLw==
+  dependencies:
+    async "~3.2.0"
+    chalk "~3.0.0"
+    dayjs "~1.8.24"
+    debug "~4.3.1"
+    eventemitter2 "~5.0.1"
+    fast-json-patch "^3.0.0-1"
+    fclone "~1.0.11"
+    nssocket "0.6.0"
+    pm2-axon "~4.0.1"
+    pm2-axon-rpc "~0.7.0"
+    proxy-agent "~5.0.0"
+    semver "~7.2.0"
+    ws "~7.4.0"
+
+"@pm2/io@~5.0.0":
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/@pm2/io/-/io-5.0.0.tgz#623cbcaf6fe39375f20ac2e75497477a1b1ec5c5"
+  integrity sha512-3rToDVJaRoob5Lq8+7Q2TZFruoEkdORxwzFpZaqF4bmH6Bkd7kAbdPrI/z8X6k1Meq5rTtScM7MmDgppH6aLlw==
+  dependencies:
+    "@opencensus/core" "0.0.9"
+    "@opencensus/propagation-b3" "0.0.8"
+    async "~2.6.1"
+    debug "~4.3.1"
+    eventemitter2 "^6.3.1"
+    require-in-the-middle "^5.0.0"
+    semver "6.3.0"
+    shimmer "^1.2.0"
+    signal-exit "^3.0.3"
+    tslib "1.9.3"
+
+"@pm2/js-api@~0.6.7":
+  version "0.6.7"
+  resolved "https://registry.yarnpkg.com/@pm2/js-api/-/js-api-0.6.7.tgz#ed28c3b7b6d26f03f826318754fdc5468afa589f"
+  integrity sha512-jiJUhbdsK+5C4zhPZNnyA3wRI01dEc6a2GhcQ9qI38DyIk+S+C8iC3fGjcjUbt/viLYKPjlAaE+hcT2/JMQPXw==
+  dependencies:
+    async "^2.6.3"
+    axios "^0.21.0"
+    debug "~4.3.1"
+    eventemitter2 "^6.3.1"
+    ws "^7.0.0"
+
+"@pm2/pm2-version-check@latest":
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz#cf97fbb14b0eca95430ca05eedccbd2683806e43"
+  integrity sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==
+  dependencies:
+    debug "^4.3.1"
+
+"@polkadot/api-derive@4.2.1":
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-4.2.1.tgz#848a2a9ef947f08660af2571f72ca2b06969f2e3"
+  integrity sha512-TQqhK356IEk7ksMDE/tA3ZKqFEI8O8virZItd/w+RFaBs/HfbDNP8p+xPM5+6Rif3kuBzdubMv3Bdq/OIAJc6g==
+  dependencies:
+    "@babel/runtime" "^7.13.10"
+    "@polkadot/api" "4.2.1"
+    "@polkadot/rpc-core" "4.2.1"
+    "@polkadot/types" "4.2.1"
+    "@polkadot/util" "^6.0.5"
+    "@polkadot/util-crypto" "^6.0.5"
+    "@polkadot/x-rxjs" "^6.0.5"
+    bn.js "^4.11.9"
+
+"@polkadot/api@4.2.1":
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-4.2.1.tgz#8eb0997dc148a34a4aca3a0dcaabad9954565909"
+  integrity sha512-PbXwcLnZr5V5LfKsovMS0TRG+rfJp8lJxluCyOSABDpaz2h1B5R8rdYEZCmXI3qSrT0yu2C6Pp8AjTQHRd7SAA==
+  dependencies:
+    "@babel/runtime" "^7.13.10"
+    "@polkadot/api-derive" "4.2.1"
+    "@polkadot/keyring" "^6.0.5"
+    "@polkadot/metadata" "4.2.1"
+    "@polkadot/rpc-core" "4.2.1"
+    "@polkadot/rpc-provider" "4.2.1"
+    "@polkadot/types" "4.2.1"
+    "@polkadot/types-known" "4.2.1"
+    "@polkadot/util" "^6.0.5"
+    "@polkadot/util-crypto" "^6.0.5"
+    "@polkadot/x-rxjs" "^6.0.5"
+    bn.js "^4.11.9"
+    eventemitter3 "^4.0.7"
+
+"@polkadot/keyring@^6.0.5":
+  version "6.11.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-6.11.1.tgz#2510c349c965c74cc2f108f114f1048856940604"
+  integrity sha512-rW8INl7pO6Dmaffd6Df1yAYCRWa2RmWQ0LGfJeA/M6seVIkI6J3opZqAd4q2Op+h9a7z4TESQGk8yggOEL+Csg==
+  dependencies:
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/util" "6.11.1"
+    "@polkadot/util-crypto" "6.11.1"
+
+"@polkadot/metadata@4.2.1":
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/metadata/-/metadata-4.2.1.tgz#7bff99e44992708469e7b2aa70d0865637d8febe"
+  integrity sha512-oXuKOrKTU0wys5pedKd1OVUDWK8/NoBRCrUYN8fxq3Qq/J9Sz6lF4ZbgX3w22C75l1z2+acsebiZBwlpWgKeqw==
+  dependencies:
+    "@babel/runtime" "^7.13.10"
+    "@polkadot/types" "4.2.1"
+    "@polkadot/types-known" "4.2.1"
+    "@polkadot/util" "^6.0.5"
+    "@polkadot/util-crypto" "^6.0.5"
+    bn.js "^4.11.9"
+
+"@polkadot/networks@6.11.1", "@polkadot/networks@^6.0.5":
+  version "6.11.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-6.11.1.tgz#8fd189593f6ee4f8bf64378d0aaae09e39a37d35"
+  integrity sha512-0C6Ha2kvr42se3Gevx6UhHzv3KnPHML0N73Amjwvdr4y0HLZ1Nfw+vcm5yqpz5gpiehqz97XqFrsPRauYdcksQ==
+  dependencies:
+    "@babel/runtime" "^7.14.6"
+
+"@polkadot/rpc-core@4.2.1":
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-4.2.1.tgz#249f2e8f359450e365b0784d494814c7348e9a3e"
+  integrity sha512-A67Rt7lFpdauj7O7fRGn9yhII0SpCRJ/NkHWKo/whj8RwIAuOdxLnekGC9Qr26FPi0mAqN5DBQ8vYSDUiLFXxA==
+  dependencies:
+    "@babel/runtime" "^7.13.10"
+    "@polkadot/metadata" "4.2.1"
+    "@polkadot/rpc-provider" "4.2.1"
+    "@polkadot/types" "4.2.1"
+    "@polkadot/util" "^6.0.5"
+    "@polkadot/x-rxjs" "^6.0.5"
+
+"@polkadot/rpc-provider@4.2.1":
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-4.2.1.tgz#2dbb217773a57fde2a70fc15628e2682e3ac81f8"
+  integrity sha512-Gwfs6JAD4Sp+Uz1kEtBSt1P6C3Lwn9xZ64CupU1/6w3qj9QzTFOKHKoznnekiH5HXSh53qVz2c2OSXptSrwL0Q==
+  dependencies:
+    "@babel/runtime" "^7.13.10"
+    "@polkadot/types" "4.2.1"
+    "@polkadot/util" "^6.0.5"
+    "@polkadot/util-crypto" "^6.0.5"
+    "@polkadot/x-fetch" "^6.0.5"
+    "@polkadot/x-global" "^6.0.5"
+    "@polkadot/x-ws" "^6.0.5"
+    bn.js "^4.11.9"
+    eventemitter3 "^4.0.7"
+
+"@polkadot/types-known@4.2.1":
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-4.2.1.tgz#0f1ccef363359de0370cd5b3cc3e6dfe51a18f38"
+  integrity sha512-/zbvzcCiv6yLhnikVWrN03uJk/3Vuer+sbK8G/pVtLOUhRYdDLOet7VPmRnjH9CGsEGJDQebu0zqW77npg5V2Q==
+  dependencies:
+    "@babel/runtime" "^7.13.10"
+    "@polkadot/networks" "^6.0.5"
+    "@polkadot/types" "4.2.1"
+    "@polkadot/util" "^6.0.5"
+    bn.js "^4.11.9"
+
+"@polkadot/types@4.2.1":
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-4.2.1.tgz#7be97d3abda4bb3f9031b43602062ed464596696"
+  integrity sha512-xl8QnbXiJmSm6MUZH/U/ov3ZSXMN+KgNjsTCCzfz2xR5B3eK9ClYcstYYkNSyF12K90Gut9bnNSGZvaCfT2hNQ==
+  dependencies:
+    "@babel/runtime" "^7.13.10"
+    "@polkadot/metadata" "4.2.1"
+    "@polkadot/util" "^6.0.5"
+    "@polkadot/util-crypto" "^6.0.5"
+    "@polkadot/x-rxjs" "^6.0.5"
+    "@types/bn.js" "^4.11.6"
+    bn.js "^4.11.9"
+
+"@polkadot/util-crypto@6.11.1", "@polkadot/util-crypto@^6.0.5":
+  version "6.11.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-6.11.1.tgz#7a36acf5c8bf52541609ec0b0b2a69af295d652e"
+  integrity sha512-fWA1Nz17FxWJslweZS4l0Uo30WXb5mYV1KEACVzM+BSZAvG5eoiOAYX6VYZjyw6/7u53XKrWQlD83iPsg3KvZw==
+  dependencies:
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/networks" "6.11.1"
+    "@polkadot/util" "6.11.1"
+    "@polkadot/wasm-crypto" "^4.0.2"
+    "@polkadot/x-randomvalues" "6.11.1"
+    base-x "^3.0.8"
+    base64-js "^1.5.1"
+    blakejs "^1.1.1"
+    bn.js "^4.11.9"
+    create-hash "^1.2.0"
+    elliptic "^6.5.4"
+    hash.js "^1.1.7"
+    js-sha3 "^0.8.0"
+    scryptsy "^2.1.0"
+    tweetnacl "^1.0.3"
+    xxhashjs "^0.2.2"
+
+"@polkadot/util@6.11.1", "@polkadot/util@^6.0.5":
+  version "6.11.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-6.11.1.tgz#8950b038ba3e6ebfc0a7ff47feeb972e81b2626c"
+  integrity sha512-TEdCetr9rsdUfJZqQgX/vxLuV4XU8KMoKBMJdx+JuQ5EWemIdQkEtMBdL8k8udNGbgSNiYFA6rPppATeIxAScg==
+  dependencies:
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/x-textdecoder" "6.11.1"
+    "@polkadot/x-textencoder" "6.11.1"
+    "@types/bn.js" "^4.11.6"
+    bn.js "^4.11.9"
+    camelcase "^5.3.1"
+    ip-regex "^4.3.0"
+
+"@polkadot/wasm-crypto-asmjs@^4.2.1":
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-4.2.1.tgz#6b7eae1c011709f8042dfd30872a5fc5e9e021c0"
+  integrity sha512-ON9EBpTNDCI3QRUmuQJIegYoAcwvxDaNNA7uwKTaEEStu8LjCIbQxbt4WbOBYWI0PoUpl4iIluXdT3XZ3V3jXA==
+  dependencies:
+    "@babel/runtime" "^7.15.3"
+
+"@polkadot/wasm-crypto-wasm@^4.2.1":
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-4.2.1.tgz#2a86f9b405e7195c3f523798c6ce4afffd19737e"
+  integrity sha512-Rs2CKiR4D+2hKzmKBfPNYxcd2E8NfLWia0av4fgicjT9YsWIWOGQUi9AtSOfazPOR9FrjxKJy+chQxAkcfKMnQ==
+  dependencies:
+    "@babel/runtime" "^7.15.3"
+
+"@polkadot/wasm-crypto@^4.0.2":
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-4.2.1.tgz#4d09402f5ac71a90962fb58cbe4b1707772a4fb6"
+  integrity sha512-C/A/QnemOilRTLnM0LfhPY2N/x3ZFd1ihm9sXYyuh98CxtekSVYI9h4IJ5Jrgz5imSUHgvt9oJLqJ5GbWQV/Zg==
+  dependencies:
+    "@babel/runtime" "^7.15.3"
+    "@polkadot/wasm-crypto-asmjs" "^4.2.1"
+    "@polkadot/wasm-crypto-wasm" "^4.2.1"
+
+"@polkadot/x-fetch@^6.0.5":
+  version "6.11.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-6.11.1.tgz#97d44d78ef0285eec6f6dbc4006302308ec8e24c"
+  integrity sha512-qJyLLnm+4SQEZ002UDz2wWnXbnnH84rIS0mLKZ5k82H4lMYY+PQflvzv6sbu463e/lgiEao+6zvWS6DSKv1Yog==
+  dependencies:
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/x-global" "6.11.1"
+    "@types/node-fetch" "^2.5.10"
+    node-fetch "^2.6.1"
+
+"@polkadot/x-global@6.11.1", "@polkadot/x-global@^6.0.5":
+  version "6.11.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-6.11.1.tgz#c292b3825fea60e9b33fff1790323fc57de1ca5d"
+  integrity sha512-lsBK/e4KbjfieyRmnPs7bTiGbP/6EoCZz7rqD/voNS5qsJAaXgB9LR+ilubun9gK/TDpebyxgO+J19OBiQPIRw==
+  dependencies:
+    "@babel/runtime" "^7.14.6"
+
+"@polkadot/x-randomvalues@6.11.1":
+  version "6.11.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-6.11.1.tgz#f006fa250c8e82c92ccb769976a45a8e7f3df28b"
+  integrity sha512-2MfUfGZSOkuPt7GF5OJkPDbl4yORI64SUuKM25EGrJ22o1UyoBnPOClm9eYujLMD6BfDZRM/7bQqqoLW+NuHVw==
+  dependencies:
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/x-global" "6.11.1"
+
+"@polkadot/x-rxjs@^6.0.5":
+  version "6.11.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-rxjs/-/x-rxjs-6.11.1.tgz#5454708b61da70eea05708611d9148fce9372498"
+  integrity sha512-zIciEmij7SUuXXg9g/683Irx6GogxivrQS2pgBir2DI/YZq+um52+Dqg1mqsEZt74N4KMTMnzAZAP6LJOBOMww==
+  dependencies:
+    "@babel/runtime" "^7.14.6"
+    rxjs "^6.6.7"
+
+"@polkadot/x-textdecoder@6.11.1":
+  version "6.11.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-6.11.1.tgz#6cc314645681cc4639085c03b65328671c7f182c"
+  integrity sha512-DI1Ym2lyDSS/UhnTT2e9WutukevFZ0WGpzj4eotuG2BTHN3e21uYtYTt24SlyRNMrWJf5+TkZItmZeqs1nwAfQ==
+  dependencies:
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/x-global" "6.11.1"
+
+"@polkadot/x-textencoder@6.11.1":
+  version "6.11.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-6.11.1.tgz#73e89da5b91954ae380042c19314c90472f59d9e"
+  integrity sha512-8ipjWdEuqFo+R4Nxsc3/WW9CSEiprX4XU91a37ZyRVC4e9R1bmvClrpXmRQLVcAQyhRvG8DKOOtWbz8xM+oXKg==
+  dependencies:
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/x-global" "6.11.1"
+
+"@polkadot/x-ws@^6.0.5":
+  version "6.11.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-6.11.1.tgz#338adc7309e3a8e660fce8eb42f975426da48d10"
+  integrity sha512-GNu4ywrMlVi0QF6QSpKwYWMK6JRK+kadgN/zEhMoH1z5h8LwpqDLv128j5WspWbQti2teCQtridjf7t2Lzoe8Q==
+  dependencies:
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/x-global" "6.11.1"
+    "@types/websocket" "^1.0.3"
+    websocket "^1.0.34"
+
+"@sindresorhus/is@^0.14.0":
+  version "0.14.0"
+  resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
+  integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
+"@szmarczak/http-timer@^1.1.2":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
+  integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+  dependencies:
+    defer-to-connect "^1.0.1"
+
+"@tootallnate/once@1":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
+  integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
+
+"@tsconfig/node10@^1.0.7":
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9"
+  integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==
+
+"@tsconfig/node12@^1.0.7":
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c"
+  integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==
+
+"@tsconfig/node14@^1.0.0":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2"
+  integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==
+
+"@tsconfig/node16@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
+  integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
+
+"@types/bn.js@^4.11.6":
+  version "4.11.6"
+  resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
+  integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
+  dependencies:
+    "@types/node" "*"
+
+"@types/body-parser@*", "@types/body-parser@^1.17.0":
+  version "1.19.1"
+  resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c"
+  integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==
+  dependencies:
+    "@types/connect" "*"
+    "@types/node" "*"
+
+"@types/compression@^1.7.2":
+  version "1.7.2"
+  resolved "https://registry.yarnpkg.com/@types/compression/-/compression-1.7.2.tgz#7cc1cdb01b4730eea284615a68fc70a2cdfd5e71"
+  integrity sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg==
+  dependencies:
+    "@types/express" "*"
+
+"@types/connect@*":
+  version "3.4.35"
+  resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1"
+  integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==
+  dependencies:
+    "@types/node" "*"
+
+"@types/cors@^2.8.12":
+  version "2.8.12"
+  resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080"
+  integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==
+
+"@types/express-serve-static-core@^4.17.18":
+  version "4.17.24"
+  resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07"
+  integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==
+  dependencies:
+    "@types/node" "*"
+    "@types/qs" "*"
+    "@types/range-parser" "*"
+
+"@types/express@*", "@types/express@^4.17.13":
+  version "4.17.13"
+  resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034"
+  integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==
+  dependencies:
+    "@types/body-parser" "*"
+    "@types/express-serve-static-core" "^4.17.18"
+    "@types/qs" "*"
+    "@types/serve-static" "*"
+
+"@types/lodash@^4.14.157":
+  version "4.14.175"
+  resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.175.tgz#b78dfa959192b01fae0ad90e166478769b215f45"
+  integrity sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw==
+
+"@types/mime@^1":
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
+  integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
+
+"@types/node-cron@^2.0.4":
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/@types/node-cron/-/node-cron-2.0.5.tgz#e244709a86d32453c5a702ced35b53db683fbc8e"
+  integrity sha512-rQ4kduTmgW11tbtx0/RsoybYHHPu4Vxw5v5ZS5qUKNerlEAI8r8P1F5UUZ2o2HTvzG759sbFxuRuqWxU8zc+EQ==
+  dependencies:
+    "@types/tz-offset" "*"
+
+"@types/node-fetch@^2.5.10":
+  version "2.5.12"
+  resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66"
+  integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==
+  dependencies:
+    "@types/node" "*"
+    form-data "^3.0.0"
+
+"@types/node@*", "@types/node@^16.4.2":
+  version "16.10.3"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.3.tgz#7a8f2838603ea314d1d22bb3171d899e15c57bd5"
+  integrity sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==
+
+"@types/pg@^8.6.1":
+  version "8.6.1"
+  resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.1.tgz#099450b8dc977e8197a44f5229cedef95c8747f9"
+  integrity sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==
+  dependencies:
+    "@types/node" "*"
+    pg-protocol "*"
+    pg-types "^2.2.0"
+
+"@types/qs@*":
+  version "6.9.7"
+  resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
+  integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
+
+"@types/range-parser@*":
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
+  integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
+
+"@types/serve-static@*":
+  version "1.13.10"
+  resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9"
+  integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==
+  dependencies:
+    "@types/mime" "^1"
+    "@types/node" "*"
+
+"@types/strong-error-handler@^2.3.0":
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/@types/strong-error-handler/-/strong-error-handler-2.3.1.tgz#f0b3f119de56f94893862a64dbd97f0e509b1a07"
+  integrity sha512-ghl+ZRkdX1UDH7P45kU4HvL6WoFJC1K9e4bRfUfSDrRqYzGzlep1G6wxnEL2gwyBJZkbSSCNjJ91zHhZVoMTrw==
+  dependencies:
+    "@types/express" "*"
+
+"@types/tz-offset@*":
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/@types/tz-offset/-/tz-offset-0.0.0.tgz#d58f1cebd794148d245420f8f0660305d320e565"
+  integrity sha512-XLD/llTSB6EBe3thkN+/I0L+yCTB6sjrcVovQdx2Cnl6N6bTzHmwe/J8mWnsXFgxLrj/emzdv8IR4evKYG2qxQ==
+
+"@types/unist@^2.0.0":
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d"
+  integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==
+
+"@types/vfile@^4.0.0":
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/@types/vfile/-/vfile-4.0.0.tgz#c32d13cbda319bc9f4ab3cacc0263b4ba1dd1ea3"
+  integrity sha512-eleP0/Cz8uVWxARDLi3Axq2+fDdN4ibAXoC6Pv8p6s7znXaUL7XvhgeIhjCiNMnvlLNP+tmCLd+RuCryGgmtEg==
+  dependencies:
+    vfile "*"
+
+"@types/websocket@^1.0.3":
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.4.tgz#1dc497280d8049a5450854dd698ee7e6ea9e60b8"
+  integrity sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==
+  dependencies:
+    "@types/node" "*"
+
+abbrev@1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+  integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+accepts@~1.3.5, accepts@~1.3.7:
+  version "1.3.7"
+  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+  integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+  dependencies:
+    mime-types "~2.1.24"
+    negotiator "0.6.2"
+
+acorn-walk@^8.1.1:
+  version "8.2.0"
+  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
+  integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
+
+acorn@^8.4.1:
+  version "8.5.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
+  integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
+
+agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+  integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+  dependencies:
+    debug "4"
+
+ajv@^6.11.0:
+  version "6.12.6"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+  integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+  dependencies:
+    fast-deep-equal "^3.1.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
+amp-message@~0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/amp-message/-/amp-message-0.1.2.tgz#a78f1c98995087ad36192a41298e4db49e3dfc45"
+  integrity sha1-p48cmJlQh602GSpBKY5NtJ49/EU=
+  dependencies:
+    amp "0.3.1"
+
+amp@0.3.1, amp@~0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/amp/-/amp-0.3.1.tgz#6adf8d58a74f361e82c1fa8d389c079e139fc47d"
+  integrity sha1-at+NWKdPNh6CwfqNOJwHnhOfxH0=
+
+ansi-align@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59"
+  integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==
+  dependencies:
+    string-width "^4.1.0"
+
+ansi-colors@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+  integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-regex@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+  integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+  dependencies:
+    color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+  dependencies:
+    color-convert "^2.0.1"
+
+anymatch@~3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+  integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+  dependencies:
+    normalize-path "^3.0.0"
+    picomatch "^2.0.4"
+
+arg@^4.1.0:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+  integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
+argparse@^1.0.7:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+  integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+  dependencies:
+    sprintf-js "~1.0.2"
+
+array-flatten@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+  integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+ast-types@^0.13.2:
+  version "0.13.4"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782"
+  integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==
+  dependencies:
+    tslib "^2.0.1"
+
+async-listener@^0.6.0:
+  version "0.6.10"
+  resolved "https://registry.yarnpkg.com/async-listener/-/async-listener-0.6.10.tgz#a7c97abe570ba602d782273c0de60a51e3e17cbc"
+  integrity sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==
+  dependencies:
+    semver "^5.3.0"
+    shimmer "^1.1.0"
+
+async@^2.6.3, async@~2.6.1:
+  version "2.6.3"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+  integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+  dependencies:
+    lodash "^4.17.14"
+
+async@^3.2.0, async@~3.2.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/async/-/async-3.2.1.tgz#d3274ec66d107a47476a4c49136aacdb00665fc8"
+  integrity sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg==
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+  integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+axios@^0.21.0, axios@^0.21.1:
+  version "0.21.4"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
+  integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
+  dependencies:
+    follow-redirects "^1.14.0"
+
+balanced-match@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-x@^3.0.8:
+  version "3.0.8"
+  resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d"
+  integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==
+  dependencies:
+    safe-buffer "^5.0.1"
+
+base64-js@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+  integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+binary-extensions@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+  integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+blakejs@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702"
+  integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==
+
+blessed@0.1.81:
+  version "0.1.81"
+  resolved "https://registry.yarnpkg.com/blessed/-/blessed-0.1.81.tgz#f962d687ec2c369570ae71af843256e6d0ca1129"
+  integrity sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=
+
+bn.js@^4.11.9:
+  version "4.12.0"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+  integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bodec@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/bodec/-/bodec-0.1.0.tgz#bc851555430f23c9f7650a75ef64c6a94c3418cc"
+  integrity sha1-vIUVVUMPI8n3ZQp172TGqUw0GMw=
+
+body-parser@1.19.0, body-parser@^1.18.3:
+  version "1.19.0"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+  integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+  dependencies:
+    bytes "3.1.0"
+    content-type "~1.0.4"
+    debug "2.6.9"
+    depd "~1.1.2"
+    http-errors "1.7.2"
+    iconv-lite "0.4.24"
+    on-finished "~2.3.0"
+    qs "6.7.0"
+    raw-body "2.4.0"
+    type-is "~1.6.17"
+
+boxen@^5.0.0:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50"
+  integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==
+  dependencies:
+    ansi-align "^3.0.0"
+    camelcase "^6.2.0"
+    chalk "^4.1.0"
+    cli-boxes "^2.2.1"
+    string-width "^4.2.2"
+    type-fest "^0.20.2"
+    widest-line "^3.1.0"
+    wrap-ansi "^7.0.0"
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@~3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+  integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+  dependencies:
+    fill-range "^7.0.1"
+
+brorand@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+  integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+buffer-from@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+  integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer-writer@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04"
+  integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==
+
+bufferutil@^4.0.1:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.4.tgz#ab81373d313a6ead0d734e98c448c722734ae7bb"
+  integrity sha512-VNxjXUCrF3LvbLgwfkTb5LsFvk6pGIn7OBb9x+3o+iJ6mKw0JTUp4chBFc88hi1aspeZGeZG9jAIbpFYPQSLZw==
+  dependencies:
+    node-gyp-build "^4.2.0"
+
+builtin-modules@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+  integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
+
+bytes@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+  integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
+
+bytes@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+  integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+cacheable-request@^6.0.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
+  integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+  dependencies:
+    clone-response "^1.0.2"
+    get-stream "^5.1.0"
+    http-cache-semantics "^4.0.0"
+    keyv "^3.0.0"
+    lowercase-keys "^2.0.0"
+    normalize-url "^4.1.0"
+    responselike "^1.0.2"
+
+camelcase@^5.3.1:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+  integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.2.0:
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
+  integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
+
+chalk@3.0.0, chalk@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+  integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
+chalk@^2.0.0, chalk@^2.3.0:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+chalk@^4.1.0:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+  integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
+charm@~0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/charm/-/charm-0.1.2.tgz#06c21eed1a1b06aeb67553cdc53e23274bac2296"
+  integrity sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=
+
+chokidar@^3.2.2, chokidar@^3.5.1:
+  version "3.5.2"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
+  integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
+  dependencies:
+    anymatch "~3.1.2"
+    braces "~3.0.2"
+    glob-parent "~5.1.2"
+    is-binary-path "~2.1.0"
+    is-glob "~4.0.1"
+    normalize-path "~3.0.0"
+    readdirp "~3.6.0"
+  optionalDependencies:
+    fsevents "~2.3.2"
+
+ci-info@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+  integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cipher-base@^1.0.1:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+cli-boxes@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
+  integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==
+
+cli-tableau@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/cli-tableau/-/cli-tableau-2.0.1.tgz#baa78d83e08a2d7ab79b7dad9406f0254977053f"
+  integrity sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==
+  dependencies:
+    chalk "3.0.0"
+
+clone-response@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+  integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+  dependencies:
+    mimic-response "^1.0.0"
+
+color-convert@^1.9.0:
+  version "1.9.3"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+  integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+  dependencies:
+    color-name "1.1.3"
+
+color-convert@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+  dependencies:
+    color-name "~1.1.4"
+
+color-name@1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+  integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+  integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@2.15.1:
+  version "2.15.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
+  integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
+
+commander@^2.12.1:
+  version "2.20.3"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+  integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+compressible@~2.0.16:
+  version "2.0.18"
+  resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
+  integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
+  dependencies:
+    mime-db ">= 1.43.0 < 2"
+
+compression@^1.7.4:
+  version "1.7.4"
+  resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
+  integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
+  dependencies:
+    accepts "~1.3.5"
+    bytes "3.0.0"
+    compressible "~2.0.16"
+    debug "2.6.9"
+    on-headers "~1.0.2"
+    safe-buffer "5.1.2"
+    vary "~1.1.2"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+configstore@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
+  integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==
+  dependencies:
+    dot-prop "^5.2.0"
+    graceful-fs "^4.1.2"
+    make-dir "^3.0.0"
+    unique-string "^2.0.0"
+    write-file-atomic "^3.0.0"
+    xdg-basedir "^4.0.0"
+
+content-disposition@0.5.3:
+  version "0.5.3"
+  resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+  integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+  dependencies:
+    safe-buffer "5.1.2"
+
+content-type@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+  integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+continuation-local-storage@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz#11f613f74e914fe9b34c92ad2d28fe6ae1db7ffb"
+  integrity sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==
+  dependencies:
+    async-listener "^0.6.0"
+    emitter-listener "^1.1.1"
+
+cookie-signature@1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+  integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
+  integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+
+core-util-is@~1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+  integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+cors@^2.8.5:
+  version "2.8.5"
+  resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+  integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+  dependencies:
+    object-assign "^4"
+    vary "^1"
+
+create-hash@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+  integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    md5.js "^1.3.4"
+    ripemd160 "^2.0.1"
+    sha.js "^2.4.0"
+
+create-require@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+  integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
+cron@1.8.2:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/cron/-/cron-1.8.2.tgz#4ac5e3c55ba8c163d84f3407bde94632da8370ce"
+  integrity sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==
+  dependencies:
+    moment-timezone "^0.5.x"
+
+crypto-random-string@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
+  integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
+
+cuint@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
+  integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=
+
+culvert@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/culvert/-/culvert-0.1.2.tgz#9502f5f0154a2d5a22a023e79f71cc936fa6ef6f"
+  integrity sha1-lQL18BVKLVoioCPnn3HMk2+m728=
+
+d@1, d@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+  integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+  dependencies:
+    es5-ext "^0.10.50"
+    type "^1.0.1"
+
+data-uri-to-buffer@3:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636"
+  integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==
+
+dayjs@~1.8.24, dayjs@~1.8.25:
+  version "1.8.36"
+  resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.36.tgz#be36e248467afabf8f5a86bae0de0cdceecced50"
+  integrity sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==
+
+debug@2.6.9, debug@^2.2.0:
+  version "2.6.9"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+  dependencies:
+    ms "2.0.0"
+
+debug@4, debug@^4.1.1, debug@^4.3.1, debug@~4.3.1:
+  version "4.3.2"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
+  integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
+  dependencies:
+    ms "2.1.2"
+
+debug@^3.2.6:
+  version "3.2.7"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+  integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+  dependencies:
+    ms "^2.1.1"
+
+decompress-response@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+  integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+  dependencies:
+    mimic-response "^1.0.0"
+
+deep-extend@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+  integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+deep-is@~0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+  integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+defer-to-connect@^1.0.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
+  integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+
+degenerator@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-3.0.1.tgz#7ef78ec0c8577a544477308ddf1d2d6e88d51f5b"
+  integrity sha512-LFsIFEeLPlKvAKXu7j3ssIG6RT0TbI7/GhsqrI0DnHASEQjXQ0LUSYcjJteGgRGmZbl1TnMSxpNQIAiJ7Du5TQ==
+  dependencies:
+    ast-types "^0.13.2"
+    escodegen "^1.8.1"
+    esprima "^4.0.0"
+    vm2 "^3.9.3"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+  integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+depd@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+  integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+destroy@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+  integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+diff@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+  integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+dot-prop@^5.2.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
+  integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
+  dependencies:
+    is-obj "^2.0.0"
+
+dotenv@^10.0.0:
+  version "10.0.0"
+  resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81"
+  integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==
+
+duplexer3@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+  integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
+ee-first@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+  integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+elliptic@^6.5.4:
+  version "6.5.4"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+  integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+  dependencies:
+    bn.js "^4.11.9"
+    brorand "^1.1.0"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.1"
+    inherits "^2.0.4"
+    minimalistic-assert "^1.0.1"
+    minimalistic-crypto-utils "^1.0.1"
+
+emitter-listener@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/emitter-listener/-/emitter-listener-1.1.2.tgz#56b140e8f6992375b3d7cb2cab1cc7432d9632e8"
+  integrity sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==
+  dependencies:
+    shimmer "^1.2.0"
+
+emoji-regex@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+encodeurl@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+  integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+end-of-stream@^1.1.0:
+  version "1.4.4"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+  integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+  dependencies:
+    once "^1.4.0"
+
+enquirer@2.3.6:
+  version "2.3.6"
+  resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+  integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+  dependencies:
+    ansi-colors "^4.1.1"
+
+es5-ext@^0.10.35, es5-ext@^0.10.50:
+  version "0.10.53"
+  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1"
+  integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==
+  dependencies:
+    es6-iterator "~2.0.3"
+    es6-symbol "~3.1.3"
+    next-tick "~1.0.0"
+
+es6-iterator@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@~3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+  integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+  dependencies:
+    d "^1.0.1"
+    ext "^1.1.2"
+
+escape-goat@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
+  integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==
+
+escape-html@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+  integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+  integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+escodegen@^1.8.1:
+  version "1.14.3"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
+  integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==
+  dependencies:
+    esprima "^4.0.1"
+    estraverse "^4.2.0"
+    esutils "^2.0.2"
+    optionator "^0.8.1"
+  optionalDependencies:
+    source-map "~0.6.1"
+
+esprima@^4.0.0, esprima@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+estraverse@^4.2.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+esutils@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+  integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+  integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+eventemitter2@5.0.1, eventemitter2@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452"
+  integrity sha1-YZegldX7a1folC9v1+qtY6CclFI=
+
+eventemitter2@^6.3.1:
+  version "6.4.5"
+  resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.5.tgz#97380f758ae24ac15df8353e0cc27f8b95644655"
+  integrity sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==
+
+eventemitter2@~0.4.14:
+  version "0.4.14"
+  resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab"
+  integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=
+
+eventemitter3@^4.0.7:
+  version "4.0.7"
+  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
+  integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
+express-static-gzip@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/express-static-gzip/-/express-static-gzip-2.1.1.tgz#ee3a0eca3f10348bcd214095fbb46f8d0f8cb471"
+  integrity sha512-J+xSzdr5lj1cIuZey0ac6nUv22VE7GrdwTERqE8DsrqSXLm1zjeYWTVbK37t8exGwobxBXeWU2bM7eSMjBR4YA==
+  dependencies:
+    serve-static "^1.14.1"
+
+express@^4.17.1:
+  version "4.17.1"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+  integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+  dependencies:
+    accepts "~1.3.7"
+    array-flatten "1.1.1"
+    body-parser "1.19.0"
+    content-disposition "0.5.3"
+    content-type "~1.0.4"
+    cookie "0.4.0"
+    cookie-signature "1.0.6"
+    debug "2.6.9"
+    depd "~1.1.2"
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    etag "~1.8.1"
+    finalhandler "~1.1.2"
+    fresh "0.5.2"
+    merge-descriptors "1.0.1"
+    methods "~1.1.2"
+    on-finished "~2.3.0"
+    parseurl "~1.3.3"
+    path-to-regexp "0.1.7"
+    proxy-addr "~2.0.5"
+    qs "6.7.0"
+    range-parser "~1.2.1"
+    safe-buffer "5.1.2"
+    send "0.17.1"
+    serve-static "1.14.1"
+    setprototypeof "1.1.1"
+    statuses "~1.5.0"
+    type-is "~1.6.18"
+    utils-merge "1.0.1"
+    vary "~1.1.2"
+
+ext@^1.1.2:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52"
+  integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==
+  dependencies:
+    type "^2.5.0"
+
+fast-deep-equal@^3.1.1:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+  integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-patch@^3.0.0-1:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.1.0.tgz#ec8cd9b9c4c564250ec8b9140ef7a55f70acaee6"
+  integrity sha512-IhpytlsVTRndz0hU5t0/MGzS/etxLlfrpG5V5M9mVbuj9TrJLWaMfsox9REM5rkuGX0T+5qjpe8XA1o0gZ42nA==
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+  integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@~2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+  integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fclone@1.0.11, fclone@~1.0.11:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fclone/-/fclone-1.0.11.tgz#10e85da38bfea7fc599341c296ee1d77266ee640"
+  integrity sha1-EOhdo4v+p/xZk0HClu4ddyZu5kA=
+
+file-uri-to-path@2:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba"
+  integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==
+
+fill-range@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+  integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+  dependencies:
+    to-regex-range "^5.0.1"
+
+finalhandler@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+  integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+  dependencies:
+    debug "2.6.9"
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    on-finished "~2.3.0"
+    parseurl "~1.3.3"
+    statuses "~1.5.0"
+    unpipe "~1.0.0"
+
+follow-redirects@^1.14.0:
+  version "1.14.4"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379"
+  integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==
+
+form-data@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+  integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.8"
+    mime-types "^2.1.12"
+
+forwarded@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+  integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fresh@0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+  integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs-extra@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+  integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+  dependencies:
+    graceful-fs "^4.2.0"
+    jsonfile "^4.0.0"
+    universalify "^0.1.0"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fs@^0.0.1-security:
+  version "0.0.1-security"
+  resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4"
+  integrity sha1-invTcYa23d84E/I4WLV+yq9eQdQ=
+
+fsevents@~2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+  integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+ftp@^0.3.10:
+  version "0.3.10"
+  resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d"
+  integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=
+  dependencies:
+    readable-stream "1.1.x"
+    xregexp "2.0.0"
+
+function-bind@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+  integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+get-stream@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+  integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+  dependencies:
+    pump "^3.0.0"
+
+get-stream@^5.1.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+  integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+  dependencies:
+    pump "^3.0.0"
+
+get-uri@3:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c"
+  integrity sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==
+  dependencies:
+    "@tootallnate/once" "1"
+    data-uri-to-buffer "3"
+    debug "4"
+    file-uri-to-path "2"
+    fs-extra "^8.1.0"
+    ftp "^0.3.10"
+
+git-node-fs@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/git-node-fs/-/git-node-fs-1.0.0.tgz#49b215e242ebe43aa4c7561bbba499521752080f"
+  integrity sha1-SbIV4kLr5Dqkx1Ybu6SZUhdSCA8=
+
+git-sha1@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/git-sha1/-/git-sha1-0.1.2.tgz#599ac192b71875825e13a445f3a6e05118c2f745"
+  integrity sha1-WZrBkrcYdYJeE6RF86bgURjC90U=
+
+glob-parent@~5.1.2:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+  integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+  dependencies:
+    is-glob "^4.0.1"
+
+glob@^7.0.5, glob@^7.1.1:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+  integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+global-dirs@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686"
+  integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==
+  dependencies:
+    ini "2.0.0"
+
+got@^9.6.0:
+  version "9.6.0"
+  resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
+  integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+  dependencies:
+    "@sindresorhus/is" "^0.14.0"
+    "@szmarczak/http-timer" "^1.1.2"
+    cacheable-request "^6.0.0"
+    decompress-response "^3.3.0"
+    duplexer3 "^0.1.4"
+    get-stream "^4.1.0"
+    lowercase-keys "^1.0.1"
+    mimic-response "^1.0.1"
+    p-cancelable "^1.0.0"
+    to-readable-stream "^1.0.0"
+    url-parse-lax "^3.0.0"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+  version "4.2.8"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
+  integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+  integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-yarn@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
+  integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
+
+has@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+  integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+  dependencies:
+    function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+  integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+  dependencies:
+    inherits "^2.0.4"
+    readable-stream "^3.6.0"
+    safe-buffer "^5.2.0"
+
+hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+  integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.1"
+
+hmac-drbg@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+http-cache-semantics@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
+  integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+
+http-errors@1.7.2:
+  version "1.7.2"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+  integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+  dependencies:
+    depd "~1.1.2"
+    inherits "2.0.3"
+    setprototypeof "1.1.1"
+    statuses ">= 1.5.0 < 2"
+    toidentifier "1.0.0"
+
+http-errors@1.7.3, http-errors@~1.7.2:
+  version "1.7.3"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+  integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+  dependencies:
+    depd "~1.1.2"
+    inherits "2.0.4"
+    setprototypeof "1.1.1"
+    statuses ">= 1.5.0 < 2"
+    toidentifier "1.0.0"
+
+http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
+  integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
+  dependencies:
+    "@tootallnate/once" "1"
+    agent-base "6"
+    debug "4"
+
+https-proxy-agent@5, https-proxy-agent@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
+  integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+  dependencies:
+    agent-base "6"
+    debug "4"
+
+iconv-lite@0.4.24, iconv-lite@^0.4.4:
+  version "0.4.24"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
+ignore-by-default@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
+  integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
+
+import-lazy@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
+  integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+  integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+  integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+ini@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
+  integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
+
+ini@^1.3.5, ini@~1.3.0:
+  version "1.3.8"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+  integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+ip-regex@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5"
+  integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==
+
+ip@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+  integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
+
+ipaddr.js@1.9.1:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+  integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-binary-path@~2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+  integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+  dependencies:
+    binary-extensions "^2.0.0"
+
+is-buffer@^2.0.0:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+  integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-ci@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+  integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+  dependencies:
+    ci-info "^2.0.0"
+
+is-core-module@^2.2.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3"
+  integrity sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==
+  dependencies:
+    has "^1.0.3"
+
+is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-fullwidth-code-point@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+  integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-installed-globally@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520"
+  integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==
+  dependencies:
+    global-dirs "^3.0.0"
+    is-path-inside "^3.0.2"
+
+is-npm@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8"
+  integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==
+
+is-number@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-obj@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+  integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+
+is-path-inside@^3.0.2:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+  integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
+is-typedarray@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+  integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-yarn-global@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
+  integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
+
+isarray@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+  integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+js-git@^0.7.8:
+  version "0.7.8"
+  resolved "https://registry.yarnpkg.com/js-git/-/js-git-0.7.8.tgz#52fa655ab61877d6f1079efc6534b554f31e5444"
+  integrity sha1-UvplWrYYd9bxB578ZTS1VPMeVEQ=
+  dependencies:
+    bodec "^0.1.0"
+    culvert "^0.1.2"
+    git-sha1 "^0.1.2"
+    pako "^0.2.5"
+
+js-sha3@^0.8.0:
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
+  integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
+js-tokens@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+  version "3.14.1"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+  integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+json-buffer@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+  integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+json-schema-traverse@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+  integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stringify-safe@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+  integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+jsonfile@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+  integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+keyv@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
+  integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+  dependencies:
+    json-buffer "3.0.0"
+
+latest-version@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
+  integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==
+  dependencies:
+    package-json "^6.3.0"
+
+lazy@~1.0.11:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/lazy/-/lazy-1.0.11.tgz#daa068206282542c088288e975c297c1ae77b690"
+  integrity sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=
+
+levn@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+  integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+  dependencies:
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+
+lodash@^4.17.14, lodash@^4.17.15:
+  version "4.17.21"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-driver@^1.2.7:
+  version "1.2.7"
+  resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8"
+  integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==
+
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+  integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lowercase-keys@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+  integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lru-cache@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+  integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+  dependencies:
+    yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+  dependencies:
+    yallist "^4.0.0"
+
+make-dir@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+  integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+  dependencies:
+    semver "^6.0.0"
+
+make-error@^1.1.1:
+  version "1.3.6"
+  resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+  integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+md5.js@^1.3.4:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+  integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+    safe-buffer "^5.1.2"
+
+media-typer@0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+  integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+merge-descriptors@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+  integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+methods@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+  integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+mime-db@1.50.0, "mime-db@>= 1.43.0 < 2":
+  version "1.50.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f"
+  integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==
+
+mime-types@^2.1.12, mime-types@~2.1.24:
+  version "2.1.33"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb"
+  integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==
+  dependencies:
+    mime-db "1.50.0"
+
+mime@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+  integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-response@^1.0.0, mimic-response@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+  integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+  integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+  integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+  integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+mkdirp@1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mkdirp@^0.5.3:
+  version "0.5.5"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+  integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+  dependencies:
+    minimist "^1.2.5"
+
+module-details-from-path@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b"
+  integrity sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=
+
+moment-timezone@^0.5.31, moment-timezone@^0.5.x:
+  version "0.5.33"
+  resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.33.tgz#b252fd6bb57f341c9b59a5ab61a8e51a73bbd22c"
+  integrity sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==
+  dependencies:
+    moment ">= 2.9.0"
+
+"moment@>= 2.9.0", moment@^2.24.0:
+  version "2.29.1"
+  resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
+  integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+  integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+  integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+ms@2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+  integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+  integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+mute-stream@~0.0.4:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
+  integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+
+needle@2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c"
+  integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==
+  dependencies:
+    debug "^3.2.6"
+    iconv-lite "^0.4.4"
+    sax "^1.2.4"
+
+negotiator@0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+  integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
+netmask@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7"
+  integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==
+
+next-tick@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+  integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
+
+node-cron@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/node-cron/-/node-cron-3.0.0.tgz#b33252803e430f9cd8590cf85738efa1497a9522"
+  integrity sha512-DDwIvvuCwrNiaU7HEivFDULcaQualDv7KoNlB/UU1wPW0n1tDEmBJKhEIE6DlF2FuoOHcNbLJ8ITL2Iv/3AWmA==
+  dependencies:
+    moment-timezone "^0.5.31"
+
+node-fetch@^2.6.1:
+  version "2.6.5"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd"
+  integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==
+  dependencies:
+    whatwg-url "^5.0.0"
+
+node-gyp-build@^4.2.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3"
+  integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==
+
+nodemon@^2.0.12:
+  version "2.0.13"
+  resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.13.tgz#67d40d3a4d5bd840aa785c56587269cfcf5d24aa"
+  integrity sha512-UMXMpsZsv1UXUttCn6gv8eQPhn6DR4BW+txnL3IN5IHqrCwcrT/yWHfL35UsClGXknTH79r5xbu+6J1zNHuSyA==
+  dependencies:
+    chokidar "^3.2.2"
+    debug "^3.2.6"
+    ignore-by-default "^1.0.1"
+    minimatch "^3.0.4"
+    pstree.remy "^1.1.7"
+    semver "^5.7.1"
+    supports-color "^5.5.0"
+    touch "^3.1.0"
+    undefsafe "^2.0.3"
+    update-notifier "^5.1.0"
+
+nopt@~1.0.10:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
+  integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
+  dependencies:
+    abbrev "1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+  integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-url@^4.1.0:
+  version "4.5.1"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
+  integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
+
+nssocket@0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/nssocket/-/nssocket-0.6.0.tgz#59f96f6ff321566f33c70f7dbeeecdfdc07154fa"
+  integrity sha1-Wflvb/MhVm8zxw99vu7N/cBxVPo=
+  dependencies:
+    eventemitter2 "~0.4.14"
+    lazy "~1.0.11"
+
+object-assign@^4:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+on-finished@~2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+  integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+  dependencies:
+    ee-first "1.1.1"
+
+on-headers@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
+  integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+  dependencies:
+    wrappy "1"
+
+optionator@^0.8.1:
+  version "0.8.3"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+  integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+  dependencies:
+    deep-is "~0.1.3"
+    fast-levenshtein "~2.0.6"
+    levn "~0.3.0"
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+    word-wrap "~1.2.3"
+
+p-cancelable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
+  integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
+pac-proxy-agent@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz#b718f76475a6a5415c2efbe256c1c971c84f635e"
+  integrity sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==
+  dependencies:
+    "@tootallnate/once" "1"
+    agent-base "6"
+    debug "4"
+    get-uri "3"
+    http-proxy-agent "^4.0.1"
+    https-proxy-agent "5"
+    pac-resolver "^5.0.0"
+    raw-body "^2.2.0"
+    socks-proxy-agent "5"
+
+pac-resolver@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-5.0.0.tgz#1d717a127b3d7a9407a16d6e1b012b13b9ba8dc0"
+  integrity sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==
+  dependencies:
+    degenerator "^3.0.1"
+    ip "^1.1.5"
+    netmask "^2.0.1"
+
+package-json@^6.3.0:
+  version "6.5.0"
+  resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
+  integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==
+  dependencies:
+    got "^9.6.0"
+    registry-auth-token "^4.0.0"
+    registry-url "^5.0.0"
+    semver "^6.2.0"
+
+packet-reader@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74"
+  integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==
+
+pako@^0.2.5:
+  version "0.2.9"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+  integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=
+
+parseurl@~1.3.3:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+  integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+  integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-parse@^1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+  integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+  integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+pg-connection-string@^2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34"
+  integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==
+
+pg-hstore@^2.3.4:
+  version "2.3.4"
+  resolved "https://registry.yarnpkg.com/pg-hstore/-/pg-hstore-2.3.4.tgz#4425e3e2a3e15d2a334c35581186c27cf2e9b8dd"
+  integrity sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA==
+  dependencies:
+    underscore "^1.13.1"
+
+pg-int8@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
+  integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==
+
+pg-pool@^3.4.1:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.4.1.tgz#0e71ce2c67b442a5e862a9c182172c37eda71e9c"
+  integrity sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ==
+
+pg-protocol@*, pg-protocol@^1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.5.0.tgz#b5dd452257314565e2d54ab3c132adc46565a6a0"
+  integrity sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==
+
+pg-types@^2.1.0, pg-types@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3"
+  integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==
+  dependencies:
+    pg-int8 "1.0.1"
+    postgres-array "~2.0.0"
+    postgres-bytea "~1.0.0"
+    postgres-date "~1.0.4"
+    postgres-interval "^1.1.0"
+
+pg@^8.7.1:
+  version "8.7.1"
+  resolved "https://registry.yarnpkg.com/pg/-/pg-8.7.1.tgz#9ea9d1ec225980c36f94e181d009ab9f4ce4c471"
+  integrity sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA==
+  dependencies:
+    buffer-writer "2.0.0"
+    packet-reader "1.0.0"
+    pg-connection-string "^2.5.0"
+    pg-pool "^3.4.1"
+    pg-protocol "^1.5.0"
+    pg-types "^2.1.0"
+    pgpass "1.x"
+
+pgpass@1.x:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.4.tgz#85eb93a83800b20f8057a2b029bf05abaf94ea9c"
+  integrity sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==
+  dependencies:
+    split2 "^3.1.1"
+
+picomatch@^2.0.4, picomatch@^2.2.1:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+  integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
+
+pidusage@2.0.21, pidusage@^2.0.21:
+  version "2.0.21"
+  resolved "https://registry.yarnpkg.com/pidusage/-/pidusage-2.0.21.tgz#7068967b3d952baea73e57668c98b9eaa876894e"
+  integrity sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==
+  dependencies:
+    safe-buffer "^5.2.1"
+
+pm2-axon-rpc@~0.7.0, pm2-axon-rpc@~0.7.1:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz#2daec5383a63135b3f18babb70266dacdcbc429a"
+  integrity sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==
+  dependencies:
+    debug "^4.3.1"
+
+pm2-axon@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/pm2-axon/-/pm2-axon-4.0.1.tgz#a7b4bb586e9aeb35b1042b488cde15b60cabafd2"
+  integrity sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==
+  dependencies:
+    amp "~0.3.1"
+    amp-message "~0.1.1"
+    debug "^4.3.1"
+    escape-string-regexp "^4.0.0"
+
+pm2-deploy@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pm2-deploy/-/pm2-deploy-1.0.2.tgz#98d8385553a3a4dca11c7b3116deb519bc5961a7"
+  integrity sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==
+  dependencies:
+    run-series "^1.1.8"
+    tv4 "^1.3.0"
+
+pm2-multimeter@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz#1a1e55153d41a05534cea23cfe860abaa0eb4ace"
+  integrity sha1-Gh5VFT1BoFU0zqI8/oYKuqDrSs4=
+  dependencies:
+    charm "~0.1.1"
+
+pm2-sysmonit@^1.2.8:
+  version "1.2.8"
+  resolved "https://registry.yarnpkg.com/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz#eddea34a53fd8c8d7c3efb73b97a3c548686e24d"
+  integrity sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==
+  dependencies:
+    async "^3.2.0"
+    debug "^4.3.1"
+    pidusage "^2.0.21"
+    systeminformation "^5.7"
+    tx2 "~1.0.4"
+
+pm2@^5.1.1:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/pm2/-/pm2-5.1.2.tgz#bffe4e9a84ee013362717eaad1b39b4d73f0fcd0"
+  integrity sha512-2nJQeCWjkN0WnTkWctaoZpqrJTiUN/Icw76IMVHHzPhr/p7yQYlEQgHzlL5IFWxO2N1HdBNXNdZft2p4HUmUcA==
+  dependencies:
+    "@pm2/agent" "~2.0.0"
+    "@pm2/io" "~5.0.0"
+    "@pm2/js-api" "~0.6.7"
+    "@pm2/pm2-version-check" latest
+    async "~3.2.0"
+    blessed "0.1.81"
+    chalk "3.0.0"
+    chokidar "^3.5.1"
+    cli-tableau "^2.0.0"
+    commander "2.15.1"
+    cron "1.8.2"
+    dayjs "~1.8.25"
+    debug "^4.3.1"
+    enquirer "2.3.6"
+    eventemitter2 "5.0.1"
+    fclone "1.0.11"
+    mkdirp "1.0.4"
+    needle "2.4.0"
+    pidusage "2.0.21"
+    pm2-axon "~4.0.1"
+    pm2-axon-rpc "~0.7.1"
+    pm2-deploy "~1.0.2"
+    pm2-multimeter "^0.1.2"
+    promptly "^2"
+    semver "^7.2"
+    source-map-support "0.5.19"
+    sprintf-js "1.1.2"
+    vizion "~2.2.1"
+    yamljs "0.3.0"
+  optionalDependencies:
+    pm2-sysmonit "^1.2.8"
+
+postgres-array@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e"
+  integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==
+
+postgres-bytea@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35"
+  integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=
+
+postgres-date@~1.0.4:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8"
+  integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==
+
+postgres-interval@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695"
+  integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==
+  dependencies:
+    xtend "^4.0.0"
+
+prelude-ls@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+  integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+
+prepend-http@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+  integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
+prettier@^2.3.2:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c"
+  integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==
+
+promptly@^2:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/promptly/-/promptly-2.2.0.tgz#2a13fa063688a2a5983b161fff0108a07d26fc74"
+  integrity sha1-KhP6BjaIoqWYOxYf/wEIoH0m/HQ=
+  dependencies:
+    read "^1.0.4"
+
+proxy-addr@~2.0.5:
+  version "2.0.7"
+  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+  integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+  dependencies:
+    forwarded "0.2.0"
+    ipaddr.js "1.9.1"
+
+proxy-agent@~5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-5.0.0.tgz#d31405c10d6e8431fde96cba7a0c027ce01d633b"
+  integrity sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==
+  dependencies:
+    agent-base "^6.0.0"
+    debug "4"
+    http-proxy-agent "^4.0.0"
+    https-proxy-agent "^5.0.0"
+    lru-cache "^5.1.1"
+    pac-proxy-agent "^5.0.0"
+    proxy-from-env "^1.0.0"
+    socks-proxy-agent "^5.0.0"
+
+proxy-from-env@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+  integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+pstree.remy@^1.1.7:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
+  integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
+
+pump@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+  integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+punycode@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+  integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+pupa@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62"
+  integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==
+  dependencies:
+    escape-goat "^2.0.0"
+
+qs@6.7.0:
+  version "6.7.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+  integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
+range-parser@~1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+  integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+  integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+  dependencies:
+    bytes "3.1.0"
+    http-errors "1.7.2"
+    iconv-lite "0.4.24"
+    unpipe "1.0.0"
+
+raw-body@^2.2.0:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
+  integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
+  dependencies:
+    bytes "3.1.0"
+    http-errors "1.7.3"
+    iconv-lite "0.4.24"
+    unpipe "1.0.0"
+
+rc@^1.2.8:
+  version "1.2.8"
+  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+  integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+  dependencies:
+    deep-extend "^0.6.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+read@^1.0.4:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
+  integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
+  dependencies:
+    mute-stream "~0.0.4"
+
+readable-stream@1.1.x:
+  version "1.1.14"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@^3.0.0, readable-stream@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+  integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+  dependencies:
+    inherits "^2.0.3"
+    string_decoder "^1.1.1"
+    util-deprecate "^1.0.1"
+
+readdirp@~3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+  integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+  dependencies:
+    picomatch "^2.2.1"
+
+reflect-metadata@^0.1.13:
+  version "0.1.13"
+  resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
+  integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
+
+regenerator-runtime@^0.13.4:
+  version "0.13.9"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
+  integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
+
+registry-auth-token@^4.0.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250"
+  integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==
+  dependencies:
+    rc "^1.2.8"
+
+registry-url@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
+  integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==
+  dependencies:
+    rc "^1.2.8"
+
+require-in-the-middle@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz#b768f800377b47526d026bbf5a7f727f16eb412f"
+  integrity sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==
+  dependencies:
+    debug "^4.1.1"
+    module-details-from-path "^1.0.3"
+    resolve "^1.12.0"
+
+resolve@^1.12.0, resolve@^1.3.2:
+  version "1.20.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+  integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+  dependencies:
+    is-core-module "^2.2.0"
+    path-parse "^1.0.6"
+
+responselike@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+  integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+  dependencies:
+    lowercase-keys "^1.0.0"
+
+ripemd160@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+  integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+run-series@^1.1.8:
+  version "1.1.9"
+  resolved "https://registry.yarnpkg.com/run-series/-/run-series-1.1.9.tgz#15ba9cb90e6a6c054e67c98e1dc063df0ecc113a"
+  integrity sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==
+
+rxjs@^6.6.7:
+  version "6.6.7"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
+  integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
+  dependencies:
+    tslib "^1.9.0"
+
+safe-buffer@5.1.2:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+"safer-buffer@>= 2.1.2 < 3":
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+  integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+scryptsy@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790"
+  integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==
+
+semver-diff@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
+  integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==
+  dependencies:
+    semver "^6.3.0"
+
+semver@6.3.0, semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
+  version "6.3.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^5.3.0, semver@^5.5.0, semver@^5.7.1:
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^7.2, semver@^7.3.4:
+  version "7.3.5"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
+  integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
+  dependencies:
+    lru-cache "^6.0.0"
+
+semver@~7.2.0:
+  version "7.2.3"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.2.3.tgz#3641217233c6382173c76bf2c7ecd1e1c16b0d8a"
+  integrity sha512-utbW9Z7ZxVvwiIWkdOMLOR9G/NFXh2aRucghkVrEMJWuC++r3lCkBC3LwqBinyHzGMAJxY5tn6VakZGHObq5ig==
+
+send@0.17.1:
+  version "0.17.1"
+  resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+  integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+  dependencies:
+    debug "2.6.9"
+    depd "~1.1.2"
+    destroy "~1.0.4"
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    etag "~1.8.1"
+    fresh "0.5.2"
+    http-errors "~1.7.2"
+    mime "1.6.0"
+    ms "2.1.1"
+    on-finished "~2.3.0"
+    range-parser "~1.2.1"
+    statuses "~1.5.0"
+
+serve-static@1.14.1, serve-static@^1.14.1:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+  integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+  dependencies:
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    parseurl "~1.3.3"
+    send "0.17.1"
+
+setprototypeof@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+  integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+sha.js@^2.4.0:
+  version "2.4.11"
+  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+  integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+shimmer@^1.1.0, shimmer@^1.2.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337"
+  integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==
+
+signal-exit@^3.0.2, signal-exit@^3.0.3:
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f"
+  integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==
+
+smart-buffer@^4.1.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
+  integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
+
+socks-proxy-agent@5, socks-proxy-agent@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e"
+  integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==
+  dependencies:
+    agent-base "^6.0.2"
+    debug "4"
+    socks "^2.3.3"
+
+socks@^2.3.3:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e"
+  integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==
+  dependencies:
+    ip "^1.1.5"
+    smart-buffer "^4.1.0"
+
+source-map-support@0.5.19:
+  version "0.5.19"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+  integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
+source-map@^0.6.0, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+split2@^3.1.1:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f"
+  integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==
+  dependencies:
+    readable-stream "^3.0.0"
+
+sprintf-js@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
+  integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+  integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+  integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2:
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.1"
+
+string_decoder@^1.1.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+  integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+  dependencies:
+    safe-buffer "~5.2.0"
+
+string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+  integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+  dependencies:
+    ansi-regex "^5.0.1"
+
+strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+  integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+supports-color@^5.3.0, supports-color@^5.5.0:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+  dependencies:
+    has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+  integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+  dependencies:
+    has-flag "^4.0.0"
+
+systeminformation@^5.7:
+  version "5.9.7"
+  resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.9.7.tgz#8a5041d3aa1518e962b17740e20a3c75ff390e6d"
+  integrity sha512-Vcmc8HaWPMFM4DoasuKN2lpvIwS2AqaoPuEGZc4HCT6tlRJH+IQ5GhA2BrUgjpBDJjFMj2Bti6qLOzP3T1arCw==
+
+to-readable-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
+  integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
+to-regex-range@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+  dependencies:
+    is-number "^7.0.0"
+
+toidentifier@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+  integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+touch@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
+  integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
+  dependencies:
+    nopt "~1.0.10"
+
+tr46@~0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+  integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+
+ts-node@^10.2.1:
+  version "10.2.1"
+  resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.2.1.tgz#4cc93bea0a7aba2179497e65bb08ddfc198b3ab5"
+  integrity sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==
+  dependencies:
+    "@cspotcode/source-map-support" "0.6.1"
+    "@tsconfig/node10" "^1.0.7"
+    "@tsconfig/node12" "^1.0.7"
+    "@tsconfig/node14" "^1.0.0"
+    "@tsconfig/node16" "^1.0.2"
+    acorn "^8.4.1"
+    acorn-walk "^8.1.1"
+    arg "^4.1.0"
+    create-require "^1.1.0"
+    diff "^4.0.1"
+    make-error "^1.1.1"
+    yn "3.1.1"
+
+tslib@1.9.3:
+  version "1.9.3"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+  integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
+
+tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+  integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.0.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
+  integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
+
+tslint@^6.1.3:
+  version "6.1.3"
+  resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904"
+  integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    builtin-modules "^1.1.1"
+    chalk "^2.3.0"
+    commander "^2.12.1"
+    diff "^4.0.1"
+    glob "^7.1.1"
+    js-yaml "^3.13.1"
+    minimatch "^3.0.4"
+    mkdirp "^0.5.3"
+    resolve "^1.3.2"
+    semver "^5.3.0"
+    tslib "^1.13.0"
+    tsutils "^2.29.0"
+
+tsutils@^2.29.0:
+  version "2.29.0"
+  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
+  integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
+  dependencies:
+    tslib "^1.8.1"
+
+tv4@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/tv4/-/tv4-1.3.0.tgz#d020c846fadd50c855abb25ebaecc68fc10f7963"
+  integrity sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=
+
+tweetnacl@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
+  integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
+
+tx2@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/tx2/-/tx2-1.0.4.tgz#cb9432df22e0b8c54daf711b51b708f094449ddf"
+  integrity sha512-rU+y30nUY3PyIi+znvv74HzxlpULKwMPAyRK+YiCjvGkk3rY3fic3D6Z+avLpun3V5A6HFwPQ9JrBTMNEV/dxg==
+  dependencies:
+    json-stringify-safe "^5.0.1"
+
+type-check@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+  integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+  dependencies:
+    prelude-ls "~1.1.2"
+
+type-fest@^0.20.2:
+  version "0.20.2"
+  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+  integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+type-is@~1.6.17, type-is@~1.6.18:
+  version "1.6.18"
+  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+  integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+  dependencies:
+    media-typer "0.3.0"
+    mime-types "~2.1.24"
+
+type@^1.0.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+  integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d"
+  integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==
+
+typedarray-to-buffer@^3.1.5:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+  integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+  dependencies:
+    is-typedarray "^1.0.0"
+
+typescript@^4.4.2:
+  version "4.4.3"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324"
+  integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==
+
+undefsafe@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae"
+  integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==
+  dependencies:
+    debug "^2.2.0"
+
+underscore@^1.13.1:
+  version "1.13.1"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1"
+  integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==
+
+unique-string@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
+  integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
+  dependencies:
+    crypto-random-string "^2.0.0"
+
+unist-util-stringify-position@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz#d517d2883d74d0daa0b565adc3d10a02b4a8cde9"
+  integrity sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==
+  dependencies:
+    "@types/unist" "^2.0.0"
+
+universalify@^0.1.0:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+  integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+  integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+update-notifier@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9"
+  integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==
+  dependencies:
+    boxen "^5.0.0"
+    chalk "^4.1.0"
+    configstore "^5.0.1"
+    has-yarn "^2.1.0"
+    import-lazy "^2.1.0"
+    is-ci "^2.0.0"
+    is-installed-globally "^0.4.0"
+    is-npm "^5.0.0"
+    is-yarn-global "^0.3.0"
+    latest-version "^5.1.0"
+    pupa "^2.1.1"
+    semver "^7.3.4"
+    semver-diff "^3.1.1"
+    xdg-basedir "^4.0.0"
+
+uri-js@^4.2.2:
+  version "4.4.1"
+  resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+  integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+  dependencies:
+    punycode "^2.1.0"
+
+url-parse-lax@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+  integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+  dependencies:
+    prepend-http "^2.0.0"
+
+utf-8-validate@^5.0.2:
+  version "5.0.6"
+  resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.6.tgz#e1b3e0a5cc8648a3b44c1799fbb170d1aaaffe80"
+  integrity sha512-hoY0gOf9EkCw+nimK21FVKHUIG1BMqSiRwxB/q3A9yKZOrOI99PP77BxmarDqWz6rG3vVYiBWfhG8z2Tl+7fZA==
+  dependencies:
+    node-gyp-build "^4.2.0"
+
+util-deprecate@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+  integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+utils-merge@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+  integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@^3.2.1:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+  integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+vary@^1, vary@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+  integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+vfile-message@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.0.2.tgz#db7eaebe7fecb853010f2ef1664427f52baf8f74"
+  integrity sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==
+  dependencies:
+    "@types/unist" "^2.0.0"
+    unist-util-stringify-position "^3.0.0"
+
+vfile@*:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.1.0.tgz#18e78016f0f71e98d737d40f0fca921dc264a600"
+  integrity sha512-4o7/DJjEaFPYSh0ckv5kcYkJTHQgCKdL8ozMM1jLAxO9ox95IzveDPXCZp08HamdWq8JXTkClDvfAKaeLQeKtg==
+  dependencies:
+    "@types/unist" "^2.0.0"
+    is-buffer "^2.0.0"
+    unist-util-stringify-position "^3.0.0"
+    vfile-message "^3.0.0"
+
+vizion@~2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/vizion/-/vizion-2.2.1.tgz#04201ea45ffd145d5b5210e385a8f35170387fb2"
+  integrity sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==
+  dependencies:
+    async "^2.6.3"
+    git-node-fs "^1.0.0"
+    ini "^1.3.5"
+    js-git "^0.7.8"
+
+vm2@^3.9.3:
+  version "3.9.3"
+  resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.3.tgz#29917f6cc081cc43a3f580c26c5b553fd3c91f40"
+  integrity sha512-smLS+18RjXYMl9joyJxMNI9l4w7biW8ilSDaVRvFBDwOH8P0BK1ognFQTpg0wyQ6wIKLTblHJvROW692L/E53Q==
+
+webidl-conversions@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+  integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
+
+websocket@^1.0.34:
+  version "1.0.34"
+  resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111"
+  integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==
+  dependencies:
+    bufferutil "^4.0.1"
+    debug "^2.2.0"
+    es5-ext "^0.10.50"
+    typedarray-to-buffer "^3.1.5"
+    utf-8-validate "^5.0.2"
+    yaeti "^0.0.6"
+
+whatwg-url@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+  integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
+  dependencies:
+    tr46 "~0.0.3"
+    webidl-conversions "^3.0.0"
+
+widest-line@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
+  integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
+  dependencies:
+    string-width "^4.0.0"
+
+word-wrap@~1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+  integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+wrap-ansi@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+  integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+write-file-atomic@^3.0.0:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
+  integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
+  dependencies:
+    imurmurhash "^0.1.4"
+    is-typedarray "^1.0.0"
+    signal-exit "^3.0.2"
+    typedarray-to-buffer "^3.1.5"
+
+ws@^7.0.0:
+  version "7.5.5"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881"
+  integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==
+
+ws@~7.4.0:
+  version "7.4.6"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+  integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+
+xdg-basedir@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
+  integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
+
+xregexp@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
+  integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=
+
+xtend@^4.0.0:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+  integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+xxhashjs@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8"
+  integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==
+  dependencies:
+    cuint "^0.2.2"
+
+yaeti@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
+  integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
+
+yallist@^3.0.2:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+  integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yamljs@0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.3.0.tgz#dc060bf267447b39f7304e9b2bfbe8b5a7ddb03b"
+  integrity sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==
+  dependencies:
+    argparse "^1.0.7"
+    glob "^7.0.5"
+
+yn@3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+  integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
+
+zlib@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/zlib/-/zlib-1.0.5.tgz#6e7c972fc371c645a6afb03ab14769def114fcc0"
+  integrity sha1-bnyXL8NxxkWmr7A6sUdp3vEU/MA=

+ 74 - 0
working-groups/curator-group/Weekly_Curator_Working_Group_Report_28.md

@@ -0,0 +1,74 @@
+# Curator Working Group Report 28 
+
+## Weekly Curator Working Group Report 28 (24.10.2021-31.10.2021) 
+
+- Pre-proposal Discussion https://testnet.joystream.org/#/forum/threads/371
+
+- Based on the KPIs https://blog.joystream.org/sumer-kpis/#12.13
+
+- Previous approved proposal https://testnet.joystream.org/#/proposals/223, https://testnet.joystream.org/#/proposals/79
+
+| Worker ID            | Name Worker | Region / Time Zone | Language | Performance |         Notes          |
+|----------------------|-------------|--------------------|----------|-------------|------------------------|            
+| 22                   | IgreX       |       UTC+3        | EN\RU    | 100%         |Discord: IgreX#0267     |
+| 7                    | l1dev       |       	UTC       | EN       | -             |Technical worker        |
+| 16                   | kiraa       |       UTC+3        | EN\RU    | 100%        |Discord: Skipper#0353   |
+| 18                   | mmsaww      |       UTC+3        | EN\RU    | 100%         |Discord: Mikhail#7681   |
+| 19                   | kadyrovs    |       UTC+3        | EN\RU    | 100%        |Discord: Ruslan#4019    |
+| 20                   | zazik       |       UTC+4        | EN\RU    | 100%        |Discord: ZAZIK#5400     |
+| 21                   | Laura       |       UTC+4        | EN\RU    | 100%        |         Lead           |
+
+During this reporting period, 107 videos were uploaded, all of them verified.
+
+Everything is optimized, each curator does their job perfectly! Thank you all for your work!)
+
+Bounty 18 and Bounty 24 are working properly and are being checked, bounty managers are appointed (they are not working curators)
+
+# Video Statistic Overview for Council Term: 28
+## Overview Length: 7 days / 99900
+## Start Block/Date: #2866800 / 24.10.21
+## End Block/Date: #2966700 / 31.10.21
+
+| Number of uploads                 |
+|-----------------------------------|
+| 107                               |
+| Day	15.285                        |
+| Hour	0,63|                       | 
+|-----------------------------------|          
+| Video duration                    |    
+| Seconds 60876                     |
+| Minutes 1014.6                    | 
+| Hours 16,91                       | 
+| Days 0,70                         | 
+| ----------------------------------| 
+| Average duration                  |
+| Seconds	568,93                    |
+| Minutes	9,48                      |
+| Hours 0,39                        | 
+|-----------------------------------|
+| Median                            |
+| 390.73                            | 
+|-----------------------------------| 
+| Video file size (Mb)              | 
+| Total	16170.69                    |
+| Average	1630,57                   |
+| Median  156,17                    | 
+|-----------------------------------|
+| Number of videos in each category | 
+| Comedy 13                         | 
+| Education	29                      | 
+| Entertainment	2                   | 
+| Film & Animation	6               | 
+| Gaming 5	                        | 
+| Music	0                           | 
+| News & Politics	6                 | 
+| People & Blogs	15                | 
+| Pets & Animals	0                 | 
+| Howto & Style 0                   | 
+| Science & Technology 22           | 
+| Sports 0                          |                    
+| Travel & Events	7                 |
+| Autos & Vehicles	1               |   
+| Nonprofits & Activism  0          |      
+|-----------------------------------|
+| Total:	107                       |

+ 74 - 0
working-groups/curator-group/Weekly_Curator_Working_Group_Report_29.md

@@ -0,0 +1,74 @@
+# Curator Working Group Report 29 
+
+## Weekly Curator Working Group Report 29 (31.10.2021-08.11.2021) 
+
+- Pre-proposal Discussion https://testnet.joystream.org/#/forum/threads/371
+
+- Based on the KPIs https://blog.joystream.org/sumer-kpis/#12.13
+
+- Previous approved proposal https://testnet.joystream.org/#/proposals/223, https://testnet.joystream.org/#/proposals/79
+
+| Worker ID            | Name Worker | Region / Time Zone | Language | Performance |         Notes          |
+|----------------------|-------------|--------------------|----------|-------------|------------------------|            
+| 22                   | IgreX       |       UTC+3        | EN\RU    | 100%         |Discord: IgreX#0267     |
+| 7                    | l1dev       |       	UTC       | EN       | -             |Technical worker        |
+| 16                   | kiraa       |       UTC+3        | EN\RU    | 100%        |Discord: Skipper#0353   |
+| 18                   | mmsaww      |       UTC+3        | EN\RU    | 100%         |Discord: Mikhail#7681   |
+| 19                   | kadyrovs    |       UTC+3        | EN\RU    | 100%        |Discord: Ruslan#4019    |
+| 20                   | zazik       |       UTC+4        | EN\RU    | 100%        |Discord: ZAZIK#5400     |
+| 21                   | Laura       |       UTC+4        | EN\RU    | 100%        |         Lead           |
+
+During this reporting period, 184 videos were uploaded, all of them verified.
+
+Everything is optimized, each curator does their job perfectly! Thank you all for your work!)
+
+Bounty 18 and Bounty 24 are working properly and are being checked, bounty managers are appointed (they are not working curators)
+
+# Video Statistic Overview for Council Term: 29
+## Overview Length: 8 days / 99500
+## Start Block/Date: #2966700 / 31.10.21
+## End Block/Date: #3066200 / 08.11.21
+
+| Number of uploads                 |
+|-----------------------------------|
+| 184                               |
+| Day	23                            |
+| Hour	0,95|                       | 
+|-----------------------------------|          
+| Video duration                    |    
+| Seconds 134201                    |
+| Minutes 2236.7                    | 
+| Hours 37,27                       | 
+| Days 1,55                         | 
+| ----------------------------------| 
+| Average duration                  |
+| Seconds	729,35                    |
+| Minutes	12,15                     |
+| Hours 0,20                        | 
+|-----------------------------------|
+| Median                            |
+| 451.11                            | 
+|-----------------------------------| 
+| Video file size (Mb)              | 
+| Total	35045,92                    |
+| Average	1921,55                   |
+| Median  190,46                    | 
+|-----------------------------------|
+| Number of videos in each category | 
+| Comedy 20                         | 
+| Education	20                      | 
+| Entertainment	2                   | 
+| Film & Animation	10              | 
+| Gaming 11                         | 
+| Music	4                           | 
+| News & Politics	2                 | 
+| People & Blogs	25                | 
+| Pets & Animals	1                 | 
+| Howto & Style 2                   | 
+| Science & Technology 55           | 
+| Sports 18                         |                    
+| Travel & Events	11                |
+| Autos & Vehicles	1               |   
+| Nonprofits & Activism  0          |      
+|-----------------------------------|
+| Total:	184                       |

+ 74 - 0
working-groups/curator-group/Weekly_Curator_Working_Group_Report_30.md

@@ -0,0 +1,74 @@
+# Curator Working Group Report 30 
+
+## Weekly Curator Working Group Report 30 (08.11.2021-14.11.2021) 
+
+- Pre-proposal Discussion https://testnet.joystream.org/#/forum/threads/371
+
+- Based on the KPIs https://blog.joystream.org/sumer-kpis/#12.13
+
+- Previous approved proposal https://testnet.joystream.org/#/proposals/223, https://testnet.joystream.org/#/proposals/79
+
+| Worker ID            | Name Worker | Region / Time Zone | Language | Performance |         Notes          |
+|----------------------|-------------|--------------------|----------|-------------|------------------------|            
+| 22                   | IgreX       |       UTC+3        | EN\RU    | 100%         |Discord: IgreX#0267     |
+| 7                    | l1dev       |       	UTC       | EN       | -             |Technical worker        |
+| 16                   | kiraa       |       UTC+3        | EN\RU    | 100%        |Discord: Skipper#0353   |
+| 18                   | mmsaww      |       UTC+3        | EN\RU    | 100%         |Discord: Mikhail#7681   |
+| 19                   | kadyrovs    |       UTC+3        | EN\RU    | 100%        |Discord: Ruslan#4019    |
+| 20                   | zazik       |       UTC+4        | EN\RU    | 100%        |Discord: ZAZIK#5400     |
+| 21                   | Laura       |       UTC+4        | EN\RU    | 100%        |         Lead           |
+
+During this reporting period, 184 videos were uploaded, all of them verified.
+
+Everything is optimized, each curator does their job perfectly! Thank you all for your work!)
+
+Bounty 18 and Bounty 24 are working properly and are being checked, bounty managers are appointed (they are not working curators)
+
+# Video Statistic Overview for Council Term: 30
+## Overview Length: 6 days / 84000
+## Start Block/Date: #3066200 / 08.11.21
+## End Block/Date: #3150200 / 14.11.21
+
+| Number of uploads                 |
+|-----------------------------------|
+| 95                                |
+| Day	15.83                         |
+| Hour	0,65                        | 
+|-----------------------------------|          
+| Video duration                    |    
+| Seconds 80299                     |
+| Minutes 1338.31                   | 
+| Hours 22,30                       | 
+| Days 0,92                         | 
+| ----------------------------------| 
+| Average duration                  |
+| Seconds	845,25                    |
+| Minutes	14,08                     |
+| Hours 0,58                        | 
+|-----------------------------------|
+| Median                            |
+| 387.76                            | 
+|-----------------------------------| 
+| Video file size (Mb)              | 
+| Total	20999.84                    |
+| Average	2221,89                   |
+| Median  187,32                    | 
+|-----------------------------------|
+| Number of videos in each category | 
+| Comedy 7                          | 
+| Education	22                      | 
+| Entertainment	6                   | 
+| Film & Animation	4               | 
+| Gaming 5                          | 
+| Music	9                           | 
+| News & Politics	0                 | 
+| People & Blogs	11                | 
+| Pets & Animals	0                 | 
+| Howto & Style 0                   | 
+| Science & Technology 13           | 
+| Sports 7                          |                    
+| Travel & Events	11                |
+| Autos & Vehicles	0               |   
+| Nonprofits & Activism  0          |      
+|-----------------------------------|
+| Total:	95                        |

+ 74 - 0
working-groups/curator-group/Weekly_Curator_Working_Group_Report_31.md

@@ -0,0 +1,74 @@
+# Curator Working Group Report 31 
+
+## Weekly Curator Working Group Report 31 (14.11.2021-20.11.2021) 
+
+- Pre-proposal Discussion https://testnet.joystream.org/#/forum/threads/371
+
+- Based on the KPIs https://blog.joystream.org/sumer-kpis/#12.13
+
+- Previous approved proposal https://testnet.joystream.org/#/proposals/223, https://testnet.joystream.org/#/proposals/79
+
+| Worker ID            | Name Worker | Region / Time Zone | Language | Performance |         Notes          |
+|----------------------|-------------|--------------------|----------|-------------|------------------------|            
+| 22                   | IgreX       |       UTC+3        | EN\RU    | 100%        | Discord: IgreX#0267    |
+| 7                    | l1dev       |       	UTC         | EN       | -           | Technical worker       |
+| 16                   | kiraa       |       UTC+3        | EN\RU    | 100%        | Discord: Skipper#0353  |
+| 18                   | mmsaww      |       UTC+3        | EN\RU    | 100%        | Discord: Mikhail#7681  |
+| 19                   | kadyrovs    |       UTC+3        | EN\RU    | 100%        | Discord: Ruslan#4019   |
+| 20                   | zazik       |       UTC+4        | EN\RU    | 100%        | Discord: ZAZIK#5400    |
+| 21                   | Laura       |       UTC+4        | EN\RU    | 100%        |         Lead           |
+
+During this reporting period, 129 videos were uploaded, all of them verified.
+
+Everything is optimized, each curator does their job perfectly! Thank you all for your work!)
+
+Bounty 18 and Bounty 24 are working properly and are being checked, bounty managers are appointed (they are not working curators)
+
+# Video Statistic Overview for Council Term: 31
+## Overview Length: 6 days / 100000
+## Start Block/Date: #3150200 / 14.11.21
+## End Block/Date: #3250200 / 20.11.21
+
+| Number of uploads                 |
+|-----------------------------------|
+| Total: 129                        |
+| Day: 21.5                         |
+| Hour: 0,89                        | 
+|-----------------------------------|          
+| Video duration                    |    
+| Seconds: 120468                   |
+| Minutes: 2007,8                   | 
+| Hours: 33.46                      | 
+| Days: 1,39                        | 
+| ----------------------------------| 
+| Average duration                  |
+| Seconds: 933,86                   |
+| Minutes: 15.56	                  |
+| Hours: 0.25                       | 
+|-----------------------------------|
+| Median                            |
+| 537                               | 
+|-----------------------------------| 
+| Video file size (Mb)              | 
+| Total: 19749.72	                  |
+| Average: 153,09	                  |
+| Median: 76.19                     | 
+|-----------------------------------|
+| Number of videos in each category | 
+| Comedy 0                          | 
+| Education	40                      | 
+| Entertainment	0                   | 
+| Film & Animation 6                | 
+| Gaming 2                          | 
+| Music	0                           | 
+| News & Politics	2                 | 
+| People & Blogs 22                 | 
+| Pets & Animals 1                  | 
+| Howto & Style 0                   | 
+| Science & Technology 34           | 
+| Sports 19                         |                    
+| Travel & Events	0                 |
+| Autos & Vehicles 3                |   
+| Nonprofits & Activism 0           |      
+|-----------------------------------|
+| Total: 129                        |

+ 758 - 0
working-groups/operations-group/README.md

@@ -0,0 +1,758 @@
+# Operations WG
+
+- Intro: https://github.com/Joystream/helpdesk#builders
+- Forum: https://pioneer.joystreamstats.live/#/forum/categories/51
+- Tasks: https://git.joystreamstats.live/Operations/process
+- Openings: https://pioneer.joystreamstats.live/#/working-groups/opportunities/operationsGroup
+
+## Budget
+
+| Round           | Spent [M tJOY] | Budget [USD] | Rate [$/M tJOY] | Budget [M tJOY] | Term Balance [M tJOY] | Balance [M tJOY] | Balance [$] |
+|-----------------|----------------|--------------|-----------------|-----------------|-----------------------|------------------|-------------|
+| [7](#round-7)   |            0.3 |          130 |            37.9 |            3.43 |                  3.13 |             3.13 |      118.63 |
+| [8](#round-8)   |            0.9 |          130 |            37.3 |            3.49 |                  2.59 |             5.72 |      213.07 |
+| [9](#round-8)   |            0.9 |          255 |            36.0 |            7.08 |                  6.18 |            11.90 |      428.40 |
+| [10](#round-10) |            1.8 |          245 |            35.4 |            6.92 |                  5.12 |            17.02 |      602.51 |
+| [11](#round-11) |            3.3 |          245 |            34.8 |            7.04 |                  3.74 |            20.76 |      722.45 |
+| [12](#round-12) |            3.9 |          245 |            33.8 |            7.25 |                  3.35 |            24.11 |      814.92 |
+| [13](#round-13) |            9.1 |          245 |            33.7 |            7.27 |                 -1.83 |            22.28 |      750.84 |
+| [14](#round-14) |           12.2 |          245 |            34.0 |            7.21 |                 -4.99 |            17.29 |      587.86 |
+| [15](#round-15) |           12.8 |          245 |            31.7 |            7.73 |                 -5.07 |            12.22 |      387.37 |
+| [16](#round-16) |           18.8 |          475 |            28.9 |           16.44 |                 -2.36 |             9.86 |      284.95 |
+| [17](#round-17) |           17.5 |          475 |            30.7 |           15.47 |                 -2.03 |             7.83 |      240.38 |
+| [18](#round-18) |           44.1 |          600 |            30.4 |           19.74 |                -24.36 |           -16.53 |     -502.51 |
+| [19](#round-19) |           20.7 |          600 |            29.2 |           20.55 |                 -0.15 |           -16.68 |     -487.06 |
+| [20](#round-20) |           10.0 |          600 |            26.3 |           22.81 |                 12.81 |            -3.87 |     -101.78 |
+| [21](#round-21) |            8.2 |          600 |            25.5 |           23.53 |                 15.33 |            11.46 |      292.23 |
+| [22](#round-22) |           11.5 |          600 |            24.8 |           24.19 |                 12.69 |            24.15 |      598.92 |
+| [23](#round-23) |           11.1 |          365 |            25.3 |           14.43 |                  3.33 |            27.48 |      695.24 |
+| [24](#round-24) |            5.0 |          365 |            25.4 |           14.37 |                  9.37 |            36.85 |      935.99 |
+| [25](#round-25) |            9.5 |          365 |            27.1 |           13.47 |                  3.97 |            40.82 |     1106.22 |
+| [26](#round-26) |           10.8 |          365 |            25.9 |           14.09 |                  3.29 |            44.11 |     1142.45 |
+| [27](#round-27) |           14.5 |          365 |            25.8 |           14.15 |                 -0.35 |            43.76 |     1129.01 |
+| [28](#round-28) |            7.0 |          365 |            25.8 |           14.15 |                  7.15 |            50.91 |     1313.48 |
+| [29](#round-29) |           24.1 |          365 |            23.0 |           15.87 |                 -8.23 |            42.68 |      981.64 |
+| [30](#round-30) |           13.1 |          365 |            24.9 |           14.66 |                  1.56 |            44.24 |     1101.58 |
+| [31](#round-31) |           56.3 |          700 |           29.35 |           23.85 |                -32.45 |            11.79 |      346.04 |
+
+## Reports
+
+### [Round 7](../../council/tokenomics/sumer-4/Council_Round7_781200-881999_Tokenomics_Report.md)
+
+- **Date:** `6/1/2021 - 6/8/2021`
+- **Budget:** `$130`
+- **Spent:** `0.3 M / 3.43 M (@37.9 $/M)`
+- **Balance:** `3.13 M ($118.63)`
+
+* [Antioch KPI 6.x - Antioch WG Budget 3(b)](https://pioneer.joystreamstats.live/#/proposals/118)
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 0 | 1 | 100 |
+| Total Operations Stake (workers + lead) | 0 | 150000 | 100 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 9 | 0.0 | 0.0 |
+
+### [Round 8](../../council/tokenomics/sumer-4/Council_Round8_882000-982799_Tokenomics_Report.md)
+
+- **Date:** `6/8/2021 - 6/15/2021`
+- **Budget:** `$130`
+- **Spent:** `0.9 M / 3.49 M (@37.25 $/M)`
+- **Balance:** `5.72 M ($213.07)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 1 | 1 | 0 |
+| Total Operations Stake (workers + lead) | 150000 | 150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 9 | 0.9 | 1.0 |
+
+### [Round 9](../../council/tokenomics/sumer-4/Council_Round9_982800-1083599_Tokenomics_Report.md)
+
+- **Date:** `6/15/2021 - 6/22/2021`
+- **Budget:** `$255`
+- **Spent:** `0.9 M / 7.8 M (@36.0 $/M)`
+- **Balance:** `11.9 M ($428.40)`
+
+* [KPI 8.8 - Budget 4](https://pioneer.joystreamstats.live/#/proposals/163)
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 1 | 1 | 0 |
+| Total Operations Stake (workers + lead) | 150000 | 150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 9 | 0.9 | 1.9 |
+
+### [Round 10](../../council/tokenomics/sumer-4/Council_Round10_1083600-1184399_Tokenomics_Report.md)
+
+- **Date:** `6/22/2021 - 6/29/2021`
+- **Budget:** `$245`
+- **Spent:** `1.8 M / 6.92 M (@35.4 $/M)`
+- **Balance:** `17.2 M ($602.51)`
+
+* [Sumer KPI 9.x - Budget 5 (correction)](https://pioneer.joystreamstats.live/#/proposals/180)
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 1 | 4 | 300 |
+| Total Operations Stake (workers + lead) | 150000 | 1650000 | 1000 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 21 | 1.8 | 3.7 |
+
+### [Round 11](../../council/tokenomics/sumer-4/Council_Round11_1184400-1285199_Tokenomics_Report.md)
+
+- **Date:** `6/29/2021 - 7/6/2021`
+- **Budget:** `$245`
+- **Spent:** `3.3 M / 7.04 M (@34.8 $/M)`
+- **Balance:** `20.76 M ($722.45)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 4 | 8 | 100 |
+| Total Operations Stake (workers + lead) | 150000 | 150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 21 | 2.1 | 5.8 |
+| 5 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 2 | 0.2 | 0.2 |
+| 6 | [@nexusfallout](https://pioneer.joystreamstats.live/#/members/nexusfallout) | active | 1 | 0.1 | 0.1 |
+| 7 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 1 | 0.1 | 0.1 |
+| 8 | [@stwoof](https://pioneer.joystreamstats.live/#/members/stwoof) | active | 1 | 0.1 | 0.1 |
+| 9 | [@maxlevush](https://pioneer.joystreamstats.live/#/members/maxlevush) | active | 1 | 0.1 | 0.1 |
+| 10 | [@drmarkovi](https://pioneer.joystreamstats.live/#/members/drmarkovi) | active | 1 | 0.1 | 0.1 |
+| 11 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 10 | 0.5 | 0.5 |
+
+### [Round 12](../../council/tokenomics/sumer-4/Council_Round12_1285200-1385999_Tokenomics_Report.md)
+
+- **Date:** `7/6/2021 - 7/13/2021`
+- **Budget:** `$245`
+- **Spent:** `3.9 M / 7.25 M (@33.8 $/M)`
+- **Balance:** `24.11 M ($814.92)`
+
+* [Budget 6 - July 11 2021](https://pioneer.joystreamstats.live/#/proposals/254)
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 8 | 8 | 0 |
+| Total Operations Stake (workers + lead) | 3650000 | 3650000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 21 | 2.1 | 7.9 |
+| 5 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 2 | 0.2 | 0.4 |
+| 6 | [@nexusfallout](https://pioneer.joystreamstats.live/#/members/nexusfallout) | active | 1 | 0.1 | 0.2 |
+| 7 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 1 | 0.1 | 0.2 |
+| 8 | [@stwoof](https://pioneer.joystreamstats.live/#/members/stwoof) | active | 1 | 0.1 | 0.2 |
+| 9 | [@maxlevush](https://pioneer.joystreamstats.live/#/members/maxlevush) | active | 1 | 0.1 | 0.2 |
+| 10 | [@drmarkovi](https://pioneer.joystreamstats.live/#/members/drmarkovi) | active | 1 | 0.1 | 0.2 |
+| 11 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 10 | 1.0 | 1.5 |
+
+### [Round 13](../../council/tokenomics/sumer-4/Council_Round13_1386000-1486799_Tokenomics_Report.md)
+
+- **Date:** `7/13/2021 - 7/20/2021`
+- **Budget:** `$245`
+- **Spent:** `6.7 M / 7.27 M (@33.7 $/M)`
+ - 2 M [Telegram bot](https://pioneer.joystreamstats.live/#/proposals/282)
+ - 0.4 M [Proposing Telegram bot](https://pioneer.joystreamstats.live/#/proposals/283)
+- **Balance:** `22.28 M ($750.84)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 8 | 8 | 0 |
+| Total Operations Stake (workers + lead) | 3650000 | 3650000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 22 | 2.1 | 10.1 |
+| 5 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 2 | 0.2 | 0.6 |
+| 6 | [@nexusfallout](https://pioneer.joystreamstats.live/#/members/nexusfallout) | active | 1 | 0.1 | 0.3 |
+| 7 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 1 | 0.1 | 0.3 |
+| 8 | [@stwoof](https://pioneer.joystreamstats.live/#/members/stwoof) | active | 1 | 0.1 | 0.3 |
+| 9 | [@maxlevush](https://pioneer.joystreamstats.live/#/members/maxlevush) | active | 1 | 0.1 | 0.3 |
+| 10 | [@drmarkovi](https://pioneer.joystreamstats.live/#/members/drmarkovi) | active | 1 | 0.1 | 0.3 |
+| 11 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 50 | 3.8 | 5.3 |
+
+### [Round 14](../../council/tokenomics/sumer-4/Council_Round14_1486800-1587599_Tokenomics_Report.md)
+
+- **Date:** `7/20/2021 - 7/27/2021`
+- **Budget:** `$245`
+- **Spent:** `12.2 M / 7.21 M (@34 $/M)`
+- **Balance:** `17.29 M ($587.86)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 8 | 9 | 12.5 |
+| Total Operations Stake (workers + lead) | 3650000 | 3750000 | 2.74 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 22 | 1.8 | 11.9 |
+| 5 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 20 | 1.2 | 1.8 |
+| 6 | [@nexusfallout](https://pioneer.joystreamstats.live/#/members/nexusfallout) | active | 10 | 1.1 | 1.4 |
+| 7 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 20 | 1.2 | 1.5 |
+| 8 | [@stwoof](https://pioneer.joystreamstats.live/#/members/stwoof) | active | 10 | 1.1 | 1.4 |
+| 9 | [@maxlevush](https://pioneer.joystreamstats.live/#/members/maxlevush) | active | 10 | 1.1 | 1.4 |
+| 10 | [@drmarkovi](https://pioneer.joystreamstats.live/#/members/drmarkovi) | active | 11 | 1.1 | 1.4 |
+| 11 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 20 | 2.1 | 7.4 |
+| 12 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 50 | 1.4 | 1.4 |
+
+### [Round 15](../../council/tokenomics/sumer-4/Council_Round15_1587600-1688399_Tokenomics_Report.md)
+
+- **Date:** `7/27/2021 - 8/3/2021`
+- **Budget:** `$245`
+- **Spent:** `11.3 M / 7.73 M (@31.7 $/M)`
+ - 1.5 M [Discord bot](https://pioneer.joystreamstats.live/#/proposals/335)
+- **Balance:** `12.22 M ($387.37)`
+
+- [Budget Summary](https://pioneer.joystreamstats.live/#/forum/threads/517?page=2&replyIdx=15)
+- [Budget Overspending Discussion](https://pioneer.joystreamstats.live//#/forum/threads/518)
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 9 | 11 | 22.22 |
+| Total Operations Stake (workers + lead) | 3750000 | 4750000 | 26.67 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 23 | 1.6 | 13.5 |
+| 5 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 25 | 1.6 | 3.4 |
+| 6 | [@nexusfallout](https://pioneer.joystreamstats.live/#/members/nexusfallout) | active | 0 | 0.4 | 1.8 |
+| 7 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 20 | 1.3 | 2.8 |
+| 8 | [@stwoof](https://pioneer.joystreamstats.live/#/members/stwoof) | active | 10 | 0.7 | 2.1 |
+| 9 | [@maxlevush](https://pioneer.joystreamstats.live/#/members/maxlevush) | active | 1 | 0.2 | 1.6 |
+| 10 | [@drmarkovi](https://pioneer.joystreamstats.live/#/members/drmarkovi) | active | 11 | 0.7 | 2.2 |
+| 11 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 20 | 1.3 | 8.7 |
+| 12 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 50 | 3.4 | 4.8 |
+| 13 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 1 | 0.0 | 0.0 |
+| 14 | [@palladium](https://pioneer.joystreamstats.live/#/members/palladium) | active | 1 | 0.0 | 0.0 |
+
+### [Round 16](../../council/tokenomics/sumer-4/Council_Round16_1688400-1789199_Tokenomics_Report.md)
+
+- **Date:** `8/3/2021 - 8/10/2021`
+- **Budget:** `$475`
+- **Spent:** `18.8 M / 16.44 M (@28.9 $/M)`
+- **Balance:** `9.86 M ($284.95)`
+
+- [Proposal 347](https://pioneer.joystreamstats.live/#/proposals/347) (Expired): Operations Tasks Budget
+- [Proposal 377](https://pioneer.joystreamstats.live/#/proposals/377): increase Operations budget to 400$
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 11 | 6 | -45.45 |
+| Total Operations Stake (workers + lead) | 4750000 | 150000 | -96.84 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 26 | 2.1 | 15.6 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 69 | 3.0 | 3.0 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 278 | 8.3 | 8.3 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 28 | 1.3 | 1.3 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 14 | 0.5 | 0.5 |
+| 19 | [@nexusfallout](https://pioneer.joystreamstats.live/#/members/nexusfallout) | active | 14 | 0.5 | 0.5 |
+
+### [Round 17](../../council/tokenomics/sumer-4/Council_Round17_1789200-1889999_Tokenomics_Report.md)
+
+- **Date:** `8/10/2021 - 8/17/2021`
+- **Budget:** `$475`
+- **Spent:** `17.5 M / 15.47 M (@30.7 $/M)`
+- **Balance:** `7.83 M ($240.38)`
+
+- [Proposal 426](https://pioneer.joystreamstats.live/#/proposals/377): Bounty for promotional content
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 6 | 5 | -16.67 |
+| Total Operations Stake (workers + lead) | 150000 | 150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 26 | 1.8 | 17.4 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 28 | 2.1 | 5.2 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 69 | 10.5 | 18.8 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 28 | 1.8 | 3.1 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 69 | 1.1 | 1.6 |
+
+### [Round 18](../../council/tokenomics/sumer-4/Council_Round18_1890000-1990799_Tokenomics_Report.md)
+
+- **Date:** `8/17/2021 - 8/24/2021`
+- **Budget:** `$600`
+- **Spent:** `9.1 M / 19.74 M (@30.4 $/M)`
+ - 26 M [jsstats maintenance, HELIOS history, sprites.joystreamstats.live, storage bot](https://pioneer.joystreamstats.live/#/proposals/451)
+ - 9 M [Storage bot](https://joystreamstats.live/proposals/457)
+- **Balance:** `-16.53 M ($-502.51)`
+
+- [Proposal 127](https://pioneer.joystreamstats.live/#/proposals/127): Add endpoints budget to Operations ($50 per term), implemented at [block 1,912,078](https://pioneer.joystreamstats.live/#/explorer/query/0xca2763a4a87b533a61ef1604b9309476ae63e73bc76b0b59d09c0dfb44d57f31)
+- [Proposal 393](https://pioneer.joystreamstats.live/#/proposals/393): Pay Community Manager salary for [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) ($75 per term)
+- [Proposal 449](https://pioneer.joystreamstats.live/#/proposals/449) (Expired): increase Operations budget to 800$
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 5 | 6 | 20 |
+| Total Operations Stake (workers + lead) | 150000 | 150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 24 | 1.3 | 18.7 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 14 | 1.1 | 6.3 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 14 | 1.7 | 20.5 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 28 | 1.4 | 4.5 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 28 | 3.1 | 4.8 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 0.6 | 0.6 |
+
+### [Round 19](../../council/tokenomics/sumer-4/Council_Round19_1990800-2091599_Tokenomics_Report.md)
+
+- **Date:** `8/24/2021 - 8/31/2021`
+- **Budget:** `$600`
+- **Spent:** `11.7 M / 20.55 M (@29.2 $/M)`
+ - 9 M [faucet bot](https://pioneer.joystreamstats.live/#/proposals/499)
+- **Balance:** `-16.68 M ($-487.06)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 6 | 6 | 0 |
+| Total Operations Stake (workers + lead) | 150000 | 150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 2.4 | 21.1 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 14 | 1.4 | 7.6 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 14 | 1.3 | 21.8 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 28 | 2.6 | 7.1 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 28 | 2.6 | 7.4 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 1.4 | 2.0 |
+
+### [Round 20](../../council/tokenomics/sumer-4/Council_Round20_2091600-2192399_Tokenomics_Report.md)
+
+- **Date:** `8/31/2021 - 9/7/2021`
+- **Budget:** `$600`
+- **Spent:** `10 M / 22.81 M (@26.3 $/M)`
+- **Balance:** `-3.87 M ($-101.78)`
+
+- **Spending** 11.5 M ($300) [pioneer improvements](https://pioneer.joystreamstats.live/#/proposals/526) (**Canceled**, paid via salary to @freakstatic)
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 6 | 6 | 0 |
+| Total Operations Stake (workers + lead) | 150000 | 150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 2.2 | 23.3 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 14 | 1.1 | 8.7 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 28 | 1.1 | 22.9 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 14 | 2.1 | 9.3 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 14 | 2.1 | 9.6 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 1.2 | 3.2 |
+
+### [Round 21](../../council/tokenomics/sumer-4/Council_Round21_2192400-2293199_Tokenomics_Report.md)
+
+- **Date:** `9/7/2021 - 9/14/2021`
+- **Budget:** `$600`
+- **Spent:** `8.2 M / 23.53 M (@25.5 $/M)`
+- **Balance:** `11.46 M ($292.23)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 6 | 6 | 0 |
+| Total Operations Stake (workers + lead) | 150000 | 150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 2.1 | 25.4 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 14 | 1.0 | 9.7 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 28 | 2.0 | 24.9 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 14 | 1.0 | 10.3 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 14 | 1.0 | 10.6 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 1.1 | 4.3 |
+
+### [Round 22](../../council/tokenomics/sumer-4/Council_Round22_2293200-2393999_Tokenomics_Report.md)
+
+- **Date:** `9/14/2021 - 9/21/2021`
+- **Budget:** `$600`
+- **Spent:** `11.5 M / 24.19 M (@24.8 $/M)`
+- **Balance:** `24.15 M ($598.92)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 6 | 24 | 300 |
+| Total Operations Stake (workers + lead) | 150000 | 2150000 | 1333.33 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 2.5 | 27.9 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.4 | 10.1 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 28 | 2.5 | 27.4 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 7 | 0.9 | 11.2 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 0 | 0.2 | 10.8 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 1.3 | 5.6 |
+| 21 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 0 | 0.0 | 0.0 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 0 | 0.0 | 0.0 |
+| 23 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 0 | 0.0 | 0.0 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 0 | 0.0 | 0.0 |
+| 25 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 27 | [@chasil](https://pioneer.joystreamstats.live/#/members/chasil) | active | 0 | 0.0 | 0.0 |
+| 28 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 30 | [@metralunab](https://pioneer.joystreamstats.live/#/members/metralunab) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 0 | 0.0 | 0.0 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.2 | 0.2 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 0 | 0.0 | 0.0 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 56 | 3.4 | 3.4 |
+| 35 | [@kriptos](https://pioneer.joystreamstats.live/#/members/kriptos) | active | 0 | 0.0 | 0.0 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 37 | [@surpaul](https://pioneer.joystreamstats.live/#/members/surpaul) | active | 0 | 0.0 | 0.0 |
+| 38 | [@allyes](https://pioneer.joystreamstats.live/#/members/allyes) | active | 0 | 0.0 | 0.0 |
+
+### [Round 23](../../council/tokenomics/sumer-4/Council_Round23_2394000-2494799_Tokenomics_Report.md)
+
+- **Date:** `9/21/2021 - 9/28/2021`
+- **Budget:** `$365`
+- **Spent:** `11.1 M / 14.43 M (@25.3 $/M)`
+- **Balance:** `27.48 M ($695.24)`
+
+- [Budget 7](https://pioneer.joystreamstats.live/#/proposals/576) (Approved 17 Sep 2021), reduce Operations budget ($70 lead salary, $195 worker salaries, $25 servers, $75 community manager)
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 24 | 24 | 0 |
+| Total Operations Stake (workers + lead) | 2150000 | 2150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 2.3 | 30.2 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.2 | 10.3 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 28 | 2.2 | 29.6 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 7 | 0.6 | 11.7 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 0 | 0.0 | 10.8 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 1.2 | 6.8 |
+| 21 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 0 | 0.0 | 0.0 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 0 | 0.0 | 0.0 |
+| 23 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 6 | 0.4 | 0.4 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 0 | 0.0 | 0.0 |
+| 25 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 27 | [@chasil](https://pioneer.joystreamstats.live/#/members/chasil) | active | 0 | 0.0 | 0.0 |
+| 28 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 30 | [@metralunab](https://pioneer.joystreamstats.live/#/members/metralunab) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 0 | 0.0 | 0.0 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.2 | 0.4 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 0 | 0.0 | 0.0 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 56 | 4.0 | 7.4 |
+| 35 | [@kriptos](https://pioneer.joystreamstats.live/#/members/kriptos) | active | 0 | 0.0 | 0.0 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 37 | [@surpaul](https://pioneer.joystreamstats.live/#/members/surpaul) | active | 0 | 0.0 | 0.0 |
+| 38 | [@allyes](https://pioneer.joystreamstats.live/#/members/allyes) | active | 0 | 0.0 | 0.0 |
+
+
+### [Round 24](../../council/tokenomics/sumer-4/Council_Round24_2494800-2595599_Tokenomics_Report.md)
+
+- **Date:** `9/28/2021 - 10/5/2021`
+- **Budget:** `$365`
+- **Spent:** `5 M / 14.37 M (@25.4 $/M)`
+- **Balance:** `36.85 M ($935.99)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 24 | 24 | 0 |
+| Total Operations Stake (workers + lead) | 2150000 | 2150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 1.0 | 31.2 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.1 | 10.4 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 28 | 1.0 | 30.6 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 7 | 0.3 | 12.0 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 0 | 0.0 | 10.8 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 0.6 | 7.3 |
+| 21 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 0 | 0.0 | 0.0 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 0 | 0.0 | 0.0 |
+| 23 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 6 | 0.2 | 0.6 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 0 | 0.0 | 0.0 |
+| 25 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 27 | [@chasil](https://pioneer.joystreamstats.live/#/members/chasil) | active | 0 | 0.0 | 0.0 |
+| 28 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 30 | [@metralunab](https://pioneer.joystreamstats.live/#/members/metralunab) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 0 | 0.0 | 0.0 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.1 | 0.6 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 0 | 0.0 | 0.0 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 56 | 1.8 | 9.2 |
+| 35 | [@kriptos](https://pioneer.joystreamstats.live/#/members/kriptos) | active | 0 | 0.0 | 0.0 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 37 | [@surpaul](https://pioneer.joystreamstats.live/#/members/surpaul) | active | 0 | 0.0 | 0.0 |
+| 38 | [@allyes](https://pioneer.joystreamstats.live/#/members/allyes) | active | 0 | 0.0 | 0.0 |
+
+### [Round 25](../../council/tokenomics/sumer-4/Council_Round25_2595600-2696399_Tokenomics_Report.md)
+
+- **Date:** `9/28/2021 - 10/5/2021`
+- **Budget:** `$365`
+- **Spent:** `9.5 M / 13.47 M (@27.1 $/M)`
+- **Balance:** `40.82 M ($1106.22)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 24 | 24 | 0 |
+| Total Operations Stake (workers + lead) | 2150000 | 2150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 1.8 | 33.0 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.2 | 10.6 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 28 | 1.8 | 32.5 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 7 | 0.5 | 12.4 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 0 | 0.0 | 10.8 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 0.9 | 8.3 |
+| 21 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 7 | 0.2 | 0.2 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 0 | 0.0 | 0.0 |
+| 23 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 6 | 0.4 | 1.0 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 3 | 0.1 | 0.1 |
+| 25 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 27 | [@chasil](https://pioneer.joystreamstats.live/#/members/chasil) | active | 0 | 0.0 | 0.0 |
+| 28 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 30 | [@metralunab](https://pioneer.joystreamstats.live/#/members/metralunab) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 0 | 0.0 | 0.0 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.2 | 0.7 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 0 | 0.0 | 0.0 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 56 | 3.4 | 12.6 |
+| 35 | [@kriptos](https://pioneer.joystreamstats.live/#/members/kriptos) | active | 0 | 0.0 | 0.0 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 37 | [@surpaul](https://pioneer.joystreamstats.live/#/members/surpaul) | active | 0 | 0.0 | 0.0 |
+| 38 | [@allyes](https://pioneer.joystreamstats.live/#/members/allyes) | active | 0 | 0.0 | 0.0 |
+
+### [Round 26](../../council/tokenomics/sumer-4/Council_Round26_2696400-2782799_Tokenomics_Report.md)
+
+- **Date:** `10/12/2021 - 10/18/2021`
+- **Budget:** `$365`
+- **Spent:** `10.8 M / 14.08 M (@25.9 $/M)`
+- **Balance:** `44.11 M ($1142.45)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 24 | 24 | 0 |
+| Total Operations Stake (workers + lead) | 2150000 | 2150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 1.9 | 34.9 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.2 | 10.8 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 28 | 1.9 | 34.4 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 1 | 0.1 | 12.6 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 0 | 0.0 | 10.8 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 1.1 | 9.3 |
+| 21 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 7 | 0.5 | 0.7 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 4 | 0.3 | 0.3 |
+| 23 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 6 | 0.4 | 1.4 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 3 | 0.2 | 0.3 |
+| 25 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 27 | [@chasil](https://pioneer.joystreamstats.live/#/members/chasil) | active | 0 | 0.0 | 0.0 |
+| 28 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 30 | [@metralunab](https://pioneer.joystreamstats.live/#/members/metralunab) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 0 | 0.0 | 0.0 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.2 | 0.9 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 0 | 0.0 | 0.0 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 56 | 3.8 | 16.4 |
+| 35 | [@kriptos](https://pioneer.joystreamstats.live/#/members/kriptos) | active | 0 | 0.0 | 0.0 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 4 | 0.3 | 0.3 |
+| 37 | [@surpaul](https://pioneer.joystreamstats.live/#/members/surpaul) | active | 0 | 0.0 | 0.0 |
+| 38 | [@allyes](https://pioneer.joystreamstats.live/#/members/allyes) | active | 0 | 0.0 | 0.0 |
+
+### [Round 27](../../council/tokenomics/sumer-4/Council_Round27_2782800-2883599_Tokenomics_Report.md)
+
+- **Date:** `10/18/2021 - 10/26/2021`
+- **Budget:** `$365`
+- **Spent:** `14.5 M / 14.15 M (@25.8 $/M)`
+- **Balance:** `43.76 M ($1129.01)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 24 | 25 | 4.17 |
+| Total Operations Stake (workers + lead) | 2150000 | 2150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 2.5 | 37.4 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.3 | 11.1 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 28 | 2.4 | 36.8 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 1 | 0.1 | 12.7 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 14 | 0.4 | 11.2 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 1.3 | 10.6 |
+| 21 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 7 | 0.6 | 1.3 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 4 | 0.4 | 0.6 |
+| 23 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 6 | 0.5 | 1.9 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 3 | 0.3 | 0.5 |
+| 25 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 27 | [@chasil](https://pioneer.joystreamstats.live/#/members/chasil) | active | 0 | 0.0 | 0.0 |
+| 28 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 30 | [@metralunab](https://pioneer.joystreamstats.live/#/members/metralunab) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 0 | 0.0 | 0.0 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.3 | 1.2 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 0 | 0.0 | 0.0 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 56 | 4.8 | 21.2 |
+| 35 | [@kriptos](https://pioneer.joystreamstats.live/#/members/kriptos) | active | 0 | 0.0 | 0.0 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 4 | 0.4 | 0.6 |
+| 37 | [@surpaul](https://pioneer.joystreamstats.live/#/members/surpaul) | active | 0 | 0.0 | 0.0 |
+| 38 | [@allyes](https://pioneer.joystreamstats.live/#/members/allyes) | active | 0 | 0.0 | 0.0 |
+| 39 | [@whitebarbie](https://pioneer.joystreamstats.live/#/members/whitebarbie) | active | 14 | 0.5 | 0.5 |
+
+
+### [Round 28](../../council/tokenomics/sumer-4/Council_Round28_2883600-2984399_Tokenomics_Report.md)
+
+- **Date:** `10/26/2021 - 11/2/2021`
+- **Budget:** `$365`
+- **Spent:** `7 M / 14.15 M (@25.8 $/M)`
+- **Balance:** `50.91 M ($1313.48)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 25 | 25 | 0 |
+| Total Operations Stake (workers + lead) | 2150000 | 2150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 1.1 | 38.5 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.1 | 11.2 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 28 | 1.1 | 37.9 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 1 | 0.1 | 12.7 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 14 | 0.6 | 11.7 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 0.5 | 11.1 |
+| 21 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 7 | 0.3 | 1.6 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 4 | 0.2 | 0.8 |
+| 23 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 6 | 0.2 | 2.1 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 3 | 0.1 | 0.7 |
+| 25 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 27 | [@chasil](https://pioneer.joystreamstats.live/#/members/chasil) | active | 0 | 0.0 | 0.0 |
+| 28 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 30 | [@metralunab](https://pioneer.joystreamstats.live/#/members/metralunab) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 0 | 0.0 | 0.0 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.1 | 1.3 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 0 | 0.0 | 0.0 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 56 | 2.0 | 23.2 |
+| 35 | [@kriptos](https://pioneer.joystreamstats.live/#/members/kriptos) | active | 0 | 0.0 | 0.0 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 4 | 0.1 | 0.8 |
+| 37 | [@surpaul](https://pioneer.joystreamstats.live/#/members/surpaul) | active | 0 | 0.0 | 0.0 |
+| 38 | [@allyes](https://pioneer.joystreamstats.live/#/members/allyes) | active | 0 | 0.0 | 0.0 |
+| 39 | [@whitebarbie](https://pioneer.joystreamstats.live/#/members/whitebarbie) | active | 14 | 0.5 | 0.9 |
+
+### [Round 29](../../council/tokenomics/sumer-4/Council_Round29_2984400-3085199_Tokenomics_Report.md)
+
+- **Date:** `11/2/2021 - 11/9/2021`
+- **Budget:** `$365`
+- **Spent:** `24.1 M / 15.87 M (@23 $/M)`
+- **Balance:** `42.68 M ($981.64)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 25 | 25 | 0 |
+| Total Operations Stake (workers + lead) | 2150000 | 2150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 1.9 | 40.4 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.2 | 11.4 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 28 | 1.9 | 39.8 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 1 | 0.1 | 12.8 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 14 | 0.9 | 12.6 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 0.9 | 12.1 |
+| 21 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 7 | 0.4 | 2.0 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 4 | 0.3 | 1.0 |
+| 23 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 6 | 0.4 | 2.5 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 3 | 0.2 | 0.8 |
+| 25 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 0 | 0.0 | 0.0 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 27 | [@chasil](https://pioneer.joystreamstats.live/#/members/chasil) | active | 0 | 0.0 | 0.0 |
+| 28 | [@mmsaww](https://pioneer.joystreamstats.live/#/members/mmsaww) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 30 | [@metralunab](https://pioneer.joystreamstats.live/#/members/metralunab) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 0 | 0.0 | 0.0 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.2 | 1.5 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 0 | 0.0 | 0.0 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 111 | 6.4 | 29.6 |
+| 35 | [@kriptos](https://pioneer.joystreamstats.live/#/members/kriptos) | active | 0 | 0.0 | 0.0 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 4 | 0.3 | 1.1 |
+| 37 | [@surpaul](https://pioneer.joystreamstats.live/#/members/surpaul) | active | 0 | 0.0 | 0.0 |
+| 38 | [@allyes](https://pioneer.joystreamstats.live/#/members/allyes) | active | 0 | 0.0 | 0.0 |
+| 39 | [@whitebarbie](https://pioneer.joystreamstats.live/#/members/whitebarbie) | active | 14 | 0.9 | 1.9 |
+
+### [Round 30](../../council/tokenomics/sumer-4/Council_Round30_3085200-3185999_Tokenomics_Report.md)
+
+- **Date:** `11/9/2021 - 11/16/2021`
+- **Budget:** `$365`
+- **Spent:** `13.1 M / 14.77 M (@24.9 $/M)`
+- **Balance:** `44.42 M ($1101.58)`
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 25 | 16 | -36 |
+| Total Operations Stake (workers + lead) | 2150000 | 1150000 | -46.51 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 2.0 | 42.4 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.2 | 11.6 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 14 | 1.5 | 41.3 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 1 | 0.1 | 13.0 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 3 | 0.5 | 13.1 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 1.0 | 13.1 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 7 | 0.4 | 1.4 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 3 | 0.2 | 1.0 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 3 | 0.1 | 0.1 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.2 | 1.7 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 14 | 0.9 | 0.9 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 28 | 4.6 | 34.2 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 4 | 0.3 | 1.4 |
+| 39 | [@whitebarbie](https://pioneer.joystreamstats.live/#/members/whitebarbie) | active | 14 | 0.9 | 2.8 |
+
+### [Round 31](../../council/tokenomics/sumer-4/Council_Round31_3186000-3286799_Tokenomics_Report.md)
+
+- **Date:** `11/16/2021 - 11/23/2021`
+- **Budget:** `$700`
+- **Spent:** `10.3 M / 23.85 M (@29.35 $/M)`
+ - 46 M [joystream-lib & tokenomics refactor](https://pioneer.joystreamstats.live/#/proposals/824)
+- **Balance:** `11.79 M ($346.04)`
+
+- [Budget 8](https://pioneer.joystreamstats.live/#/proposals/813) (Approved 15 Nov 2021), increase OWG budget ($100 lead salary, $600 expenses + worker salaries)
+
+| Property                | Start Block | End Block | % Change |
+|-------------------------|--------------|--------------|----------|
+| Number of Operations Workers      | 16 | 16 | 0 |
+| Total Operations Stake (workers + lead) | 1150000 | 1150000 | 0 |
+
+| # | Member | Status | tJOY / Block | M tJOY Term | M tJOY total |
+|--|--|--|--|--|--|
+| 0 | [@l1dev](https://pioneer.joystreamstats.live/#/members/l1dev) | active | 28 | 2.0 | 44.4 |
+| 15 | [@isonar](https://pioneer.joystreamstats.live/#/members/isonar) | active | 3 | 0.2 | 11.8 |
+| 16 | [@lkskrn](https://pioneer.joystreamstats.live/#/members/lkskrn) | active | 14 | 1.1 | 42.3 |
+| 17 | [@freakstatic](https://pioneer.joystreamstats.live/#/members/freakstatic) | active | 1 | 0.1 | 13.1 |
+| 18 | [@dapplooker](https://pioneer.joystreamstats.live/#/members/dapplooker) | active | 3 | 0.2 | 13.3 |
+| 20 | [@joystreamstats](https://pioneer.joystreamstats.live/#/members/joystreamstats) | active | 15 | 1.1 | 14.1 |
+| 22 | [@arseniy2706](https://pioneer.joystreamstats.live/#/members/arseniy2706) | active | 7 | 0.5 | 1.9 |
+| 24 | [@shtihmas](https://pioneer.joystreamstats.live/#/members/shtihmas) | active | 3 | 0.2 | 1.2 |
+| 26 | [@zazik](https://pioneer.joystreamstats.live/#/members/zazik) | active | 0 | 0.0 | 0.0 |
+| 29 | [@goldmember](https://pioneer.joystreamstats.live/#/members/goldmember) | active | 0 | 0.0 | 0.0 |
+| 31 | [@ilich](https://pioneer.joystreamstats.live/#/members/ilich) | active | 3 | 0.2 | 0.3 |
+| 32 | [@kate_fm](https://pioneer.joystreamstats.live/#/members/kate_fm) | active | 3 | 0.2 | 1.9 |
+| 33 | [@ururu](https://pioneer.joystreamstats.live/#/members/ururu) | active | 14 | 1.1 | 2.0 |
+| 34 | [@andybut](https://pioneer.joystreamstats.live/#/members/andybut) | active | 28 | 2.1 | 36.3 |
+| 36 | [@chiffah](https://pioneer.joystreamstats.live/#/members/chiffah) | active | 4 | 0.3 | 1.7 |
+| 39 | [@whitebarbie](https://pioneer.joystreamstats.live/#/members/whitebarbie) | active | 14 | 1.1 | 3.9 |

+ 250 - 0
working-groups/storage-group/report_21.md

@@ -0,0 +1,250 @@
+# Storage Working Group Status Reporting - 21
+
+## Storage Lead : _0x2bc_
+
+### Report:
+
+This is the 21th report for the Storage Provider Working Group. 
+
+* One more week was completed without incidents.
+
+* KPI 28.SP-1  is being finalized
+
+* Work on new SP budget is in progress
+
+## Current ipfs repo size : 954.51 GB
+
+### 0x2bc
+
+- Worker ID: 22
+- Tokens earned: 10.5732 MJOY
+- Missed: 1.4354 kJOY
+- Location: France
+- Storage capacity: 1.92TB
+- Type of storage: SSD
+- Discord Name: xJames#8645 (0x2bc)
+- Config: `CPU: Intel Core i7 9700k, RAM: 64GB DDR4, Storage 2x960 Go SSD, Raid: 0 Stripping, Bandwidth: 1 Gbps`
+- Cost: 59 USD
+- Helios:
+  ```
+    ---------------------------------------
+    Final Result for provider 22
+    url: https://xjames.xyz/storage
+    fetched: 15582/15582
+    failed: 0
+    check took: 133.793s
+    ------------------------------------------
+  ```
+
+## Storage Provider Information
+
+### joystreamstats
+
+- Worker ID: 3
+- Tokens earned: 16.6807 MJOY
+- Missed: 1.5523 MJOY
+- Location: Finland
+- Storage capacity: 1.9T
+- Type of storage: SSD/NVME
+- Discord Name: freakstatic#0197 / l1dev#4675
+- Config: `CPU: AMD Ryzen™ 7 3700X Octa-Core, RAM: 64 GB DDR4, 2 × 1TB SSD (RAID 0)`
+- Cost: 75.17 USD
+- Helios:
+  ```
+    ---------------------------------------
+    Final Result for provider 3
+    url: https://ipfs.joystreamstats.live/storage/
+    fetched: 15582/15582
+    failed: 0
+    check took:  105.931s
+    ------------------------------------------
+  ```
+  
+### julysake
+
+- Worker ID: 4
+- Tokens earned: 16.5359 MJOY
+- Missed: 1.6971 MJOY
+- Location: EU
+- Storage capacity: 1.6 TB
+- Type of storage: HDD
+- Discord Name: julysake#9954
+- Config: `CPU: 10 vCPU Cores, RAM: 60 GB RAM, 1.6 TB SSD, 1 Gbit/s Port, 32 TB Traffic (100 Mbit/s)`
+- Cost: 38 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 4
+    url: https://mahathvamtv.com/storage/
+    fetched: 15582/15582
+    failed: 0
+    check took: 190.362s
+    ------------------------------------------
+  ```
+
+### vacancy (candidate nexusfallout)
+### bwhm0 
+### joystream_storage_member 
+
+### kalpakci
+
+- Worker ID: 6
+- Tokens earned: 16.7686 MJOY
+- Missed: 1.4643 MJOY
+- Location: Nuremberg (Germany)
+- Storage capacity: 1.6TB
+- Type of storage: SSD
+- Discord Name: kalpakci#4894
+- Config: `10 vCPU Cores, 60 GB RAM, 1.6 TB SSD, 1 Gbit/s Port`
+- Cost: 41.29 USD
+- Helios :
+
+    ```
+    ---------------------------------------
+    Final Result for provider 6
+    url: https://joystreampowered.com/storage/
+    fetched: 15582/15582
+    failed: 0
+    check took: 179.409s
+    ------------------------------------------
+
+    ```
+
+### maxlevush
+
+- Worker ID: 15
+- Tokens earned: 12.0893 MJOY
+- Missed: 1.6517 MJOY
+- Location: Helsinki
+- Storage capacity: 4TB
+- Type of storage: HDD
+- Discord Name: Lelik_maxi#6419
+- Config: `i7 6700 quad core, Ram : 64Gb,HDD: 2x2TB HDD`
+- Cost: 60 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 15
+    url: https://whitesocks.ru/storage/
+    fetched: 15582/15582
+    failed: 0
+    check took: 118.202s
+    ------------------------------------------
+  ```
+
+### joyval
+
+- Worker ID: 16
+- Tokens earned: 12.3795 MJOY
+- Missed: 1.3615 MJOY
+- Location: New York City
+- Storage capacity: 4TB
+- Type of storage: SSD
+- Discord Name: plycho#4165
+- Config: `Intel Xeon E3-1230v3 @3.30GHz DDR3 1600MHz 16GB Samsung 4TB SSD`
+- Cost: 102 USD
+- Helios :
+
+  ```
+    ---------------------------------------
+    Final Result for provider 16
+    url: https://joyrq.com/storage/
+    fetched: 15582/15582
+    failed: 0
+    check took: 401.258s
+    ------------------------------------------
+
+  ```
+
+### dapplooker
+
+- Worker ID: 17
+- Tokens earned: 11.9789 MJOY
+- Missed: 1.7621 MJOY
+- Location: Düsseldorf
+- Storage capacity: 4TB
+- Type of storage: HDD
+- Discord Name: napolean#8096
+- Config : `CPU AMD Ryzen™ 5 3600, RAM : 64 GB DDR4, HDD: 4TB, Connection : 1 Gbit/s`
+- Cost: 50 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 17
+    url: https://joystream.dapplooker.com/storage/
+    fetched: 15582/15582
+    failed: 0
+    check took: 121.88s
+    ------------------------------------------
+  ```
+
+### godshunter
+
+- Worker ID: 18
+- Tokens earned: 9.6211 MJOY
+- Missed: 1.5449 MJOY
+- Location: Düsseldorf
+- Storage capacity: 8TB
+- Type of storage: HDD
+- Discord Name: GodsHunter | DOUBLETOP#5319
+- Config: `Intel Core i7-6700 [4c/8t] (4.0GHz) / 64 GB DDR4 2666 MHz / 2 x 4 TБ SATA`
+- Cost: 52 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 18
+    url: https://joystream.godshunter.su/storage/
+    fetched: 15582/15582
+    failed: 0
+    check took: 128.594s
+    ------------------------------------------
+  ```
+
+### seainvestor
+
+- Worker ID: 21
+- Tokens earned: 6.3455 MJOY
+- Missed: 1.1287 kJOY
+- Location: Los Angeles, USA
+- Storage capacity: 2TB
+- Type of storage: SSD
+- Discord Name: Pavel-LV#7698
+- Config: `AMD Ryzen 5 3600; 12vCPU; 32 GB DDR4;`
+- Cost: 50 USD
+- Helios :
+
+  ```
+    ---------------------------------------
+    Final Result for provider 21
+    url: https://gloiaf.eu/storage/
+    fetched: 15582/15582
+    failed: 0
+    check took: 153.909s
+    ------------------------------------------
+  ```
+
+## Helios Output
+
+```
+Found 11 staked providers
+Resolving Provider API Endpoints
+19: Empty public Url
+Testing Provider API Endpoints
+15: https://whitesocks.ru/storage/ - OK - API version 1.1.0
+3: https://ipfs.joystreamstats.live/storage/ - OK - API version 1.1.0
+17: https://joystream.dapplooker.com/storage/ - OK - API version 1.1.0
+10: https://rome-rpc-4.joystream.org/ - OK - API version 1.1.0
+22: https://xjames.xyz/storage/ - OK - API version 1.1.0
+21: https://gloiaf.eu/storage/ - OK - API version 1.1.0
+18: https://joystream.godshunter.su/storage/ - OK - API version 1.1.0
+16: https://joyrq.com/storage/ - OK - API version 1.1.0
+6: https://joystreampowered.com/storage/ - OK - API version 1.1.0
+4: https://mahathvamtv.com/storage/ - OK - API version 1.1.0
+
+16261 created
+15582 accepted
+14462 unique accepted hashes
+
+
+
+```

+ 248 - 0
working-groups/storage-group/report_22.md

@@ -0,0 +1,248 @@
+# Storage Working Group Status Reporting - 22
+
+## Storage Lead : _0x2bc_
+
+### Report:
+
+This is the 22th report for the Storage Provider Working Group. 
+
+* One more week was completed without incidents.
+
+* KPI 28.SP-1  is finished. See Report  https://docs.google.com/document/d/1DA68jeQbcPuMEBJG-IC4od5cTVaa2VglUm2V7tXBAQc/edit?usp=sharing 
+
+## Current ipfs repo size : 1035 GB
+
+### 0x2bc
+
+- Worker ID: 22
+- Tokens earned: 10.5732 MJOY
+- Missed: 1.4354 kJOY
+- Location: France
+- Storage capacity: 1.92TB
+- Type of storage: SSD
+- Discord Name: xJames#8645 (0x2bc)
+- Config: `CPU: Intel Core i7 9700k, RAM: 64GB DDR4, Storage 2x960 Go SSD, Raid: 0 Stripping, Bandwidth: 1 Gbps`
+- Cost: 59 USD
+- Helios:
+  ```
+    ---------------------------------------
+    Final Result for provider 22
+    url: https://xjames.xyz/storage
+    fetched: 15717/15717
+    failed: 0
+    check took: 167.755s
+    ------------------------------------------
+  ```
+
+## Storage Provider Information
+
+### joystreamstats
+
+- Worker ID: 3
+- Tokens earned: 16.9320 MJOY
+- Missed: 1.5523 MJOY
+- Location: Finland
+- Storage capacity: 1.9T
+- Type of storage: SSD/NVME
+- Discord Name: freakstatic#0197 / l1dev#4675
+- Config: `CPU: AMD Ryzen™ 7 3700X Octa-Core, RAM: 64 GB DDR4, 2 × 1TB SSD (RAID 0)`
+- Cost: 75.17 USD
+- Helios:
+  ```
+    ---------------------------------------
+    Final Result for provider 3
+    url: https://ipfs.joystreamstats.live/storage/
+    fetched: 15717/15717
+    failed: 0
+    check took:  121.362s
+    ------------------------------------------
+  ```
+  
+### julysake
+
+- Worker ID: 4
+- Tokens earned: 16.7872 MJOY
+- Missed: 1.6971 MJOY
+- Location: EU
+- Storage capacity: 1.6 TB
+- Type of storage: HDD
+- Discord Name: julysake#9954
+- Config: `CPU: 10 vCPU Cores, RAM: 60 GB RAM, 1.6 TB SSD, 1 Gbit/s Port, 32 TB Traffic (100 Mbit/s)`
+- Cost: 38 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 4
+    url: https://mahathvamtv.com/storage/
+    fetched: 15717/15717
+    failed: 0
+    check took: 173.69s
+    ------------------------------------------
+  ```
+
+### vacancy (candidate nexusfallout)
+### bwhm0 
+### joystream_storage_member 
+
+### kalpakci
+
+- Worker ID: 6
+- Tokens earned: 17.0200 MJOY
+- Missed: 1.4643 MJOY
+- Location: Nuremberg (Germany)
+- Storage capacity: 1.6TB
+- Type of storage: SSD
+- Discord Name: kalpakci#4894
+- Config: `10 vCPU Cores, 60 GB RAM, 1.6 TB SSD, 1 Gbit/s Port`
+- Cost: 41.29 USD
+- Helios :
+
+    ```
+    ---------------------------------------
+    Final Result for provider 6
+    url: https://joystreampowered.com/storage/
+    fetched: 15717/15717
+    failed: 0
+    check took: 194.396s
+    ------------------------------------------
+
+    ```
+
+### maxlevush
+
+- Worker ID: 15
+- Tokens earned: 13.2280 MJOY
+- Missed: 1.6517 MJOY
+- Location: Helsinki
+- Storage capacity: 4TB
+- Type of storage: HDD
+- Discord Name: Lelik_maxi#6419
+- Config: `i7 6700 quad core, Ram : 64Gb,HDD: 2x2TB HDD`
+- Cost: 60 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 15
+    url: https://whitesocks.ru/storage/
+    fetched: 15717/15717
+    failed: 0
+    check took: 129.201s
+    ------------------------------------------
+  ```
+
+### joyval
+
+- Worker ID: 16
+- Tokens earned: 13.2280 MJOY
+- Missed: 1.3615 MJOY
+- Location: New York City
+- Storage capacity: 4TB
+- Type of storage: SSD
+- Discord Name: plycho#4165
+- Config: `Intel Xeon E3-1230v3 @3.30GHz DDR3 1600MHz 16GB Samsung 4TB SSD`
+- Cost: 102 USD
+- Helios :
+
+  ```
+    ---------------------------------------
+    Final Result for provider 16
+    url: https://joyrq.com/storage/
+    fetched: 15717/15717
+    failed: 0
+    check took: 181.123s
+    ------------------------------------------
+
+  ```
+
+### dapplooker
+
+- Worker ID: 17
+- Tokens earned: 12.2303 MJOY
+- Missed: 1.7621 MJOY
+- Location: Düsseldorf
+- Storage capacity: 4TB
+- Type of storage: HDD
+- Discord Name: napolean#8096
+- Config : `CPU AMD Ryzen™ 5 3600, RAM : 64 GB DDR4, HDD: 4TB, Connection : 1 Gbit/s`
+- Cost: 50 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 17
+    url: https://joystream.dapplooker.com/storage/
+    fetched: 15717/15717
+    failed: 0
+    check took: 121.226s
+    ------------------------------------------
+  ```
+
+### godshunter
+
+- Worker ID: 18
+- Tokens earned: 9.8725 MJOY
+- Missed: 1.5449 MJOY
+- Location: Düsseldorf
+- Storage capacity: 8TB
+- Type of storage: HDD
+- Discord Name: GodsHunter | DOUBLETOP#5319
+- Config: `Intel Core i7-6700 [4c/8t] (4.0GHz) / 64 GB DDR4 2666 MHz / 2 x 4 TБ SATA`
+- Cost: 52 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 18
+    url: https://joystream.godshunter.su/storage/
+    fetched: 15717/15717
+    failed: 0
+    check took: 142.424s
+    ------------------------------------------
+  ```
+
+### seainvestor
+
+- Worker ID: 21
+- Tokens earned: 6.5969 MJOY
+- Missed: 1.1287 kJOY
+- Location: Los Angeles, USA
+- Storage capacity: 2TB
+- Type of storage: SSD
+- Discord Name: Pavel-LV#7698
+- Config: `AMD Ryzen 5 3600; 12vCPU; 32 GB DDR4;`
+- Cost: 50 USD
+- Helios :
+
+  ```
+    ---------------------------------------
+    Final Result for provider 21
+    url: https://gloiaf.eu/storage/
+    fetched: 15717/15717
+    failed: 0
+    check took: 140.81s
+    ------------------------------------------
+  ```
+
+## Helios Output
+
+```
+Found 11 staked providers
+Resolving Provider API Endpoints
+19: Empty public Url
+Testing Provider API Endpoints
+15: https://whitesocks.ru/storage/ - OK - API version 1.1.0
+3: https://ipfs.joystreamstats.live/storage/ - OK - API version 1.1.0
+17: https://joystream.dapplooker.com/storage/ - OK - API version 1.1.0
+10: https://rome-rpc-4.joystream.org/ - OK - API version 1.1.0
+22: https://xjames.xyz/storage/ - OK - API version 1.1.0
+21: https://gloiaf.eu/storage/ - OK - API version 1.1.0
+18: https://joystream.godshunter.su/storage/ - OK - API version 1.1.0
+16: https://joyrq.com/storage/ - OK - API version 1.1.0
+6: https://joystreampowered.com/storage/ - OK - API version 1.1.0
+4: https://mahathvamtv.com/storage/ - OK - API version 1.1.0
+
+16396 created
+15717 accepted
+14584 unique accepted hashes
+
+
+
+```

+ 248 - 0
working-groups/storage-group/report_23.md

@@ -0,0 +1,248 @@
+# Storage Working Group Status Reporting - 23
+
+## Storage Lead : _0x2bc_
+
+### Report:
+
+This is the 23th report for the Storage Provider Working Group. 
+
+* One more week was completed without incidents.
+
+* The work on testing Giza release & Storage v2 has started 
+
+## Current ipfs repo size : 1060 GB
+
+### 0x2bc
+
+- Worker ID: 22
+- Tokens earned: 13.1334 MJOY
+- Missed: 1.4354 kJOY
+- Location: France
+- Storage capacity: 1.92TB
+- Type of storage: SSD
+- Discord Name: xJames#8645 (0x2bc)
+- Config: `CPU: Intel Core i7 9700k, RAM: 64GB DDR4, Storage 2x960 Go SSD, Raid: 0 Stripping, Bandwidth: 1 Gbps`
+- Cost: 59 USD
+- Helios:
+  ```
+    ---------------------------------------
+    Final Result for provider 22
+    url: https://xjames.xyz/storage
+    fetched: 15925/15925
+    failed: 0
+    check took: 146.247s
+    ------------------------------------------
+  ```
+
+## Storage Provider Information
+
+### joystreamstats
+
+- Worker ID: 3
+- Tokens earned: 17.2760 MJOY
+- Missed: 1.5523 MJOY
+- Location: Finland
+- Storage capacity: 1.9T
+- Type of storage: SSD/NVME
+- Discord Name: freakstatic#0197 / l1dev#4675
+- Config: `CPU: AMD Ryzen™ 7 3700X Octa-Core, RAM: 64 GB DDR4, 2 × 1TB SSD (RAID 0)`
+- Cost: 75.17 USD
+- Helios:
+  ```
+    ---------------------------------------
+    Final Result for provider 3
+    url: https://ipfs.joystreamstats.live/storage/
+    fetched: 15925/15925
+    failed: 0
+    check took:  113.811s
+    ------------------------------------------
+  ```
+  
+### julysake
+
+- Worker ID: 4
+- Tokens earned: 17.1312 MJOY
+- Missed: 1.6971 MJOY
+- Location: EU
+- Storage capacity: 1.6 TB
+- Type of storage: HDD
+- Discord Name: julysake#9954
+- Config: `CPU: 10 vCPU Cores, RAM: 60 GB RAM, 1.6 TB SSD, 1 Gbit/s Port, 32 TB Traffic (100 Mbit/s)`
+- Cost: 38 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 4
+    url: https://mahathvamtv.com/storage/
+    fetched: 15925/15925
+    failed: 0
+    check took: 194.99s
+    ------------------------------------------
+  ```
+
+### vacancy (candidate nexusfallout)
+### bwhm0 
+### joystream_storage_member 
+
+### kalpakci
+
+- Worker ID: 6
+- Tokens earned: 17.3639 MJOY
+- Missed: 1.4643 MJOY
+- Location: Nuremberg (Germany)
+- Storage capacity: 1.6TB
+- Type of storage: SSD
+- Discord Name: kalpakci#4894
+- Config: `10 vCPU Cores, 60 GB RAM, 1.6 TB SSD, 1 Gbit/s Port`
+- Cost: 41.29 USD
+- Helios :
+
+    ```
+    ---------------------------------------
+    Final Result for provider 6
+    url: https://joystreampowered.com/storage/
+    fetched: 15925/15925
+    failed: 0
+    check took: 182.03s
+    ------------------------------------------
+
+    ```
+
+### maxlevush
+
+- Worker ID: 15
+- Tokens earned: 12.6846 MJOY
+- Missed: 1.6517 MJOY
+- Location: Helsinki
+- Storage capacity: 4TB
+- Type of storage: HDD
+- Discord Name: Lelik_maxi#6419
+- Config: `i7 6700 quad core, Ram : 64Gb,HDD: 2x2TB HDD`
+- Cost: 60 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 15
+    url: https://whitesocks.ru/storage/
+    fetched: 15925/15925
+    failed: 0
+    check took: 130.89s
+    ------------------------------------------
+  ```
+
+### joyval
+
+- Worker ID: 16
+- Tokens earned: 12.9748 MJOY
+- Missed: 1.3615 MJOY
+- Location: New York City
+- Storage capacity: 4TB
+- Type of storage: SSD
+- Discord Name: plycho#4165
+- Config: `Intel Xeon E3-1230v3 @3.30GHz DDR3 1600MHz 16GB Samsung 4TB SSD`
+- Cost: 102 USD
+- Helios :
+
+  ```
+    ---------------------------------------
+    Final Result for provider 16
+    url: https://joyrq.com/storage/
+    fetched: 15925/15925
+    failed: 0
+    check took: 215.253s
+    ------------------------------------------
+
+  ```
+
+### dapplooker
+
+- Worker ID: 17
+- Tokens earned: 12.5742 MJOY
+- Missed: 1.7621 MJOY
+- Location: Düsseldorf
+- Storage capacity: 4TB
+- Type of storage: HDD
+- Discord Name: napolean#8096
+- Config : `CPU AMD Ryzen™ 5 3600, RAM : 64 GB DDR4, HDD: 4TB, Connection : 1 Gbit/s`
+- Cost: 50 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 17
+    url: https://joystream.dapplooker.com/storage/
+    fetched: 15925/15925
+    failed: 0
+    check took: 122.63s
+    ------------------------------------------
+  ```
+
+### godshunter
+
+- Worker ID: 18
+- Tokens earned: 10.2164 MJOY
+- Missed: 1.5449 MJOY
+- Location: Düsseldorf
+- Storage capacity: 8TB
+- Type of storage: HDD
+- Discord Name: GodsHunter | DOUBLETOP#5319
+- Config: `Intel Core i7-6700 [4c/8t] (4.0GHz) / 64 GB DDR4 2666 MHz / 2 x 4 TБ SATA`
+- Cost: 52 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 18
+    url: https://joystream.godshunter.su/storage/
+    fetched: 15925/15925
+    failed: 0
+    check took: 133.666s
+    ------------------------------------------
+  ```
+
+### seainvestor
+
+- Worker ID: 21
+- Tokens earned: 6.9408 MJOY
+- Missed: 1.1287 kJOY
+- Location: Los Angeles, USA
+- Storage capacity: 2TB
+- Type of storage: SSD
+- Discord Name: Pavel-LV#7698
+- Config: `AMD Ryzen 5 3600; 12vCPU; 32 GB DDR4;`
+- Cost: 50 USD
+- Helios :
+
+  ```
+    ---------------------------------------
+    Final Result for provider 21
+    url: https://gloiaf.eu/storage/
+    fetched: 15925/15925
+    failed: 0
+    check took: 168.837s
+    ------------------------------------------
+  ```
+
+## Helios Output
+
+```
+Found 11 staked providers
+Resolving Provider API Endpoints
+19: Empty public Url
+Testing Provider API Endpoints
+15: https://whitesocks.ru/storage/ - OK - API version 1.1.0
+3: https://ipfs.joystreamstats.live/storage/ - OK - API version 1.1.0
+17: https://joystream.dapplooker.com/storage/ - OK - API version 1.1.0
+10: https://rome-rpc-4.joystream.org/ - OK - API version 1.1.0
+22: https://xjames.xyz/storage/ - OK - API version 1.1.0
+21: https://gloiaf.eu/storage/ - OK - API version 1.1.0
+18: https://joystream.godshunter.su/storage/ - OK - API version 1.1.0
+16: https://joyrq.com/storage/ - OK - API version 1.1.0
+6: https://joystreampowered.com/storage/ - OK - API version 1.1.0
+4: https://mahathvamtv.com/storage/ - OK - API version 1.1.0
+
+16604 created
+15925 accepted
+14760 unique accepted hashes
+
+
+
+```

+ 252 - 0
working-groups/storage-group/report_24.md

@@ -0,0 +1,252 @@
+# Storage Working Group Status Reporting - 24
+
+## Storage Lead : _0x2bc_
+
+### Report:
+
+This is the 24th report for the Storage Provider Working Group. 
+
+* One more week was completed without incidents.
+
+* The work on testing Giza release & Storage v2 is in progress. 
+
+* "Quantitative" Storage OKRs are developed and submitted to the Council https://testnet.joystream.org/#/proposals/826
+
+* Start tranfering of storage provider (ID=22) to a higher performance server
+
+## Current ipfs repo size : 1094 GB
+
+### 0x2bc
+
+- Worker ID: 22
+- Tokens earned: 14.3851 MJOY
+- Missed: 1.9475 kJOY
+- Location: France
+- Storage capacity: 1.92TB
+- Type of storage: SSD
+- Discord Name: xJames#8645 (0x2bc)
+- Config: `CPU: Intel Core i7 9700k, RAM: 64GB DDR4, Storage 2x960 Go SSD, Raid: 0 Stripping, Bandwidth: 1 Gbps`
+- Cost: 59 USD
+- Helios:
+  ```
+    ---------------------------------------
+    Final Result for provider 22
+    url: https://xjames.xyz/storage
+    fetched: 16375/16375
+    failed: 0
+    check took: 144.726s
+    ------------------------------------------
+  ```
+
+## Storage Provider Information
+
+### joystreamstats
+
+- Worker ID: 3
+- Tokens earned: 17.5802 MJOY
+- Missed: 1.6581 MJOY
+- Location: Finland
+- Storage capacity: 1.9T
+- Type of storage: SSD/NVME
+- Discord Name: freakstatic#0197 / l1dev#4675
+- Config: `CPU: AMD Ryzen™ 7 3700X Octa-Core, RAM: 64 GB DDR4, 2 × 1TB SSD (RAID 0)`
+- Cost: 75.17 USD
+- Helios:
+  ```
+    ---------------------------------------
+    Final Result for provider 3
+    url: https://ipfs.joystreamstats.live/storage/
+    fetched: 16375/16375
+    failed: 0
+    check took:  123.114s
+    ------------------------------------------
+  ```
+  
+### julysake
+
+- Worker ID: 4
+- Tokens earned: 17.4222 MJOY
+- Missed: 1.8161 MJOY
+- Location: EU
+- Storage capacity: 1.6 TB
+- Type of storage: HDD
+- Discord Name: julysake#9954
+- Config: `CPU: 10 vCPU Cores, RAM: 60 GB RAM, 1.6 TB SSD, 1 Gbit/s Port, 32 TB Traffic (100 Mbit/s)`
+- Cost: 38 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 4
+    url: https://mahathvamtv.com/storage/
+    fetched: 16375/16375
+    failed: 0
+    check took: 211.7s
+    ------------------------------------------
+  ```
+
+### vacancy (candidate nexusfallout)
+### bwhm0 
+### joystream_storage_member 
+
+### kalpakci
+
+- Worker ID: 6
+- Tokens earned: 17.6682 MJOY
+- Missed: 1.5701 MJOY
+- Location: Nuremberg (Germany)
+- Storage capacity: 1.6TB
+- Type of storage: SSD
+- Discord Name: kalpakci#4894
+- Config: `10 vCPU Cores, 60 GB RAM, 1.6 TB SSD, 1 Gbit/s Port`
+- Cost: 41.29 USD
+- Helios :
+
+    ```
+    ---------------------------------------
+    Final Result for provider 6
+    url: https://joystreampowered.com/storage/
+    fetched: 16375/16375
+    failed: 0
+    check took: 182.03s
+    ------------------------------------------
+
+    ```
+
+### maxlevush
+
+- Worker ID: 15
+- Tokens earned: 12.9756 MJOY
+- Missed: 1.7708 MJOY
+- Location: Helsinki
+- Storage capacity: 4TB
+- Type of storage: HDD
+- Discord Name: Lelik_maxi#6419
+- Config: `i7 6700 quad core, Ram : 64Gb,HDD: 2x2TB HDD`
+- Cost: 60 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 15
+    url: https://whitesocks.ru/storage/
+    fetched: 16375/16375
+    failed: 0
+    check took: 130.89s
+    ------------------------------------------
+  ```
+
+### joyval
+
+- Worker ID: 16
+- Tokens earned: 13.2790 MJOY
+- Missed: 1.4674 MJOY
+- Location: New York City
+- Storage capacity: 4TB
+- Type of storage: SSD
+- Discord Name: plycho#4165
+- Config: `Intel Xeon E3-1230v3 @3.30GHz DDR3 1600MHz 16GB Samsung 4TB SSD`
+- Cost: 102 USD
+- Helios :
+
+  ```
+    ---------------------------------------
+    Final Result for provider 16
+    url: https://joyrq.com/storage/
+    fetched: 16375/16375
+    failed: 0
+    check took: 176.798s
+    ------------------------------------------
+
+  ```
+
+### dapplooker
+
+- Worker ID: 17
+- Tokens earned: 12.8652 MJOY
+- Missed: 1.8812 MJOY
+- Location: Düsseldorf
+- Storage capacity: 4TB
+- Type of storage: HDD
+- Discord Name: napolean#8096
+- Config : `CPU AMD Ryzen™ 5 3600, RAM : 64 GB DDR4, HDD: 4TB, Connection : 1 Gbit/s`
+- Cost: 50 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 17
+    url: https://joystream.dapplooker.com/storage/
+    fetched: 16375/16375
+    failed: 0
+    check took: 139.915s
+    ------------------------------------------
+  ```
+
+### godshunter
+
+- Worker ID: 18
+- Tokens earned: 10.5074 MJOY
+- Missed: 1.6640 MJOY
+- Location: Düsseldorf
+- Storage capacity: 8TB
+- Type of storage: HDD
+- Discord Name: GodsHunter | DOUBLETOP#5319
+- Config: `Intel Core i7-6700 [4c/8t] (4.0GHz) / 64 GB DDR4 2666 MHz / 2 x 4 TБ SATA`
+- Cost: 52 USD
+- Helios :
+  ```
+    ---------------------------------------
+    Final Result for provider 18
+    url: https://joystream.godshunter.su/storage/
+    fetched: 16375/16375
+    failed: 0
+    check took: 141.523s
+    ------------------------------------------
+  ```
+
+### seainvestor
+
+- Worker ID: 21
+- Tokens earned: 7.2451 MJOY
+- Missed: 1.2345 kJOY
+- Location: Los Angeles, USA
+- Storage capacity: 2TB
+- Type of storage: SSD
+- Discord Name: Pavel-LV#7698
+- Config: `AMD Ryzen 5 3600; 12vCPU; 32 GB DDR4;`
+- Cost: 50 USD
+- Helios :
+
+  ```
+    ---------------------------------------
+    Final Result for provider 21
+    url: https://gloiaf.eu/storage/
+    fetched: 16375/16375
+    failed: 0
+    check took: 134.99s
+    ------------------------------------------
+  ```
+
+## Helios Output
+
+```
+Found 11 staked providers
+Resolving Provider API Endpoints
+19: Empty public Url
+Testing Provider API Endpoints
+15: https://whitesocks.ru/storage/ - OK - API version 1.1.0
+3: https://ipfs.joystreamstats.live/storage/ - OK - API version 1.1.0
+17: https://joystream.dapplooker.com/storage/ - OK - API version 1.1.0
+10: https://rome-rpc-4.joystream.org/ - OK - API version 1.1.0
+22: https://xjames.xyz/storage/ - OK - API version 1.1.0
+21: https://gloiaf.eu/storage/ - OK - API version 1.1.0
+18: https://joystream.godshunter.su/storage/ - OK - API version 1.1.0
+16: https://joyrq.com/storage/ - OK - API version 1.1.0
+6: https://joystreampowered.com/storage/ - OK - API version 1.1.0
+4: https://mahathvamtv.com/storage/ - OK - API version 1.1.0
+
+17058 created
+16375 accepted
+15196 unique accepted hashes
+
+
+
+```

Some files were not shown because too many files changed in this diff