02:46
<devsnek>
CreateDynamicFunction says stuff like
02:46
<devsnek>
"if kind is generator, let parameterGoal be FormalParameters[+Yield, ~Await]"
02:47
<devsnek>
but then later down it says "throw a syntax error if kind is generator and FormalParameters contains YieldExpression"
02:47
<devsnek>
why not just set parameterGoal to [~Yield, ~Await]
02:53
<devsnek>
i wonder if this entire thing could be shortened by cutting out all this manual parsing and just specifying it to evaluate sourceString that is defined way at the bottom
03:15
<jmdyck>
using [~Yield] would have allowed 'yield' as an identifier, which would be confusing.
03:16
<devsnek>
interesting
03:16
<devsnek>
ok on a separate topic
03:17
<devsnek>
is it fair to imagine that UTF16EncodeString and UTF16DecodeString convert between some abstract host string form and js string values
03:21
<jmdyck>
I don't think so.
03:22
<devsnek>
hmm
03:23
<devsnek>
they generally seem to be used when passing strings back and forth between host parsing and js
03:23
<jmdyck>
The spec assumes that the host understands ES String values.
03:23
<devsnek>
well yeah but like
03:23
<devsnek>
"let x be the result of ! UTF16Decode(string)"
03:23
<devsnek>
er
03:24
<jmdyck>
if the host has an abstract string form, conversion between that and ES String values is completely hidden from spec-land.
03:24
<devsnek>
"let x be the result of parsing ! UTF16Decode(string)"
03:25
<jmdyck>
Yup, those ao's are mostly used for converting between *source text* and ES Strings.
05:55
<Bakkot>
devsnek: UTF16Encode UTF16DecodeString should be thought of as converting between _Unicode_ strings (more precisely, sequences of codepoints) and ES strings
05:56
<devsnek>
i'm just trying to figure out if i really need to store source text on functions as an array of code point records
05:56
<Bakkot>
"Unicode strings" and "host strings" are not typically the same, especially given how shoddy unicode support is in most languages
05:56
<Bakkot>
ah: no
05:56
<devsnek>
i mean i know technically i don't have to
05:56
<devsnek>
but the spec seems to want me to
05:57
<Bakkot>
that's just because it's a nice formalism, not implementation advice
05:57
<Bakkot>
here, this is why: https://github.com/tc39/ecma262/pull/1547#issuecomment-581005549
05:58
<devsnek>
i see
14:43
<srl295>
devsnek: it should still be a string.. Bakkot : not sure what you mean about host strings, are you talking about non-unicode host encodings?
14:44
<devsnek>
srl295: it's a List
14:48
<srl295>
devsnek: even in implementation?
14:48
<devsnek>
not in implementation
14:48
<devsnek>
hopefully
14:48
<devsnek>
but in spec
15:00
<srl295>
^ OK, thx
15:58
<gibson042>
[[SourceText]] is a sequence of code points to match lexical source text, but String values can represent those per https://tc39.es/ecma262/#sec-ecmascript-language-types-string-type . There's an edge case of "leading surrogate code _point_ followed by trailing surrogate code _point_" (which would be interpreted as a surrogate pair for a single code unit), but I don't see a way to ever encounter that because it cannot be represented i
16:00
<gibson042>
s/surrogate pair for a single code unit/surrogate pair for a single code point/
16:24
<devsnek>
it would be kinda cool if `{ ...x, y }` binding created x as a copy of whatever was being matched
16:25
<devsnek>
sort of the reverse of a `{ ...x, y }` expression
16:29
<Bakkot>
devsnek: ... doesn't it?
16:29
<devsnek>
no
16:29
<devsnek>
it's not valid syntax
16:30
<devsnek>
rest binding element is only valid at the end
16:30
<Bakkot>
ah, sorry, yes
16:30
<devsnek>
at some point maybe i'll go check if it was left as future work or explicitly not wanted
16:32
<Bakkot>
there have been proposals that `[ ...x, y] = [1, 2, 3]` give you `x = [1, 2]; y = [3]`
16:32
<Bakkot>
which seems like a different thing than what you're proposing
16:33
<devsnek>
i wouldn't want to get into array bindings
16:34
<devsnek>
array bindings are tricky because the order of the bindings has to match up with meaningful behaviour about the order of the elements
16:34
<devsnek>
don't have to worry about that with object bindings
16:52
<devsnek>
i think the spec is missing the definition for the evaluation of AsyncGeneratorDeclaration
16:56
<devsnek>
oh nvm its grouped in as HoistableDeclaration
16:57
<annevk>
ljharb: FWIW, https://github.com/tc39/ecma262/issues/1524#issuecomment-613554699 the plan is not particularly detailed and shu suggested it did not include changing all existing occurrences of host in a #whatwg discussion
16:59
<ljharb>
annevk: ah k, what we'd discussed was changing all prose instances of host to implementation; i don't recall for sure, but we probably also discussed not changing hook names with "Host", to avoid churn
17:01
<annevk>
ljharb: again, not what shu told me in https://freenode.logbot.info/whatwg/20200409#c3606032
17:02
<shu>
the context for host->implementation per the last plan was particularly for the phrase "host-defined" vs "implementation-defined" and "implementation-dependent"
17:02
<shu>
not the bare word "host" vs "implementation"
17:02
<ljharb>
ah k
17:02
<ljharb>
ty for clarifying
17:03
<shu>
but there was enough unhappiness around that plan that i plan to bring it up again in the editor call anyway
17:04
<Bakkot>
annevk: re https://github.com/tc39/ecma262/issues/1524#issuecomment-613269942: would you also be OK with providing overridable abstract operations only for those things for which we are aware of some host which wants to specify the behavior?
17:05
<Bakkot>
because specifying a bunch of host ops which no one has any interest in using is a fair bit of work for no obvious benefit
17:05
<annevk>
Bakkot: at that point your are making a distinction some people think there is not
17:05
<annevk>
Bakkot: and I'd argue you're being inconsistent
17:06
<annevk>
Bakkot: if you don't want to acknowledge hosts and live in your vacuum, then don't acknowledge them (while still making things)
17:06
<annevk>
work*
17:07
<annevk>
if you want to be pragmatic, embrace all the text that acknowledges hosts
17:07
<Bakkot>
I agree it is mildly inconsistent, but the inconsistency does not particularly bother me. we're defining an API; only putting the things for which there is some consumer into the API is fine.
17:07
<annevk>
it bothers me because people keep saying a Host hook is equivalent to NaN stuff
17:08
<srl295>
Bakkot: for my understanding, what's the 'host' situation you are referring to?
17:08
<Bakkot>
srl295 context is mostly in https://github.com/tc39/ecma262/issues/1524
17:08
<Bakkot>
annevk: I don't understand what you mean by that; say more?
17:10
<annevk>
Bakkot: I think if you want to say that implementation and host are the same, you ought to actually remove the distinction and not only offer it to those who can read between the lines
17:11
<srl295>
Bakkot: Right, but you referred specifically to Unicode support on the host, which seems to be AWB's footnote 1, is that what you mean?
17:12
<Bakkot>
srl295 the Unicode conversation was totally unrelated to this conversation
17:13
<Bakkot>
annevk how is "change everything to say implementation defined, keep hooks in place for places where they are useful" not that?
17:13
<Bakkot>
annevk I guess mostly I fundamentally do not udnerstand what distinction you think there is
17:14
<srl295>
Bakkot: OK. carry on then… 
17:14
<Bakkot>
if the distinction is "suggest to implementors that there's another place to look for restrictions on something ECMA-262 does not specify", it seems like that proposal accomplishes it perfectly
17:14
<Bakkot>
if the distinction in your mind is something other than that, then I don't know what it is
17:17
<annevk>
What I'm saying is that implementation-defined with hook = host hook and implementation-defined without hook is implementation-defined, except now you made it more opaque.
17:17
<annevk>
So at that I'd rather have everything be a hook and let the host^Wimplementation decide who defines what
17:17
<Bakkot>
made it more opaque than... what? that's the current state of the specification.
17:18
<annevk>
Bakkot: the current specification talks about hosts a bunch
17:20
<Bakkot>
annevk in host hooks, yes. outside of host hooks, not really?
17:20
<Bakkot>
not in anything normative, that I can see, except for properties of the global object and "the host environment's current locale"
17:29
<annevk>
Bakkot: I'm including the non-normative material, that's somewhat relevant for this discussion I think
17:30
<Bakkot>
of the 166 usages of "host" in the spec, the only ones which are not describing host hooks, locale, or the global object (or values otherwise made available) are:
17:30
<Bakkot>
1. the [[HostDefined]] slot on realm, script, and module records
17:31
<Bakkot>
2. the Note about enumerate object properties not requiring a specific algorithm (which should definitely be changed to "host")
17:31
<Bakkot>
3. the `hostDefined` argument to ParseScript (which populates [[HostDefined]], and which is basically a host hook just in the other direction)
17:31
<Bakkot>
4. the prose in the example of cyclic module record graphs, which is about hosts calling ES abstract methods - again basically a host hook in the other direction
17:32
<Bakkot>
5. locale
17:32
<annevk>
"ECMAScript is an object-oriented programming language for performing computations and manipulating computational objects within a host environment."
17:33
<Bakkot>
6. "host-defined exceptions that can occur anywhere such as out-of-memory", which could be changed to "implementation"
17:33
<Bakkot>
7. host-synchronizes-with, which is basically a host hook
17:33
<Bakkot>
8. annex b's "when the ECMAScript host is a web browser"
17:33
<Bakkot>
that's the list.
17:34
<annevk>
It's a list for sure :-)
17:34
<Bakkot>
annevk that paragraph is very clearly (to me) about providing the global object or values otherwise made available and integration with host hooks, and nothing else.
17:35
<Bakkot>
I agree that 2 and 6 should change "host" to "implementation"
17:35
<Bakkot>
but other than that, how does this... not already give you what you want?
17:36
<Bakkot>
with the exception of 2 and 6, we use "implementation-defined" only for things which HTML and other hosts do not specify, to my knowledge
17:36
<Bakkot>
so what distinction do you want drawn that is not currently drawn?
17:37
<Bakkot>
specifically, that is not currently drawn by the dichotomy between things which are specified as host hooks and things which are specified to be implementation-defined?
17:37
<annevk>
Bakkot: it sounds like you might not have followed the issue where there's a bunch of talk about removing all instances of "host" as if it's a bad word
17:37
<Bakkot>
annevk I have read and commented on that issue
17:37
<annevk>
Then I'm not sure what to tell you
17:38
<Bakkot>
annevk _you opened that issue_
17:38
<Bakkot>
annevk I am trying to figure out _what you want_
17:38
<Bakkot>
I do not particularly care about AWB's theoretical purity concerns
17:38
<annevk>
I want the draft to go further in what it already does
17:38
<Bakkot>
in what way?
17:38
<Bakkot>
what change to the list above, or to the usages of "implementation-defined", are you looking for?
17:39
<annevk>
Distinguishing hosts and implementations, we might well agree 🙂
17:39
<Bakkot>
What distinction other than the one already there are you looking for?
17:40
<Bakkot>
Do you just want it to say "a host is the name for the thing which provides additional ambiently available values and defines the host hooks, an implementation the name for the thing which does everything else"?
17:41
<Bakkot>
or are you actually looking for some changes to our existing usages of "implementation" and "host"? and, if so, what changes?
17:42
<annevk>
Bakkot: I think the second paragraph in https://github.com/tc39/ecma262/issues/1524#issuecomment-600816056 is what would be ideal
17:43
<annevk>
Bakkot: provide host hooks and expectations around it and also provide a default host implementation (perhaps that can leave everything implementation-defined, but I'm not sure that would quite work since you have to setup agent clusters, agents, and realms in a certain order for things to make sense)
17:43
<ljharb>
I'm still not clear on why the "not html spec" should be distinguishing between "things individual html spec implementations can do" and "things only the html spec can do"
17:44
<ljharb>
the place to understand what all browsers, versus individual browsers, must do is the html spec. what am i missing about what you want to be in 262?
17:44
<Bakkot>
annevk two things: 1.) now that I've actually read through every usage of "host" and "implementation" in the spec, I don't actually think the two things are not distinguished
17:44
<annevk>
Bakkot: I agree with you on the status quo
17:45
<Bakkot>
specifically, they are distinguished by, we use host hooks + the global object for things HTML is expected to specify, and "implementation-defined" for everything else
17:45
<Bakkot>
and 2.) in what way does the "put links to the HTML spec where things are specified by the HTML spec" proposal not satisfy that goal?
17:45
<annevk>
Bakkot: well no, e.g. InitializeHostDefinedRealm says implementation-defined a bunch of times which is false
17:45
<annevk>
Bakkot: it's also a very bad hook
17:46
<annevk>
for any reasonable host
17:46
<annevk>
which ECMA-262 would realize if it tried to define a host pretty quickly
17:46
<ljharb>
do you think `InitializeHostDefinedRealm` should be more constrained?
17:47
<Bakkot>
annevk I am happy to change "implementation-defined" to "host-defined" in that abstract operation.
17:47
<Bakkot>
annevk are there other changes you would like to see?
17:47
<annevk>
ljharb: possibly, it should probably take parameters of sorts, it's very much unclear how to hold it
17:48
<annevk>
I think a good exercise would be for ECMA-262 editors to define a minimal host with the same rigor as ECMA-262 is defined and see where it breaks down
17:48
<annevk>
Aside from the obvious fail points such as agents there are others
17:53
<Bakkot>
annevk sure, I am willing to believe there are places things are underspecified or lack arguments. but other than "fix your bugs", which, sure, we are doing our best", I still do not know what actual changes you would like to see as a result of 1524
17:54
<Bakkot>
except I guess changing `InitializeHostDefinedRealm` to use `host-defined` instead of `implementation-defined`?
17:54
<Bakkot>
(or adding explicit host hooks to it instead of saying implementation-defined, or whatever)
17:59
<shu>
annevk: concretely there *are* things we disagree about for what's an implementation's purview vs what's a host's purview
17:59
<shu>
NaN is (i hope) uncontroversial, but we didn't see reason to preclude exponentiation from constrained by an upstream spec, for instance
18:00
<Bakkot>
yeah if some upstream spec asks for it I would happily add a host hook which says how exponentiation works more precisely
18:04
<devsnek>
PerformEval calls GetThisEnvironment
18:04
<devsnek>
if it was a direct eval, the running execution context was created by the builtin function [[Call]] method
18:04
<devsnek>
such an execution context has no LexicalEnvironment
18:05
<devsnek>
and then step 2.a fails
18:05
<devsnek>
2.a of GetThisEnvironment
18:05
<devsnek>
does that sound right
18:08
<shu>
there's a special case for direct eval in 12.3.6.1, step 6
18:09
<shu>
don't think it goes through the built-in function [[Call]]
18:09
<shu>
but maybe you still found a bug for indirect eval? not sure without digging deeper right now
18:10
<devsnek>
oh maybe i meant indirect
18:10
<devsnek>
the one where it actually calls %eval%
18:11
<devsnek>
i guess that's indirect
18:18
<Bakkot>
yeah, looks like that should be changed so that it's only performed for direct evals
18:19
<devsnek>
well it needs to be performed in either case right
18:19
<Bakkot>
no
18:19
<Bakkot>
the GetThisEnvironment call is just there to see if you get to do super calls or whatever
18:19
<Bakkot>
which you never get to do for indirect evals
18:19
<devsnek>
where does it say you can't
18:19
<Bakkot>
well, in principle, here
18:19
<Bakkot>
but it's bugged
18:20
<Bakkot>
but, like, try it and see
18:20
<devsnek>
oh you mean implementations don't allow it
18:20
<Bakkot>
yeah
18:20
<Bakkot>
and are not supposed to
18:20
<devsnek>
got it
18:21
<Bakkot>
(but the "not supposed to" is meant to be specified in PerformEval, and it's buggy, as you observe)
18:21
<devsnek>
https://gc.gy/54593505.png
18:22
<devsnek>
is the empty step implicit
18:23
<shu>
might be editorially clearer to reorder most of those steps
18:24
<shu>
unconditionally initialize in{Function,Method,DerivedConstructor} to false
18:24
<shu>
then subsume the current steps 5 and 6 under "if direct"
18:24
<devsnek>
seems legit
18:27
<devsnek>
https://github.com/tc39/ecma262/pull/1949
18:55
<Bakkot>
re: "is the empty step implicit": I would say no
19:16
<jridgewell>
Back to devsnek's `{ ...x, y }` syntax
19:16
<devsnek>
👀
19:16
<jridgewell>
We could add that, and it wouldn't be conflicting with the `[ ...x, y ]` syntax
19:17
<jridgewell>
Because `{ y, ...x }` already does what `[ ...x, y ]` is intending to do.
19:17
<jridgewell>
The patterns are like reverses of each other.
19:18
<jridgewell>
`x` would contain everything except the `y` in both cases
19:19
<jridgewell>
`[ ...x, y ]` would be different than ` { ...x, y }`
19:20
<jridgewell>
But if we tried to make the object rest match the array rest, then `{ ...x, y }` would be equivalent to `{ y, ...x }`
19:31
<ljharb>
what syntax do you mean?
19:32
<devsnek>
ljharb: <+devsnek> it would be kinda cool if `{ ...x, y }` binding created x as a copy of whatever was being matched
19:33
<ljharb>
in pattern matching?
19:33
<ljharb>
or like in general
19:33
<devsnek>
yeah
19:33
<devsnek>
in bindings
19:33
<ljharb>
isn't that https://github.com/zkat/proposal-as-patterns ?
19:34
<devsnek>
no it would just be an extension of current binding syntax
19:34
<devsnek>
oh is that what that is
19:34
<ljharb>
`{ ...x, y }` tho would be super confusing if it wasn't the same as `{ y, ...x }`
19:34
<ljharb>
yes
19:34
<devsnek>
neat
19:34
<devsnek>
`{ y, ...x }` and `{ ...x, y }` aren't the same as object literals
19:35
<devsnek>
dunno why bindings would have to be
19:36
<ljharb>
that's because the latter is an error
19:36
<ljharb>
if a non-error, i'd expect them to be the same
19:36
<ljharb>
oh in object literals
19:36
<devsnek>
neither of those are errors in object literals
19:36
<ljharb>
they're the same if `x` doesn't have `y` :-p
19:36
<devsnek>
ok but
19:36
<devsnek>
they aren't the same
19:37
<devsnek>
the order matters
19:37
<Bakkot>
yeah but that is very rarely a difference which matters
19:37
<Bakkot>
(and is also obviously the difference, from the syntax)
19:37
<ljharb>
and conceptually they're doing the same kinds of things
19:37
<Bakkot>
which properties there are matters a lot more
19:38
<devsnek>
its the same with bindings
19:38
<devsnek>
`{ y, ...x }` obj without y `{ ...x, y }` obj with y
19:40
<Bakkot>
I don't think that is obvious
19:40
<ljharb>
it's not obvious to me at all
19:40
<Bakkot>
also it would be really confusing if we had the `let [...x, y]` syntax mean the thing people have asked for it to mean
19:40
<devsnek>
i don't see how its any more or less obvious than the object literal
19:42
<ljharb>
because in the curly braces, the three dots syntax with x either means "grab everything into x except the other things mentioned" or "pull everything from x into this new object". having it mean "grab everything, even the other things mentioned" would be wildly confusing to me
19:42
<ljharb>
like `const { …x } = obj; const { y } = obj` seems *way* clearer to me than your suggestion
19:43
<devsnek>
why is it confusing for bindings to be unordered but for literals to be ordered
19:43
<devsnek>
er
19:43
<devsnek>
why is it confusing for bindings to be ordered when it isn't for literals
19:43
<ljharb>
in bindings, it's pulling things out of the object. in literals, it's smooshing things into it
19:44
<devsnek>
right
19:44
<ljharb>
when pulling things out, it's confusing for "y" to be pulled twice if it's only mentioned once
19:44
<ljharb>
iow, object destructuring currently only pulls each value once ever, or zero times
19:44
<devsnek>
when smooshing things in its confusing for y to be smooshed in twice if its only mentioned once?
19:44
<ljharb>
(unless you repeat it, actually, now that i think of it)
19:45
<ljharb>
i mean, `y` itself would only go in once
19:45
<ljharb>
a spreaded object's `y` would also go in, sure
19:45
<devsnek>
expression goes from 2y to 1y
19:45
<devsnek>
binding goes from 1y to 2y
19:45
<devsnek>
it's a symmetry
19:46
<ljharb>
not sure i get what you mean
19:46
<ljharb>
`const obj = { …x, y }` only has one `y` on `obj`
19:46
<ljharb>
`const { y, …x } = obj` only has one `y` binding
19:47
<devsnek>
`({ ...x, y } = { ...x, y })`
19:47
<ljharb>
i do see how in the former example, `x.y` and `y` might both exist but would still get smooshed into one `y`
19:47
<devsnek>
this symmetry
19:47
<ljharb>
right but that wouldn't be symmetrical
19:47
<ljharb>
because the original `x.y` value would be lost
19:47
<devsnek>
the shape
19:47
<devsnek>
not the identity of the values
19:47
<ljharb>
`x` would have the same shape as the RHS, sure
19:48
<ljharb>
but the point of destructuring is to take apart the shape
19:48
<ljharb>
to de structure it
19:48
<devsnek>
sort of?
19:48
<devsnek>
people use it for cloning too
19:49
<ljharb>
sure but that's not the point of the feature
19:49
<ljharb>
people use JSON for cloning, doesn't mean "cloning" is relevant to json
19:49
<devsnek>
i mean people use it to perform the operation it performs
19:50
<devsnek>
how that operation was meant to be used is kind of irrelevant
19:50
<ljharb>
i don't agree with that
19:50
<Bakkot>
devsnek: `[...x, y] = [...a, b]` is not syntax which currently exists, bu to me it has one obvious meaning: `x` gets `a`, `y` gets `b`.
19:50
<ljharb>
^ me too
19:50
<Bakkot>
devsnek: the same intuition tells me that `{...x, y} = {...a, b}` has the meaning `x` gets `a`, `y` gets `b`.
19:51
<devsnek>
right array literals have an coupling between the order of elements and the order of bindings
19:51
<devsnek>
you mean `{...x, b}`?
19:51
<Bakkot>
ah, sorry, yes
19:51
<Bakkot>
should've named the properties instead of using shorthand
19:52
<Bakkot>
`{...x, p: y} = {...a, p: b}` has the meaning `x` gets `a`, `y` gets `b`
19:53
<devsnek>
maybe its better if we leave it as a syntax error
19:53
<devsnek>
because i don't agree with that
19:56
<Bakkot>
the way I would put it is, `...` on the LHS means to me "every other thing", not "every other thing to the left of `...`", even though these are currently equivalent
20:03
<rkirsling>
+1
22:38
<devsnek>
jridgewell: why are the logical assignment operators in their own LogicalAssignmentOperator production
22:42
<rkirsling>
just for proposal readability
22:42
<rkirsling>
(see the note at the very top)
22:43
<rkirsling>
oh you mean operator
22:43
<devsnek>
hm
22:43
<devsnek>
i guess for the same reason
22:44
<rkirsling>
we mentioned needing to rename that to ShortCircuitOperator prior to merge but I thought that part was needed to avoid some AssignmentOperator implications
22:44
<rkirsling>
lemme check
22:44
<rkirsling>
*ShortCircuitAssignmentOperator, I mean
22:45
<rkirsling>
er yeah that's exactly it
22:45
<rkirsling>
there's only one RS for AssignmentExpression:LeftHandSideExpressionAssignmentOperatorAssignmentExpression
22:45
<rkirsling>
grr AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression even
22:45
<ljharb>
altho jridgewell, with the newest ecmarkup/grammarkdown, you might no longer need to mention it as a separate productiopn
22:46
<ljharb>
like, the inline `<ins>` might Just Work
22:46
<rkirsling>
but each short circuit assignment op has its own RS case
22:47
<devsnek>
so its going to be its own production
22:47
<devsnek>
not an AssignmentExpression
22:47
<rkirsling>
I mean it has to not be an AssignmentExpression at the very least
22:48
<rkirsling>
er
22:48
<rkirsling>
dammit
22:48
<rkirsling>
AssignmentOperator
22:48
<devsnek>
why
22:48
<rkirsling>
it *is* an AssignmentExpression
23:18
<devsnek>
can we rename NameSpaceImport to NamespaceImport
23:19
<ljharb>
yes please
23:19
<rkirsling>
lol that is a really irritating capitalization
23:19
<Bakkot>
import { mars } from space;
23:19
<rkirsling>
welcome to the Name Space
23:20
<devsnek>
:notlikethis:
23:22
<rkirsling>
it'd make sense in the sentence "`foo = 0` and `fox = {...}` are close in name space but not in value space"
23:48
<shu>
not as annoying as NamespaceImPort
23:49
<rkirsling>
ow
23:49
<rkirsling>
it hurts
23:51
<ljharb>
it's a good port
23:54
<rkirsling>
I mean if it's German then I'm okay with it
23:54
<rkirsling>
Namespace in dem Port