Compatibility with MouseBackEnd?

Hi,
Neither Touch nor HTML5 backends work with svg, but MouseBackEnd does https://github.com/zyzo/react-dnd-mouse-backend.
Do you have any plans to support arbitrary backends with this project? Would love to use this but currently blocked because I need both HTML5 and Mouse backends

Hi!
That's weird because I use TouchBackend with SVG and it works perfectly (I can't use HTML5 anymore). Did you enable the mouse mode of the TouchBackend (DragDropContext(TouchBackend({ enableMouseEvents: true }));)?
The point of the MultiBackend is the ability to switch between backends dynamically, so as long as we specify how to transition from one backend to another, we could support arbitrary backends.
Since you posted this issue, I have been thinking about a way to support arbitrary backends, and we could simply specify an object with the backends and the event to switch between them:
DragDropContext(MultiBackend({ backends: [
  {backend: HTML5Backend},
  {backend: TouchBackend, options: {enableMouseEvents: true}, transition: 'touchstart', preview: true},
] }));

Which also means I wouldn't have to bundle the HTML5 and Touch backends and the user can choose the ones they want.
The only problem is that I have a lot of backend specific code to make the transition between backends completely smooth. I am not sure this can be done for arbitrary backends.

Ah, my bad... DragDropContext(TouchBackend({ enableMouseEvents: true })); totally worked. RTFM.
Yeah, realistically your HTML5Backend and TouchBackend cover my use cases (and probably most) so hard to say how much value is added by arbitrary backend. My issue is solved, feel free to leave this open or close it

No problem. :)
As a matter of fact, I already added the arbitrary backend system. You can get it if you update to 2.4.x, it works out-of-the-box but you can change the default (HTML5 + Touch) nearly the same way as in my previous comment (see README on the master branch).
I also made a v3 that doesn't include any default so you have to explicitly mention the backends you want (which means Webpack will not include them if you don't use them), it's on npm with the tag next.
You probably won't need it, but at least your initial question is finally answered! :D

Wow cool! Thanks so much, I'll check it out and give it a whirl

The current version is 2.3.x tough, my bad.


Fix partial risk behavior configuration bug

Previously, if a user's account supported risk behaviors A, B and C but only behaviors A and B were configured, a 'provider produced inconsistent results after apply' error occurred.
This is because the cloudflare API call for user risk behaviors returns the status of all behaviors.
This PR changes the user risk behavior terraform provider to - on read, create and update calls - prune the API call results to only include the behaviors the terraform config includes
A test confirming that the fix works has been included

this seems like a case where someone is only partially managing the resource in terraform. is that the case?

this seems like a case where someone is only partially managing the resource in terraform. is that the case?

Yes, but even in the case where someone is fully managing the resource in terraform, we sometimes add new risk behavior types, which would put them in a partially-managed state (which we want to handle gracefully).

acceptance tests passing
TF_ACC=1 go test ./internal/framework/service/risk_behavior/ -v -run "^TestAccCloudflareRiskBehavior_" -count 1 -timeout 120m -parallel 1
=== RUN   TestAccCloudflareRiskBehavior_Partial
=== PAUSE TestAccCloudflareRiskBehavior_Partial
=== RUN   TestAccCloudflareRiskBehavior_Basic
=== PAUSE TestAccCloudflareRiskBehavior_Basic
=== CONT  TestAccCloudflareRiskBehavior_Partial
--- PASS: TestAccCloudflareRiskBehavior_Partial (2.82s)
=== CONT  TestAccCloudflareRiskBehavior_Basic
--- PASS: TestAccCloudflareRiskBehavior_Basic (1.97s)
PASS
ok  	github.com/cloudflare/terraform-provider-cloudflare/internal/framework/service/risk_behavior	6.140s


[jenkins]: e2e job failure due to deis-router CrashLoopBackOff

