closures 0.7.1 → 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -1,3 +1,53 @@
1
1
  # closures
2
2
 
3
- This is a fork of [petit-dom](https://github.com/yelouafi/petit-dom) by Yassine Elouafi, but with added "closure components" inspired by [Mithril.js](https://mithril.js.org/components.html#closure-component-state). For more thorough documentation, checkout the README for `petit-dom`. **This is experimental and not well-tested, so I recommend using Mithril.js or Preact instead.**
3
+ This is a fork of [petit-dom](https://github.com/yelouafi/petit-dom) by Yassine Elouafi, but with object components replaced with "closure components" inspired by [Mithril.js](https://mithril.js.org/components.html#closure-component-state).
4
+
5
+ ```js
6
+ const { h, app, onRemove } = closures;
7
+
8
+ function App() {
9
+ return (
10
+ h('div.monospace',
11
+ h('h1', 'A simple app'),
12
+ h(Counter, { initialCount: 0 })
13
+ )
14
+ );
15
+ }
16
+
17
+ // simple components
18
+ function Double({ count }) {
19
+ return h('h2', count * 2);
20
+ }
21
+
22
+ // stateful components
23
+ function Counter({ initialCount }) {
24
+ let count = initialCount;
25
+
26
+ onRemove(() => {
27
+ console.log('Unmounted Counter');
28
+ });
29
+
30
+ return () => [
31
+ h('h2', count),
32
+ h('h3', 'doubled:'),
33
+ h(Double, { count }),
34
+ h('button', { onclick: () => count += 1 }, 'increment')
35
+ ];
36
+ }
37
+
38
+ app(h(App), document.body);
39
+ ```
40
+
41
+ ## Install
42
+
43
+ ```bash
44
+ npm install closures
45
+ ```
46
+
47
+ ## Examples
48
+
49
+ [Counter Example](https://flems.io/#0=N4IgZglgNgpgziAXAbVAOwIYFsZJAOgAsAXLKEAGhAGMB7NYmBvEAXwvW10QICsEqdBk2J4hcYgAJgkwhUkYADovn0ASjCy0AbjEmtJAXknUotOAFcATvADcAHTSOwFtNWIR6kgILKAFACU0o6SkjbE1miSfiGhsn4A5AAmENr4WmjmihjUMAkUsXHxCYQAjPmSCd6ScBBYirAKygkBBVFF8QDCtK6MVvIyEGgQHhhQ3b2IkgAM+gGFkvPtAQ5orI6OAPSbNXUNenT19CJwzq7unlEAIj0ARrB+MnS9c8Ht4ZHFhABMFc8MkgAVJJvitHOsnGhtjViBhGC4oCZaEc0Cczm4PF4JsIrI9JEMRhAxtipKwgsBYrApP8pMYCaNxj0GKtYupNDoYH5AkYAHxvIriWiwfBmADmiQAqmgtL0YElJCSYFYWqtQmSWe8YBErFFuYY+cgFoREj8-kziK0jSaAMwVZJ3WBJRAtNpFY03Cz3GADJEvMmuuLGhK3CzEYj0CoyeimCDUADWUz1fJpkgA1MZSvp5AkhtQbDgGC1YgBdVYQxxKRR+Y2+RStSRJWjUCwF4j4W60JIATxWlBAcBgsAu9AQPGmiGmAFprd9EN8AOxsDggTA4PD4ahwAQ0eiMZg8dL0LI5PQyMC7ydgbDQLtTDLH3K2fR9gdDzFoUcgcfWgBsbGLVBQEMcajqgK5cGIZiWDY27WOQPAkMQihwIg2yuIocaihuyKbKY5jWPAAAC0z4PO+DfJsKQSLhUEEXA6RDPg-B9sQXaKNw-Z5hAiiiFQ2TENQhDwEgyCidMVCGKUFDUIYwDsCAAHIJOUngApFDICpCCKeJICGPYICIYoqFqaU84UKZFAACylJZVk2YpyA6Wgcb6VQinKVQWnqSpYBqY5EnAHAhC0AA7jw7k+X5ml+TpFA5KIAEWRZlkAKxSalpQOTpcIwOF6keapinRdpVAUIQNhgHlSmRUVnkxVQ7CEIYJk-uZrWWT+ACcVldVlVAwPg2isexbn5SpAD6UVUHG9W6TA+owAAZIt3wmWZFnzpZ4mbdMfUgN8hiHQNQ1sd6fkFTNtUgJNJVzfqwBUpIxCGLgAHfClFDvRQ84pa1P0-ntEBgH4AAch2GBaHw6pI50qZd3lUDd6k6X4A2CdASQaGAKxA34anWtaFAExQIOlOJpO7ep-kgAEUNRLD01Tdds2oxuhAY2t5lmSDlkgyTvN7amXaowEATyRFVAAKJM2os0vfdVKcxZnXTLZKuWYDwNg4dkNap8DMgNLV2y7drPo1AmMwNjti4-jhPE51P6tY7ANUzptN69DBtGwjIAm8jVBm+zFtK+t0yq+Z4ca27VBCyLYujdVVD+xpVAAMpy6jFDEBQVgBKHkfznzZNF3tWvg2g+cS37TMZ6b3ptujBelKUaXma3mUxyAorEIQthoKmqZV2Nye1yzDdsxAzfvetM97WgAF56w4sjyAde+z71OGFnFr6tPIPiaU3wH2XoPg3nBvr6nhvj9nk-N9avPmY-IN7T3fdWIPw9J2vTObyjE8m6JXWutVK3xzJgL2rnCgld7pM30qYDAW4AByXB9Lg2IMtPwz0EFQCQacGmicdIAEJpjnwAPyvTalZD6NkQagPoXtTkFpEBoGWgbLy19fK3WQMQYslD8ADmbilH65kREpUBiGRgyC0542rpwmqAcQC8IAjnC+wCuZiM6utFK2imHYNzgnA2AAVJmAA1TO3o0AUAgKNJK60fzHzasfJhMCbHSUTgVbhvtOE6UMHnBWVD7FtWtN1UoP5Ql7QCIEqQHCmbeK3sAPC0Fm4-hSofNJlMxJUDQBoLQugqpeKZr4hqNtgbaFRqknmbUeZ7T8BUmAos6bAHwK0uJV0EmxWGrlKSmQki5UbNQO2RNCbhO0W1PRXc-BYHjs01p+B2m+06aVbpiBemdgGU2YZxNTI-ikrszu2SDIYxsGgQpKlTFXQsabWgk8Q4aIst8b41oPpPJeXtSQUBiE63YdXFOKkr4o36FAVoXIC5PLSZ9b4aS6n9FoDA1oLS2nyPibNbOp01kwI2WpL6uKXmtWeb9KJVh8CKAsEFORq9Lm+2uUo1GKiEXgsstaMy3xmXziibYOZyLV4KKoMsygqzbLmxxa815qVbJspStHI5ZyrDL1ttXJG194bU3jg9LUTKQbgLZdq+eMAQqSAALJKE8Yo6+JTdK3MULQKsw9gnvXSZ9FK6SoHUBWI9RZXC5YDXGsQLlQSQHOs6jq3R3w9rPRziY8xt9rG2I4RQBJPkKCWrFjYEyYTurQseXsjlXc02ezQEihZKKOlotWXzEVb0xWfQiTqute1g6W0qtGq5LMc6V2koQcFaTJW9ojZEYtXrzVdIxSpB5rL5zTAJVO12sqNn6SMdXWl19biWOgZXcFFNPoUyYWgb5ENfmrxXSpNd9dSVWFtV5B1nVLJZtvZ1N+vdbDEC-gbE9VAz10pgAyklBdrTTCeUTQD4au6DgHPiYGBtlVw3HqLDVCVNEWQA9K4D0qmGtAgIEVo76mZfrVSS82SR-1jKJmMvaPIEOSFoM1auABJJm3hb5qJgf+p54CZxPKiXAv5Y967ZzNYzK6yqgWi0E7-K6-9A7eisDiqS3wpIzkhUpiRUzvTws7bhq6+GgVuIgKLNjINuoziM1A-TrRaArx-gxq6THbrbxk24-9AGOMub2rQWwj1qDiaTXVW6ZS-BVloPaoNBMREjJEXtZJBEfPFLlrc6LznSYjNJntOjSQcNKqZqq0TR6f4waE3Syui0TK0I+o-cORMtpZOpvgP1AAfer1A8tFKuqmgIVHEPBMfl9HrqmjnED8O6m2LXzXFSUVg56EB8Cin-alVqj8iVdymzNrUlKf6+f7LNUWWC0AQzmz+Pmj9Dt7Qhh6rUMNS1LLlmgPwJLFCXrmyDe2vNrRRLKrR1edGs58pAN4LOAqKAJZMqM+26SOPg72hbNOsJGDnL89d26rBEB+AS+zf9KVntE0x29ru0PYfzWHfytFwXWC4zQP+n8lXfzhz2qcz7P9qXXxXSjWxGXxP-PTizW5FPEqtXCVZb407BfTojSIPSIBXJad9jp6TQP74TsF1TpXNWdJSCgBQJIHiDZgBTcUxNaK5AWAoCoDAGbzLdXm+lX6hzqZG5N3FBnBVN4qRTqz1oXZDDeFk4r1K85CZ+9x0cpg78CpZaujliSaARQh660GjqAGeoAb2gAHkMKKZaWA0-Qey7NWwARcbaGQFgAuHVwtl7zUcs7hfkA54j7NYsB6LRA1Lz+ecZkOrt7qTJNAxeAI67i-ZqwyAQoAWa6329PVb17QAnAfxI+x+jf5ctTbcBlqWvwHGGAnvDrUE39vnFfMnGWSneJE-tOu67-3z2InhUlGGCL1gACTVS-zgU1ZN-tvYpNS7AvwwAAPLOHXDxX7OADxQHYLCgEKQeCgLAQeWwHFe9D-F5ZA-ramHvWvJVACTbOMWfOWYfWbRKcBI+D-N-Ug0DI5AgxfErauMAFfYpdfWaa-cGIZN6cSIXD-ZLE-VLLuLfG-eRB-ZAArcAQQyPNSF-RKUHKyA+cBXmQDPaQAs6WgkA-XbzCA1oUUScSccTYQsQrQ2wKhIDIDXmDgkw1XKgCwWSVgTzbPcPX2MQzzL+HvUvEGCJaQiJU7EFBA2gwfe-YfUfTXJ3HyegtrRg26a-OTT6dKFWDvGIvaLsJvchCwTA1eVfJgvg4sRAKNX3ENWIhcbvQwXvJIfvK7b1ezIvYoj7UvTqJ1O9V1LuP-A2b7b0XXbzX7f7b0MAtQknTLVeTnCTb9MqcTVVCaFmR-Q-HdKyR2PmO9E7LuQgA9DhLBWRTo1oMxIbPXDpLBSWAHVoW4DY9Q4eNlT6WydJSrM48w5RUfIIqgYxPwTbdYy1IHXon+fowFOXOQA2EYxGMY4vHFHVcBdJFlCgIEyvamQeVgcDPQOvew2afQqEy7JDMydJSFFEtAnSWPQgZSchL4pmETQOX-UUVMTKELTRdJcZcksEnSEKNPUUfPCQqlGNU2fwgCYLAuNKCyDkqk0qX-a4z43jK6d4kALOOQOsOxINNKR+EE0oR+PaWwLPG466fPX7OMfPAVQQp-cTX7AVJvLBS+H7NYv+XYigWXYU3vTU2-Q4tSayOyaU3RO0x9LufpfxZ4+HEAJnFSFnQOfoDLaw7xYJFKBcVqQM+cOdamc4d8REn+fDFSToW+eZdRJEkE74TqQmQM1MunDrR6XnX2GxfAxyUsFvPncyPmFKADUs8szWPwYhA2HM6+KeW6RrYhKsWspmBspRAIRrDAdbAqSuRrOslSfTRrds2rBrerVsq6EcnSC9K9HE6uAcqgKciSagRAH3ImYzbqMs44rcmVamIKIGQbF43sts-AmPNAHudk38U4q8vdd+HkUochIdeck826LtE5JgVc1gUVZ1EEllZEv8p9QgR8+ZCc32JcygIjdNRXaVEgmCig6mXaZHUC+stFCwEWA2LMi7RDa+ZaAAPz8DrL8QGnbPf1KE3OZTTIor2n0nwEXQNgC1wuwpUm-ndiowNjXOvmwqIsEUiIF2lXtP4sdOD0ESAlyB7JUiYpyVmmJICHwBsAaHZJP0BKUo+UXW8NXgXJAHAo3DwS3EVM0u0sQS3DnNXg4okukv0kkH0m-K+hdXOLOMBnPPEqksnKYKMrgACDdLMqoC4tKnmiCWLlLPTJBPTP0R0mrkkpXG2y-Orn8sa30hSG0H0hiqUUVQ0pfKUWv2+WQsHPSIPwAmJiAxdUDJCsDPiLUs9WrhHJUloDljQsaXIVKDygDKp2DNar2nIVnH9TSp-mqqoFqvsx1gCF7jXJavC1+kiy7iLROnYjdL6pAAGqUQoD9UQG9C33ZPnBshBM2t3LV1WooD4LdIMryq7BN0e2grfw+hEXenc2QiOuXhjMXOXjjPCPCBMmIMBM2ikhEWsgjQwCGHlh5ANkepABerpXQTUroA2pKvEXgqcgkCjIKm8EMBBoAHFDAwbqYDD8AAAxEyfZb60Mzcom+eCgAaA2JqW4Mm9IL3amtkfJfy-Ua1clY0Rpam05fpbykASsOWFwHMp1FuEEg+cSTHC-I5LOLmmBKw7bNi+coHJmeFcgezJFTmIq0mYM9WunDAMKA2UodgJW32aPLADANACwMYDQJIKwbW9gYjIffAAAEgNntoAAVJZjE6NjFxorgAB5I1caNQSWHGzzDBchAiwwO49TVoEle2l2t2j2r232-2wO2SCqVhCgbQPpXKGAdgElRgf-YgboYQBgCXVyNQO7NxC0TyvwKAOSq2AA8u70GujOjZCgGuiqZ41uwaTOl6BOAaKwVwQwPm4cW7RzPbOSTCqQRW2SeZWxeZNYQI6O2O92z2n2v2gOoOnqiadegLGulIGwC4XQOfYtXeiAfejwQ+igOe-APemAA++ARrOSKzHSJIRYt6UoPmEGUskGJ1THeo4PbUKIGjVtGlW+EFQI9kzqIzEEyBoSreaOp2125ehOo1WaJOvGxKD+igKnaYD6bB9Eny8XfSKXAU32IU8u+FC0cUzRKnUJLB6YSJLuWuy27WxUyK7BHuuWSjJIWu-01lKSKncLAR7kkACqeu-oA2KhTitFbh5u-pAuKnURBR-BkAbh9ukFA2ZeJmTXLujZCGZeampqToamrAQwVGum3JdkXQQG5milRpWaMkXsRKWyZXKnVMuhjM-vV8W+98T8ccPZMs-8VgIAA)
50
+
51
+ [Todo List](https://flems.io/#0=N4IgtglgJlA2CmIBcA2AjAOgEwFYA0IAZhAgM7IDaoAdgIZiJIgYAWALmLCAQMYD21NvEHIQAHigQAbgAJoAXgA6IWgAdVygHyLqMmTrEB6SVM3cQpeAh5sIA8kzRIsIAL54a9RswBW5XgJCIkz81KRsMsAyLHgyaqqxAgBK8GB8UvAyrjLyMjywfKQArgBO8KQA3Do6CBFsfFCFOTIUOnpRjdTwSDKEtLCWsUIAHmw9AORgtADWmbS9CGCkMvDD9KoI41l4bZEynd29-YMyI2My4wDutKQspyyZkrflW+67HQKHfQPwQ6vnV3603ujz4AHNSK8dABdKrUHSEIrUGx2XS0GAACgAlJFdvVGqQMKoircMcBdnoDj1viczhNxjtdFksXDXNVqIjkbYBHkELQStjcUz8U1ciLCcRYEIBRF5JoZABCNgYA4snRs+EcpEonkAQXUgvJTNqMjKUwg1AtYOa4owkulGNl8qVKs+WIwCGoYLYLAqenZejKbFKuhYGPGJgwaWohVUtB48AZFNODUKUbUjtTOW0TL0ejDEekSdzefz4YtxOV0dj8cTsSNpcbpwAnqpDuMeA8eNMAEZ8YbFpulzvwbvwKA9EWurqMod5gSd2hew5k078sHwCKuHFyoVz0tTg429ebjAjsdQOH7rLJ0vbxm3vMFitFKsCGsJhl7-dsVvts6DvuGy1iwfCwFA8AlBMlwsLQERdOOyz1DIPagl0AD8gFzk8tA9ggE4po006-I+pZSP0RSHFOZyzvuAgvucq5sCeW47vK1H-MeJQbsq5GwJRpHMo+WLJlitH+iWBaqF+Zq0BaVoyAA1BcpqpHJlpehg4xicmBY9q+9TUF+UQLrAEDdj06JQNsFxWdp4nROG+lsIZxkyKZ5nTD0+TwPyNkdnyJTabsarUBqOjxBiYb6qoYn7HwPBFAwggYDxACiizCGwABCzYAJJQOG8TaSy5iWNY3JhKIWAAAxIDVbgeCAdAMKIZ6kP4IChEEbBtdWpBxgmeyEIEAC0fSQLAzY9P1g3wH6rhlVYo6VQ4IB1QAzCgbjQgQZnUNMDhUM1XiiPkhSlOU5ilFwTDsGwqikEghiGEiqjTGCZ58GAhjncUZSkAAAjVGAAOzYMYEDhL9BT-eUUYWhgfjmL+baiKQPAlBAqi9QQcZsCOR0UBQNUEPIaB4Dw8jAO4IC7RQo0U0QdN4BQTPkPTpMgEoID3aoz0s2goN4ELeAACxoGL4uS-TJMEAdygEPTjMEBzrNM4QLNy9zwC3HwlxMMrGta+zWtc3g8a9btoui2LOAU3baCy1zcHdFrKvM-TpucwQeAsGUhCG6zHua17qtmwQ7gsPIgsoCLcdiygACc4vJ87BDwBgUio787tMwA+ibBDTBH3PwHK8AAGSVy41vC6LoNi6Tjc1enIBYPIneZ9nf5K8HTMl2HICFz7ZdysAJpsPIiC7bgeBz6DOBx4vKBtxAhAYgAHJ38hsFiQYhjIefF0Xw+lximediQUApIQLLrxiLMbRteDP3gm9oKTH+t6z2v75uh9j4gEHurAgI9WZcwvmeFg19Bb12FpvMWm935ILbopZsF8sRYlpkbAgaVT5JFLtPcetQ4Ei2FknGqUtKFizXhvbenc94HxKLoIB+Ch6ENHlAq+4Fb73w3k-F+b8k4oDjiI1ev8ub-2DCwo+uCQDsNASAThECCDcJgeBMhNsapUJFjo2hkiCDoMwdgvuDMmYqLZgQAAykQi+eA2B4BKFiLR9caqg2QZ-Dxbd6E72oC4+Rlima2K4b8ZUV9XEizQPbKJ9s27el9NQRSikAn9wIEEmx58wnQIgJEtAuB64FLbtQXazjXA4LSSAEJSjFHa3kPYveco8lYE3qTfJrSfFbx3s4oB1SrEKKyQ4nJeSNpIJFqMze8SfQVBKMk1J5jMlD1qZA7JES67kJFnbLAmycBYDbk4vA-jx6n2UPkG4pAAByXhlA7zYNXR0PMzkdWUGJUuCoardPQjPeO4t8CS03vXJBoM27wEdFiJA1Bq5ALVv00OqiQAUDYNCL5GBLB5JwIvEWGKcBr2cvAC51jH7yJhcbUeiLdqOJ6esm2OAk711pcCwxIBQWUtMUAgAKqfAAanY341A8AQD7jbeuKAWnxxaSCw5ArKZmJDqfGFXN5DOJId84V8cNopzQCgDVbcsQqoiNC0+cK6nAD+qUPJKAcBtMtT-YmXNqApDSBkIOCzPZKIVZHCoD8pAXwtYg+OiC24Yh9fALBzDqDAAwFGw1Q9jXmxzkgCmMYIJIEaDwQRr8X5arpfHOlQawAmPDZG6NxKjWlwcX+RNhyGjdDTRmt+Qt0DkPQG3DRUAyjUBdR7TlQ8eVcL4DkzR1LhZYCwBtfAo7x1txkLABUjCoWBNPn0yBJQ8CwDEhiIlGzRajstfPLAlqg2rr4IcsSxaMAxqUXG32Cak01pZnPR94645jqXrqkoRISRhg5dyrJ5LT2RKwGLDaI7gOMrtQQFkRao0XtLbG8tCapY8IfROiddspZAZwAYiDzUkAlHKQ-IB4D+kgO1iYiem5ANIO2UBzeeymVdEuDIAAsmoWVpL3VEIHaoPgqhsSAZwFa+egnbXa0piyE0l7YVEMzvnNgMzVXwOE0nGjtL6M4ano4n9vbBn8sFdCvAxqNZ4A9SAbBZRBaapTgend6BwN-1cNBktlSSUEGvdwBNyDkOz1Q-PbVNH-OtuvrfLtTMe1KL7fCx0p7KYsEA5ajDCW24yIjTBqTHGxO3qFUprAoMaovryxInDyb4AvIqa6yL-Sey8oOf4wD3957fxBdQOdu8F2VMq0zaroSiQlF42rNVWAk5i2s8NpOUzfRsDmUAzrBButRfgP+j9kSNo1VHa-Nb6ntZWEsHIAR8jiMDyyVgijVtt3C1W1hjbWGQViQgNiV58jZsgHm2Rj9PCoAreza-bNbdNCnfcjHeReVT66kGZSw5K3R3bI2tD3VxzF1D2XWosJ7GT5D2IyurBaOqmn2WSjpxD6KZYAprDvdZOcVMvsSe-xOPnuvZXVKiAWCoebxTrDtn+zmdiT4OVj2IOh5g9HvU34q7+UrdWzDyXbc+AVBNDwHHRnw6jy9RvPjfBUlqufhizNGK25mrKIr+VXGzywyKBLj+maP5twKo9yph30dRece111DvgHn38ZXQWfz8CjJ0a-JuomuYYDkwAH1DzwF3cqh6mZO5PFbYs56jNwMljEPB75R4y97eF9yp4QFSgnpeAe31Mrz6lTcW7XVK4sKXLB9zqC7wTygZBozm9t13hJzcciXNluF9QDEH7VB9YT5vIRSCNq6r9kDypeV7GuZALqex7m8ADvTdbLNQirUw6323cC1jmJCFC8rq9pdXBIAxKvmBK2cCj9fjfifTK98H-Lultz5aNeuAftQFbKB-dbR0W3B2tPq6uFv0pVpAoKlAHbq6hkrjv2hgN-tbHHFquLLVAnGgclllDzIrDNqfAzgTpfrksOqgb-iQUHgQBELAHgFADKkAoQCZvKoZuWjEEUHgAkLQJZiLCnHbE2jwU7EyiwWwRbMAR7LUhYufMzngM2PILqCUJEnbKDC-AoQ-jhsIAkh7AdqfKRoqtQB6GoWdmqonKtqnKtm3GIPIGCNXGAOYURloaXBUFiN6hQGAPIZasLInHrkyh3k4bYUPNoUrK1nvOvK4aDO4SgKEUGlTNQM4btHQcbsLiUBQJcLtJHq4cNqnMNm3LtKQEqkkSkZnm5tXNXqQNXKZhgLMNIZ3DwOUfAM2A+sgmKmLHlqTE0QAV4fINURUfMh7PPu5vIFIDEVPvIaDCTuLCMfwThlPs2HkfIMMPYnQTKvPqQDKsvhrngJcMkngGAMkhUA+qNmMeOgcZTjhlERQERrtNXtMNkUQokWCILNsvkmMSMU8VtlzLcfkV7vIoQEUfKqUaXDUZUR0Q+qTLVGMZbk0dbkyl0dCv0RQG7oQLCf4SzNHILBvuLK0tskgmtm3HMbnF8YsYwQrqsWJGCKNKNDjm7kiWSRUN8ututtRi0XRuQSAEUNTK4HLjYZoX4fYbAHMlEfIZvNquidqu3uursV8fEfCrkckdQSIRrD8THn8aPACUTvPA7JQu4RqW3M2IEehEUGcRKTHv8RUdCEgFpsQSNrluLCpvZpAqcVALEXBifsLgMQ6UMRaUnEJiNlam3DMUArPr8PQQrvPovr8MsUSe-tAR7LAcjiAPYjEEAqRgXOfAMS4bPA0cgiNs3taW3gIa1tCvcoSmGWJFymngwbGvcmlEvmJD2GWcSakkBvPFLFav7i2cyX6fIuyhiNXqWaZivlGeIUjoMgmfIkmWAimc4Q+jRtslaiBngLObaUYopK4DtpkL4UolSaNDST8N3mqlanuvuccdtl6D6IzOhImafJjmotMWCIpE7Jrkplajmk+YuSAJcOYWCA4SiZ2b+lwokTKRrpEvbKLMBa+VITMSOZUjGcOWwXbnuWgKMvOQhdhtrBUNYXKWAg4fPtMA4X0amY6T3vBqPIEfcr0nPiWXjtWXgPgXGdEWAARa6r0ZGakhLNLEhbSuxeNkyhBEqv2UfiAKAUzOAWoqulAeyXCnublnHLsqDEVtrNqJVN3q6q9kzAAMKDIwZUrnbzlDYvy7JJwqHazOIA6IFKICo3EkywjBFIEizII4CrZ2UOV0IYgKhAKmX9JEHwrh4Kh8ZuWnyeV-zh60CV4ez+Lh7uVMzM7h4BXB5h6h5+VDwxUEC9b9bnnyIRUEBJXcw8B4ZPzs4pz2WNmFUoVcy3DrxsDYg44ZUgBZVKp6EnlAVbTNlNXNYJKaBoDoTnoJVKJZWxbXwdp4aLQ+bCbzkgbCz2URFMoJKdVpbpX+XlofYWbEFYaPErWvEECtxn7dUeXlpFCYJAJYgA5nb9LVwAB+GI7liqmcnloxaABVwGelD1bcygGALyQCquGIp1x1TM8yUiAOQCchQ8x1V1qKqpKBWGHFENXFqhqKZkCYIVTM318spcd57oZQGwQFTRM5WN06Ly4plS1VWVpu5yGFzU81ypTypAaVlSgNSiwNRiyg+gIAKGI1ImpMbNa8XoCNyNiV-xlN4KANp89N3A5cqqnidl+l85+lIKGIXM8iSNZNo82CQCot4eygJgygQ18KhGc1vNypFRc621kVxptRGa62gmuyUtuy2peNkm8iAVTMfARCe1oa6ETgQFv+0lntbc6EWAZpH1QCDtBATtwujCWIPotNe5bh85bhxSwAPcbY-FQdIAId8KeAcmSAvwswQFoMks85udJVFBmdeAFR-FhNJtzYbBw+y1Ix+AGKKeTK-WZd5SKlmV5S6lypQY9xIsM5jcFMGKEsyW6kxCZg8irdIAHdUWNyeN-AOdlt2K61zU4QSlHsuo8g49AA4vIJPahZnAAGKCwUxoD92yUFWn3FJ4CZxALRw9iX1RgyF33JCpDpCi1yjcZfqYJ30doQS039LxBEKcgsxCbH3zmtLs1gNBqi6nyHJsm17-XpUr6nwnpcDC7FpkLm0fzSWYOAG0AGxAJoDuAoNKK6FTDUBFD9ApDtq4PuCfYJEYAAAkQC9DAACmlOynlOyvnAACIADyzG+cSQaUe9cuty6EF18gXZvwaxH69DLDbDHD3DfDAjQj1MAcEKeAUgJWmd7gH6ZwqlgQWBygisSQA+Uqe84KGIsAGAAcsxpjvwVjmjNaa61j8A9BaxDjJW08pimcJQSI8gnIOo-eouMDNMh1JoyD1MMGgqMGYUspMjcj7DnDvD-DgjwjOtSiyjaTG8VjkgZQKIGQOR56OTEAeTtgBTeAMTKoJTK00g5Q4eNM5WXMUA+Zs8aAyCm8dlm8QmN+PpTKACsifApNglBAwlcZ9jYkUA0+e5ScbO85Mz0NdSMjTDrDiTijzGpcmTgs7TeAv+NU+AuzR5XMPU2B5giOSisZpjJ6e82WGyv+GqOzNUOqTKLjVDlwpNCtDyoaRC-2UALjElI6FMv+OuQLr5Njcxq6KtQt5avzjjEEkSv+mKCLhzBAvzAca63RTM5S0DMLnjbA5Sd90cqld9YA8gG9j9Dqz9GQI979pIXzo824pU1sUspBv+BlDzBl0IsR5UNT9gogdU6A9lO0rgQAA)
52
+
53
+ [Async](https://flems.io/#0=N4IgtglgJlA2CmIBcA2AjAOgEwFYA0IAxgPYB2AzsQskVbAIYAO58UIB5hATncgNoAGPAIC6BAGYQE5fqFL0wiJCAwALAC5hY7WqXXw9NADxQIANwAE0ALwAdEE0b2AfLdIWLbowHpTZ5zosCITqEGQyymhIWCAAvnhyCkoqAFYyBCR6Buo0meTqFsAWqngWjhaxFtYWhLDE5ACuXPDkANxubvTkAJ6khBbiDX2hZBYA5vDqAArEANbwYGQAFPKKAJSFbhbN6k3u9ADu9BAF4pOEqksA5BrqzEje3oxz8EwQGCTeb95mWE8vi1I3iuFgA1BZVvA1lsLBh1KoDEtmuQqs5ti0MGllmtoe5YYR6OoLkslhtrGizMRoBYBLjYh1SINhmF3ABBRiMUmbPEIApQQn0do8yZWUiMBoFapXK5CjwwnZ7Cxc8lKmEeS5XPxXPBqjzFa4QMUS7XcvVmizqbqMeBICxXfQAD3U2t1ZsYDEI8FUVCg8C4tqu2T9Fme80BEKSLrx5osZEN4vUtqWRXU9C4EwKsTJaPjEqqFrTGYwZnosAa8B10fNJbLNtFCddFTWlcbGoARhL1GQTcBG2ayLUIIRZraur1+sq0b2qzGPPzU-nDscChmZmHlrn1GtZbOzZv89LWhZHjUEGn6xK++bmlAuIdSUeT81mqRfVwyhyrx56TOKqUriwaYXFczaNo2870FeAD8+pXIwzQmgAUgAygA8gAchg+RcIaYwQOI3RLBBpSkA0sCwKUWA4letoaowJpXOhxAWBBFh1PQvpQCBuobJ4eLbm4P5uHkBQ3neByLhySyXOyjDNixxCEA0ih6BgGYAKIICp6gAELdAAklA1yOCB26BPAwQjBQNACEgaAACxxAkICQjQHzkOkuj6IYyhtsQUDdIUAxkOoAC04gKFI3S2oC9SMPQnpHrE5mWSyEQgLZjmxGIICwIaswRHwiSKLkdSNMiOhNNoyi3PcjxDIwsxjB8xBgN4tT1E0LQAAICBgADs2C+BA+TtWVXXkBgkCkJinmWtaNCcDhjA5AQ8VEgihV8IIBDWGgeCENYwDxCAYh8KF+0gOIp14Hwl0yGdQggHYIC1Q8N1oP1eCfXg9kOb9DlnTtLmzPYBBnRdHA3XdEjQ09R3kN6BzKBDl3XWd91wwQeAJTkYg-T99k4PtRNoEDT2Eja0OQ1d0OY492OqM04go7dNPo7d9O3U98SqNYH0oN9gv2SgACcv1i+TBDwMW80VtTl0APp0wQsxY898DkvAABk2sxPjX0-f19lCMboi3cDWDWNbMtmHL4Ns5dasYwQysMxr5LALyFrWIgYi4HgAf9TggvBygUsgPhSwABzW9YW4Klw7gK6rKsgG73MEEsMsXFIUAAErwOI25RzdADMZd4BXeDR2gQi1+b21PWsifJ6jqcu+n6vZx8qh5x9htfdH9nRzXI8R6ChFQmsJ3tyA6lp-n6u+57vID99X2iwI9l4Fv9kR1HsfWwnkyKin8+L93Od97ABdFyX4hLOXlfV6LKCC2-4cW83rcWOfC+dyXu7Huudb7rwJgIbe31IH72-gQSe2ccSz0dgQIBnMCDIWXtnPA6g8BcDWOAw2Ah+qjzriQiOj8j7WFIAQueaCYYgEwcAis6he4QEId9NAxNOHEwjmMeErRSCglBLQlBIB6GXSYZnEA2DWG5w4WgXAhslER1IGIfBsRkHnUkWnAB0jrCyLWOSBRWBo5CEUWYihMc474PPlIhhejgayLYQosuI9vpuOjnwgRXBhGiO0Rg3RV8cEuINhvb6RMsARJwFgCOeC8A0M9mnewtQujkHQkkewcd1C6yWOoF6qSPL2GbOrAAhAIGxUE-ZC1+vgBy0dDYj36hHeAeS1hIFILrc+D10G03dnwdQIgqlYWqQTQ2OBg7fQmTgA+HZ9DoWQk-OePSGEc2BgMsQuDbFhIJjgUW4z9ktLyXgmeDsAkgAACppwAGpYIrKQPAEAHZjKFqY15Xi4EgHuY8g6Zz2ZpxWfDfBq9RmDyFmXcWaAUAQojkY5wXsRTdLTms+GwAOrlQUSgHA5isWN2BqQQuiwzBUznmsrmwNYitCjmYbOmLh5C2HhHJYNLp6t2ABgDlSLO4ouxnLOyCT-I2igIpZ+VdK5Qv2ULQ5nylhgEQS3U+Sd2WcuWci9WOCrQ2n2qQQVSBhWEFFdXT66AN7oAjjfW8BhWbnKuZ3W5wDiBsLATsr6WAsBl3wG6j1Ec2KlOPl0uhad7FPSRHgWAzYSQcLdViwOWAsVMq4HgYgCTmzKowFy3pPL2B8u1YKm6AcC0esFu6kOsKuAYHFIjJZYjbW9PtdI7OGyU1RvsmXV1rbmmfO3Gyjl6bVXcvVXyneoD82es9UTHeWAJ2qKQFwTRpc54ZwYc7Bt08EV43CT9Kd0conbtiZ80g8AJIAFkmB-LRgC5ejrniclES83A2LA44GxXEwg25vYZtWcvGWit1CtGaFGvZu6gMR3ybg8+taGH1qcd8p53S8BkokHgQFBAZ4AfxpC8Wcat3oE7U3VDsQe0qrESsi97sNXWiQKPEd-sx2B2hbuhj5q86FxZhBm53dcE0IOqoKNWLJ38dA3sNNn6yPSIo1q55YKsD9QEMW2TX98MuUFcUrRNNoOXTbHc+JNCo0N0Dg3FppA-XxwDWIjTBAtPMIrTwZgUbRb2Sww50W3jVCtHUH48+FmQBWdXU28tHCy4CDdVXYL+6lMWRYFYR+58l1OyvjiddgWBA4B3kF1LLTmwQFJCUue3nfNOPLaAtgLqq4SrK5LT58LvbEH5nPfSadWTBK2QkwLbqoll3a7CpJgbO7Bqziw89HdelLpDfg3LYj7GXUcSGisXB837SwPtTrMaVszJlRWZN3GvNpwK2NhJjycRtejuLTrJ24kQBxEmtTl0Gudya+7Axc2DuBaCx1t7EdiCtG9oQIbfTekoZAFSx+nJiB3rBRXCZYqJkR3RV1P7iGQCA+sI6uHr3a5itrhHQyE3zlxeG4VtYZm8dpxXU4mh2sPp1PwG4yBVcTZ4qehgX9AAfFnhBif-M7oDxL3sN0vLcQHQX62lPqCWG+qlnOxMMMB7k-J7wxiBaJoLNxpbPny7UpMat5zEc86J9rFY8clcoFHm4k3Ed47vsRf2zNy9SBIhs8QJX0cX4jzLrCvAfNz76WwaRggrJsFZqTR8D64qX7Yo6xHiOt9kKpn0Nammfv-sUqQEsVHfdAs4Bd1XLP7vPkx7j5rUTsNyNg9iFHUggWUB07LtXxnBAXx1ZrRx4BTyoC45phIwJDqMCV-xoLKFv0sByaH3J0D2QXpgx253PbA3g-yNK-ZONQgl-V9A2xPAUBfnn3EMhgFCH1UlAaHgRgOMPqYdqSa5XZNPlH5PzjJv5zHGXXoSGy7eBujWFZPNxfEzK5E36jzwi1IH4VUBpkXVJztwwAQBAP5zBRFiCwliCwjiMGsDGF1jAFQNi0gPdlaDWGpT4DAA4RFihxILw2BktwIOwM7jJyehEBMy3HwmIJQH6i+hFlYKZUOlIEIJylJUvUey4D4AODEA52YIcwlgcwjjEHIGsEEOEIOilwkF1l111kBwwHmE-2tkIHUPgG6HzVHjeXslkxX2MIt2sG0I0P8UTzVUezMB4M9ybxeSMKW1+n6iWziT5m6CEJEGsAdGwR31+ST3IF+SDzBzwAOGETwDAGEVaHzSc1cI9QSJF2Bi4L4FizEER1mGkOXkEMV3xiiUUVcLcKKPC2BlyJEMUKumUIBVUPVh0M0PMPzSEGH1cIxyMKx0+UsO6WsDsPxyuh6L4FoIdi93xjD1+jMSiRHmCwjj8PllJUCP31+1CObDGFClCj+z6KGJADWNaGqRCxCxHhaMOPrxAAaCOkpVgCwIgJoPVm+z8S4OIOjmhXGOhQt3DViL4O5xyO8M30f3ZmqO51qPdnqIW0DhJi3jYIhIjm6AYKggaDSM+IBzqI0JECQHA0X1Fhk1+kxPIJDVSKgF4JIxsP0TsIJIcOINFkfUcxfU+W8L+Nu0DwWPu19xCPVTCPPi70YWCRKHPjJyVm7jsKIP9gMNHkcxN2xPN1vxM26VyUWQrHIGbGuXFz325VyXUkD2bDbGVOWNESnUDh3mxTp0NJOLpIgyWERyVMByTQ7xfyDW5L+z5NdgFMIPzV3SiWxTbTwA9NxPgVBFiEi3gD-muN6S2J2IDKDM3S+mxRjWjOSKegMFAIuigl5LTlGyzi8LGFBDJnB3CWxUlTzJ9JAAOFQLGDwJGObztW7jkLEDBw4WJh+nrMLI-zpJ5N616X6xkQrBKDkik1zLQDcS9P7NgSU1aEwPpNdjwKT1mDwKzQGLAEJPOSTyzQYNyTsV90VN0Q1LwFnxkW4PnL+yXLZKOzED+gBkHL2XPJc0+V9FkOtIT0ukg0umg323b0pQ5heRiX6kFk-MU2BiGBCBZAjPOQK0ugAGFgle1tlIyvSsBRZK4Yk4KI58F10IQ05HlvjRBgcBZvpR4cAgtcL8KD5H5Slz4+9el2F3Y2dSlORSK04KLpE1g2d6BtcaYaE2cyKGFLs2d6LgZmd1A2daLO4eKmd4JiBmBky54OLLphLdpCBZ1y5TtxY8K9TlLhzgZEZ8IxcbSCApKCAZLnpy0YD+E6za8DTTKjNQDnA0AoIRNJK6L1VisXxZ1kpaMn0vS20oyPLXMbLe1BLyKHKLV0NoLUtCiQrSinpRBYh7ydL7LyMGhEFz41gUKN0GFdYAA-FYb9DAeilwtAJS1teCgqiOewDAYpc+YHJYNKlKy6fxZuFC8+H-XpFK+GGWHpXK78omfKvZFpLCPKT0Fiy6aqmK92LMtYDAZod0Os5wr05wn1YpD4sRXSyOOowpGQvyzilahgDyCSsRRqhhZq+BewTwEAUdNy59I0w0g+EAga4a-y4E1a9pBqtOA69gTWUZUhXChCr0hCo5OgsRIalydWGec+N6tnewPwewFy6RBdRa2K6Reov1da6S5E3Q0VELZ9GJb6mJaE+aj9OeHiy6J3R7eKqEKCKIOs6vb8ymiOKCLANEiq8+AmggIm-RY+NYeERqj8rFKM7m1RYAO2TVaK5azuFm4GPAX9JACseYOs-qf6CZQGdXSWvADQoWpa-S+ok-HgGWgOCZXAT7e4UizRECvSzRcC4EnYD6Ao9042faCZP6UDY4UgFeAIOeY2kAM2htLJeakgGWzG6ZcKnS-IICmmVkawN2gAcWsA9uBl2IwAADEPp9o0BbavylLU7VE8AZZz4+Y2xM6pov886yBCViBiVnbr0Ggq0oQ86Xw3w05HBl4mQbpH1k6vSzEhAs9IEmU5s0Knbjogb6rJKk005k1tBHtlV150ba5vyp6kLDgha0B4hR7ekZowB6BSJSxC5bxDh4gSt9Fy0AASc+feqYdSC5fSC5RWAAEVQmPUVnznUjju+2ySgkNwuWwTCIPuPtPvPqvpvrvofqOmZg6TwDMB1V9ElviHLUdHUFApCgn3sDBnzlDQeS3HaSWFgHGqLl8NDQrAwdAcFTDUwd3zCLwbAbetORli4CGGsCZAAuWGe17qzBQpHqOl7SeV7VIB3tkIwH3q-rPovuvtvvvsfphoYX-pEcfgwdMGaAAuJRkLTSkYgBkdCDkbwA4YwGkfgFkZaDZ2Oi0SeigGlP9jQFHmjlwujkfSzxpIi12CTljHHMuRb1XTDWbCgEcLBT2ROy9NFnO0+W4cPrnj4Z-sEfVnEY+lMbwDr3wCifHz0Enx0DbIYQ7NDWTS3F7J+mrwhUiYEBhU+Uwa3oOAcYBryV9lqt2nhSgCIYnv2mryh1qcLOZmwcTRBuevVUqfwd9A4Wr0mW6bjIIEqeZhcfPk0TQvabIfjk0Tzr5lArzrAGsHDsLoJQWBLrevJHLsrrKbiBxAWv+mr2ybgv2fdxyiCC0asnSlsnQDwriBEFiCAA)