Documenting the following e2e job failure.  In this case, the tests aren't actually run -- the deis-router pod never comes up as it appears to be stuck in a CrashLoopBackOff state.
Here is an example job: https://ci.deis.io/job/workflow-test-pr/3738/console
An excerpt from the console output:
10:04:14 Waiting for all pods to be running
10:09:48
...................................................................................................................................................................................Not all pods started.
10:09:49 NAME                          READY     STATUS             RESTARTS   AGE
10:09:49 deis-builder-ilmrh            1/1       Running            1          6m
10:09:49 deis-controller-cnpy7         1/1       Running            1          6m
10:09:49 deis-database-ntcn5           1/1       Running            0          6m
10:09:49 deis-logger-fluentd-30lcg     1/1       Running            0          6m
10:09:49 deis-logger-fluentd-8tvwi     1/1       Running            0          6m
10:09:49 deis-logger-fluentd-coxtc     1/1       Running            0          6m
10:09:49 deis-logger-fluentd-te6qq     1/1       Running            0          6m
10:09:49 deis-logger-fluentd-vjpp5     1/1       Running            0          6m
10:09:49 deis-logger-jnu11             1/1       Running            2          6m
10:09:49 deis-logger-redis-j4b4e       1/1       Running            0          6m
10:09:49 deis-minio-f91cs              1/1       Running            0          6m
10:09:49 deis-monitor-grafana-tlrct    1/1       Running            0          6m
10:09:49 deis-monitor-influxdb-hpq0r   1/1       Running            0          6m
10:09:49 deis-monitor-telegraf-5zany   1/1       Running            1          6m
10:09:49 deis-monitor-telegraf-eu5kc   1/1       Running            1          6m
10:09:49 deis-monitor-telegraf-hye1h   1/1       Running            1          6m
10:09:49 deis-monitor-telegraf-rtuvm   1/1       Running            1          6m
10:09:49 deis-monitor-telegraf-y0w4y   1/1       Running            1          6m
10:09:49 deis-nsqd-aha9w               1/1       Running            0          6m
10:09:49 deis-registry-d3tpg           1/1       Running            3          6m
10:09:49 deis-router-7jg81             0/1       CrashLoopBackOff   6          6m
10:09:49 deis-workflow-manager-qabcn   1/1       Running            0          6m
10:09:49 registry-proxy-477zx          1/1       Running            0          6m
10:09:49 registry-proxy-dw7c0          1/1       Running            0          6m
10:09:49 registry-proxy-n5v8o          1/1       Running            0          6m
10:09:49 registry-proxy-njjvi          1/1       Running            0          6m
10:09:49 registry-proxy-rxowt          1/1       Running            0          6m
10:09:49 Gather pod logs before we delete lease

And the logs from the deis-router pod show:
2016/07/20 16:10:04 INFO: Starting nginx...
2016/07/20 16:10:04 INFO: nginx started.
2016/07/20 16:10:05 Error building model; not modifying certs or configuration: endpoints "test-296907690" not found.

For reference that error comes from this code in the router, which from my hunch would be from here.

This is happening routinely in e2e so hoping we can bump the priority on an investigation/fix in next iteration.

Another faliure from https://ci.deis.io/job/workflow-test-pr/3831/artifact/3831/logs/deis-router-0jc0e.log
2016/07/21 21:18:16 INFO: Starting nginx...
2016/07/21 21:18:16 INFO: nginx started.
2016/07/21 21:18:16 Error building model; not modifying certs or configuration: endpoints "test-296907690" not found.

this does seem intermittent, yet at the same time this happens enough to cause concern. There doesn't seem to be anything painfully obvious since the last release, so maybe it has to be an issue with interacting with the kubernetes API?

... endpoints "test-296907690" not found.

@bacongobbler Isn't it odd that on a fresh workflow installation, the router is looking for a test-* endpoint?  Wouldn't that endpoint come from the later e2e chart install?

Alright this seemed to be directly related to us not cleaning up the cluster. In fact the e2e-runner was cleaning up the cluster but the namespaces were still in a terminating state (some for as high as 11 days). We have turned on CLEAN_CLUSTER for k8s-claimer to see if that helps.

turning on CLEAN_CLUSTER did not fix the problem really. I ended up having to bounce the 2 clusters affected to get them to remove the terminated namespaces.

rebooted all clusters. closing this issue for now


[1.0.0]  @apply cannot be used with .text-white because .text-white cannot be found

I've just updated from tailwindcss 0.7.4 to 1.0.0-beta.5 and followed the upgrade guide.
I have a simple button component where I use tailwindcss's @apply and have removed any styles from ~tailwind.js~ tailwind.config.js that I'm not changing, but now I get the following error:

@apply cannot be used with .text-white because .text-white either cannot be found, or its actual definition includes a pseudo-selector like :hover, :active, etc. If you're sure that .text-white exists, make sure that any @import statements are being properly processed before Tailwind CSS sees your CSS, as @apply can only be used for classes in the same CSS tree.

According to the docs for beta, .text-white is still here.
Is it a documentation issue, a bug or me?
button.css:
.button {
  @apply
    inline-block
    border
    border-solid
    rounded
    py-2
    px-5
    ml-4
    mt-4
    no-underline;
  }
.button--green {
  @apply
    border-green-darker
    text-green-darker;
}
.button--green:hover
{
  @apply
    text-white
    bg-green-darker;
}
.button--grey
{
  @apply
    border-grey-darker
    text-grey-darker;
}
.button--grey:hover
{
  @apply
    text-white
    bg-grey-darker;
}

tailwind.config.js:
module.exports = {
  theme: {
    colors: {
      'transparent': 'transparent',
      'sk-green': '#5D7F57',
      'sk-green-dark': '#304325',

      'black': '#231F20',

      'green-darker': '#3b8070',
    },
    fontFamily: {
      'source': [
        '"Source Sans Pro"',
        'sans-serif'
      ],
      'open': [
        'Open Sans',
        'sans-serif'
      ],
    },
    borderWidth: {
      default: '1px',
      '0': '0',
      '2': '2px',
      '4': '4px',
      '8': '8px',
      '10': '10px',
    },
    minWidth: {
      '0': '0',
      'xxs': '10rem',
      'xs': '20rem',
      'sm': '30rem',
      'md': '40rem',
      'lg': '50rem',
      'xl': '60rem',
      '2xl': '70rem',
      '3xl': '80rem',
      '4xl': '90rem',
      '5xl': '100rem',
      'full': '100%',
    }
  }
}

@dotnetCarpenter Looks like you're missing a white color in your tailwind.config.js file. Simply add:
'white': 'white',

or
'white': '#fff',

somewhere in the theme.colors dictionary and it should fix your problem.

In node_modules/tailwindcss/stubs/defaultConfig.stub.js I can see that white is defined.
I was under the impression that my colors got mixed in with the default colors. This appears to be false.
After re-reading:

The way your configuration is merged with the defaults is designed to be very intuitive and mostly just work, but for the curious:
prefix is replaced
separator is replaced
important is replaced
theme is merged one level deep, so if you provide an object for theme.opacity it replaces the default theme.opacity object
variants is merged one level deep, so if you provide an array for variants.opacity it replaces the default variants.opacity object
plugins is merged, but the default is an empty array so it's really the same as replacing

theme is merged one level deep, so if you provide an object for theme.opacity it replaces the default theme.opacity object

Should probably be in the beginning of the upgrade guide (in bold). :I
@benface Thx!

If you don’t want to overwrite the defaults, add your colors under “theme.extend” instead of just “theme”. I’ve mentioned before that this needs to be covered in a more obvious way. I’m sure it will once the 1.0 docs are released.

@devcircus How do you use extend?
I just tried to do
module.exports = {
  theme: {
    extend: {
      colors: {
        'transparent': 'transparent',
        'sk-green': '#5D7F57',
        'sk-green-dark': '#304325',

        'black': '#231F20',

        'green-darker': '#3b8070',
      },
    },
    ...

And I got:

Syntax Error: SyntaxError                                                                                friendly-errors 19:35:35
(27:3) @apply cannot be used with .border-grey-darker because .border-grey-darker either cannot be found, or  ....

make sure you completely restart your watcher if you're watching your file changes. Thats how it is used.

Well, also @dotnetCarpenter are you sure you have a grey-darker color? In the example you posted, you defined green-darker but no grey-darker.

@devcircus @benface Ah, I see that grey-darker is now gray-800... That seems like a bug. gray is misspelled(!).
grep gray node_modules/tailwindcss/stubs/defaultConfig.stub.js
      gray: {
      default: theme('colors.gray.300', 'currentColor'),

gray is the correct American spelling, it was changed for v1.0.

@benface same on us Europeans... hehe

Hmm... according to the new docs, .text-gray-700 should work but I get:
Syntax Error: SyntaxError                                                                                friendly-errors 20:21:57

(29:5) Unknown word

  27 |   @apply
  28 |     border-gray-700;
> 29 |     text-gray-700;
     |     ^
  30 | }

Remove the ; after border-gray-700?

@benface THANKS!


Don't display "target" dropdown in DeploymentDialog if not logged into any TAS instances

... prompt log-in in that space instead?

In order to complete this ticket (and bug #143), the existing architecture would require re-adding logic to keep the TasExplorerViewModel.TasConnection in sync with CloudFoundryService.ConnectedCf. This feels needlessly complex when there's a simpler design available (diagrammed above)

Here is the Deployment Window without the dropdown feature; it forces the user to log in instead of having an empty dropdown.

Once the user is logged in, the next step will be to auto-populate the Target field in the Deployment Window

See design here:
0 2021-08-30 at 11.57.48 AM.pdf


Add event handle (code-menu) to codelist view

Required to create code like this:

copy code name
copy code fullname

Resolved
Event handler - code-menu (RunJS) · eoureo/obsidian-runjs · Discussion #27
https://github.com/eoureo/obsidian-runjs/discussions/27


Devs SBAT to use the optimized Zcash Pedersen hash variant

Expected Behavior
We should have another hash implementation that uses the Zcash Pedersen hash described here: https://github.com/zcash/zips/blob/master/protocol/protocol.pdf.
It should have many benefits:

More efficient memory-wise.
More efficient over-all, when using the Montgomery curve birational equivalence.
Much more efficient in a SNARK (might be around 2x).

Current Behavior
We use the Zexe variant from here: https://eprint.iacr.org/2018/962.pdf

Created branch Zcash_pedersen @kobigurk could please take a look at bls/hash/zcashPedersen.rs


Backup Dropbox failing? Even on v2 api?

I’m getting this error in my emails:
Failed to backup posts and images to dropbox: Traceback (most recent call
last):

File "/base/data/home/apps/s~jonchuislife/20171011t222458.404746098147759290/handlers/dropbox.py",
line 39, in get
     result = self.put_file(settings.dropbox_access_token, 'MyLife.txt',
post_text.getvalue().encode('utf-8'))

File "/base/data/home/apps/s~jonchuislife/20171011t222458.404746098147759290/handlers/dropbox.py",
line 142, in put_file
     headers=headers

File "/base/alloc/tmpfs/dynamic_runtimes/python27g/3b44e98ed7fbb86b/python27/python27_lib/versions/1/google/appengine/api/urlfetch.py",
line 293, in fetch
     return rpc.get_result()

File "/base/alloc/tmpfs/dynamic_runtimes/python27g/3b44e98ed7fbb86b/python27/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py",
line 615, in get_result
     return self.__get_result_hook(self)

File "/base/alloc/tmpfs/dynamic_runtimes/python27g/3b44e98ed7fbb86b/python27/python27_lib/versions/1/google/appengine/api/urlfetch.py",
line 433, in _get_fetch_result
     'Connection closed unexpectedly by server at URL: ' + url)
ConnectionClosedError: Connection closed unexpectedly by server at URL:
https://content.dropboxapi.com/2/files/upload

Is this happening every night? I've gotten this message a few times, but like maybe 10 times in 2 years or something.

It used to be infrequent, but now is much more frequent, i have 73.7% of my 15 GB dropbox full, so i don't think it's a space issue
here's a search:

Upon further investigation, when i run to the url [domain]/backup/dropbox to run the backup, it seems to work, and this appears on the screen:
Backing up 251 posts to Dropbox
Backed up posts. Revision: c82edaa2e4
Fetching Dropbox file list
Got 81 files from Dropbox
Fetching images...
Total images in MyLife: 80

Files not backed up:

Files marked as backed up, but not in Dropbox:

Found 0 images that need to be backed up in Dropbox
Finished backup successfully

That is pretty frequent, but I've never been able to reproduce these errors. I guess it must be a Dropbox thing, I searched for similar errors and all I found was some forum post where a Dropbox employee told someone to just retry in this case since errors like that could always happen. I should probably add 1 or 2 retries before sending the error message at some point.

Closing this, have gotten no further reports.


Safe var for outgoing ports

Fixes https://github.com/elm-lang/core/issues/616 & #1414

In #1414 referenced in this pull request @evancz says

No longer a problem in 0.18

Should this pull request be closed?

I guess so? If folks can verify that it is not fixed with 0.18, please open a new issue describing the problem.


Automatically restart systemd service

Since the main loop exits on quite a few failures, maybe we should add Restart=on-failure to the systemd service file?

Good idea.


False message Artist is already in Lidarr.

Hey just came by to show the app some love.
I noticed that when I have everything setup and select an artist on the webfront it says Artist is already in Lidarr. However looking through the logs it shows this
lidify    | Artist 'Metro Boomin' matched 'Metro Boomin' with MBID: 59db3d82-86ea-451f-881f-dffc8ec387c9  Ratio: 100 lidify    | Failed to add artist 'Metro Boomin' to Lidarr. lidify    | {"propertyName": "Path", "errorMessage": "Invalid Path: '/data/media/music/Metro Boomin/'", "attemptedValue": "/data/media/music/Metro Boomin/", "severity": "error", "errorCode": "PathValidator", "formattedMessageArguments": [], "formattedMessagePlaceholderValues": {"path": "/data/media/music/Metro Boomin/", "propertyName": "Path", "propertyValue": "/data/media/music/Metro Boomin/"}} lidify    | Artist 'Metro Boomin' is already in Lidarr.
I know its a problem with my Lidarr setup but figured you should know so you can correct the error message back to the user.

Also maybe it could just grab the root folder from Lidarr and can it start searching on add?

Also maybe it could just grab the root folder from Lidarr and can it start searching on add?

In certain scenarios, multiple root folders may exist, necessitating the need for an option to select the desired one.
Thanks for your input.


Update UserManager to normalize role name

As part of this fixed the in memory test implementation to verify the fix so its touching way more files as a result
cc @divega

Fixes https://github.com/aspnet/Identity/issues/716

:shipit: after addressing the feedback.

Feedback is addressed so :shipit:

7ba61d6c6f6ce4eaee4c5018e71fa374d99bc868


New deployment target: Ubuntu MicroK8s

New fresh dev container deployment target: Ubuntu MicroK8S New Kubernetes for WSL v2. Surprise :)

Ubuntu Microk8s is available now on Windows 10 2004. This is a new deployment target! Ubuntu  Micro K8S released

I believe this would be covered by Kuberntes support would it not? Are you thinking this is a feature request?


Dying crashes game with a soundbug

Describe the bug
When dying, the game crashes. This seems to happen consistently, every time.
To Reproduce
Steps to reproduce the behavior:

have mod version 1.2.12 installed
die

Desktop (please complete the following information):

OS: Windows 10 21H1
Minecraft Version: 1.18.1
Version: 1.2.12

This happens on a heavily modded fabric installation, and I haven't tested for this bug with ONLY the grave mod installed. I have some other mods installed that work with audio, namely "Dynamic Surroundings" and "Presence Footsteps".
BUT I've tested in the same environment with 1.12.11, where the crash doesn't happen.
Crashlog is attached. Though I find the additional error message to be interesting as well:
AL lib: (EE) UpdateDeviceParams: Failed to set 44100hz, got 48000hz instead
AL lib: (EE) alc_cleanup: 2 devices not closed
crash-2022-01-18_21.06.14-server.txt

Not quite sure how to read those error messages or what they mean. I can however see in the crashlog what went wrong and it's now fixed in a new update. I hope this will provide better stability.
This didn't happen to me when testing on other modpacks, but none the less it should now work on yours too. Enjoy!


InvalidAccessKeyId error while running the tests

I'm trying to the run the tests against my localhost server using the following command: mvn test -Dtest=S3CompatApiTest but I'm seeing an error: https://pastecode.io/s/099599z3
P.S: I'm following the documented steps with setting the environment variables as well but still it fails with this error.
Can someone help me figure out the point of failure or something that I'm missing out?

@TRYTOBE8TME what error were you seeing?


File hosting website

Hey, which file hosting website should I use with this downloader ?

Any that supports direct download links, https://github.com/UnamSanctam/UnamDownloader/issues/2


Bug report:

Describe the bug
A clear and concise description of what the bug is.
To Reproduce
Steps to reproduce the behaviour or a link to the recipe / input used to cause the bug:

generete a qr code from any simple link or etc...
try to add text on it
See error

Looks working in my environment.
Generate QR Code, Add Text To Image - CyberChef

Version: 9.55.0
Compile time: 09/12/2022 11:42:13 UTC
User-Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0
Link to reproduce

What error do you get and what is your environment (browser, etc.)?

this is what i get:

this is what i get:

The 'Add Text to Image' component has now been updated and I can no longer reproduce this issue.  Hopefully fixed, feel free to request I reopen this if not!


Support user assigned managed identities for azure batch pool add parameter

Is your feature request related to a problem? Please describe.
I am unable to find out how to add a user assigned managed identity to the azure batch pool via the python SDK
Describe the solution you'd like
I want to be able to add a user assigned managed identity for the azure batch pool when adding a pool
Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.
Additional context
Add any other context or screenshots about the feature request here.

@jakevc thanks for your issue. We'll investigate and get back to you as soon as possible.

https://learn.microsoft.com/en-us/answers/questions/606714/how-do-i-add-managed-identity-to-azure-batch-pool
This advice for example, seems to be inaccurate because pool parameter doesn't actually have an identity field.

Ohh this is a duplicate of this other issue I guess: https://github.com/Azure/azure-sdk-for-python/issues/21811

But still should really be included in this SDK

Very cumbersome to have to use two different Batch clients

@wiboris could you help to answer the question?

Hello @xiangyan99,
Do we have solution yet or any tentative dates for this implementation to be available as part of the package ?
Thank You,
Renjith R

Ping here again @wiboris @cRui861 @paterasMSFT

@jakevc Thanks for raising this issue. I am trying to set up a Batch pool able to pull from ACR but the fact that PoolAddParameter does not have any identity field makes it very cumbersome. @wiboris & Team, please add such a field in the Python SDK as it is part of the equivalent .NET class. Many thanks!

@datatrigger I ended up refactoring my code so that the pool creation step uses the azure.mgmt.batch,
https://learn.microsoft.com/en-us/python/api/azure-mgmt-batch/azure.mgmt.batch.operations.pooloperations?view=azure-python#azure-mgmt-batch-operations-pooloperations-create
The Pool class in this package does support passing a managed identity:
https://learn.microsoft.com/en-us/python/api/azure-mgmt-batch/azure.mgmt.batch.models.pool?view=azure-python
And then for the other job and task operations I use azure.batch

Bump, this is super valuable for me as well - having to use two different clients is extremely cumbersome.

I think the underlying reason for this is that not all components of azure batch are supported by ARM yet. Basically, the problem runs deep.

Please update the docs to reflect this workaround until a cleaner solution is implemented.


Fix shadow on android context header

What a bug... #517

See comments in code on what was happening + the solution. I believe the issue is more on react-navigation's side and seems very edge case.
This solution works but I think ideally I think it'd be better to remove the stack navigation all together, place all routes in the tab navigator, and then extend the options prop that the custom tab bar can consume to show/hide. It is a pain to get the the options prop, so that's the only real issue with that.

Cool that you found a solution for this! I'm assuming we will eventually not need this on the GroupPhotos screen since we're wanting to replace that screen with the native picker, but fine to have that there for now.


KeyError: 'all' when executing SublimeLinterToggleLinter command

When i call more than once the next command { "keys": ["ctrl+k", "ctrl+t"], "command": "sublimelinter_toggle_linter", "args": {"which": "all"}} I'll get the next error:
Traceback (most recent call last):
  File "D:\software\SublimeText 3_x64\sublime_plugin.py", line 795, in run_
    return self.run(**args)
  File "D:\software\SublimeText 3_x64\Data\Packages\SublimeLinter\commands.py", line 673, in run
    if self.linters[self.which]:
KeyError: 'all'

In order to run this command many times using the I need to Clear Caches.
When I execute the command using the contextual menu instead the shortcut the error doesn't happen.
Windows7 over here.

We dropped this in SL4: https://github.com/SublimeLinter/SublimeLinter3#sublimelinter-4-beta


[tasks] Change default branch from master to main

What does this PR do?
Change default branch from master to main on tasks code. Follow up to #8303.
Motivation
Renaming master to main
Additional Notes
This should be merged only after the renaming is complete.

Reviewable, keeping as draft to avoid accidental merge.