►
From YouTube: GitHub Quick Reviews
Description
Powered by Restream https://restream.io/
A
A
A
A
A
A
Hello
friends,
happy
afternoon
today
we
hopefully
stream
the
whole
thing
this
time
I
hopefully
have
enough
failover
that,
even
if
the
stream
breaks
up,
I
have
a
recording.
A
So
let's
start
with
some
time
zone
stuff
that
matt
offered
to
fill
in
for
tarik
matt.
Do
you
want
to
talk
about
it.
B
Sure
so,
we'll
start
with
this
one
49407.
This
is
sort
of
a
follow-on
to
a
pr
that
tarek
already
completed
regarding
conversion
between
the
windows,
time
zone,
identifiers
and
the
iana
time
zone
identifiers.
B
The
work
that's
been
converted
or
completed
already
is
such
that
the
existing
apis
can
work
with
either
set
of
ids.
So
if
you
call
find
system
timezone
by
id
and
you
pass
the
wrong
one
for
your
platform,
it
does
that
conversion
now
implicitly,
this
is
this.
Api
proposal
is
to
have
an
explicit
way
to
do
that,
because
there
are
various
apis.
You
might
be
interacting
with
that.
B
You
need
to
pass
one
form
or
the
other
specifically
so,
and
I
iterate
through
some
of
the
scenarios
further
in
the
thread
I'll
go
line
by
line
through
the
api,
so
the
first
one
is
a
boolean
has
iana
id.
Basically,
there
are
only
two
types
of
identifiers,
we're
concerned
with,
and
it's
either
a
a
windows
id
or
an
iana
id.
I
suppose
it
could
be
a
custom
built
time
zone,
but
then
I
has
ind
would
also
be
false,
so
we
didn't
feel
like
an
enum
was
appropriate
for
a
simple
bull.
B
The
the
reason
we
need.
It
is
so
that
somebody
knows
ahead
of
time
whether
they
need
to
explicitly
call
one
of
these
convert
methods
below
otherwise
they
would
have
to
always
call
them,
even
in
the
cases
where
they
didn't
need
it.
B
So,
basically,
we
have
two
directions
of
conversions.
We
have
from
miami
to
windows
and
from
windows
diana,
and
if
you
see
the
the
windows,
toyana
direction
has
an
overload
with
a
region
parameter
and
that's
because
while
there
is
a
one-way
mapping
from
an
ian
id
to
a
given
windows
id,
there
is
a
one-to-end
mapping
in
the
other
direction.
B
The
way
the
data
works
under
the
hood
is
there's
a
primary
zone.
They
call
it
the
golden
zone
in
in
icu
or
cldr
parlance.
So,
if
you
don't
specify
a
region,
that's
the
one
you
get
an
example
would
be.
If
I
pass
in
pacific
standard
time
as
a
windows
id
the
golden
zone,
is
america
los
angeles
for
the
iana
id?
B
Files
that
come
with
icu,
so
in
environments
where
we
have
the
full
icu,
then
we
can
do
the
conversion
in
either
direction.
So
that
would
be
windows
and
and
unix,
but
not
things
like
the
browser.
A
A
Right
but
there's
no
way
the
thing
would
throw
it
will
it
return
faults
or
it
will
work
right,
yeah.
The
only
reason
I'm
asking
is
because
you
have
an
attribute
to
mark
apis
as
windows
specific,
but
it
sounds
like
they
aren't
windows
specific.
It
just
is
depending
on
data
that
is
carried
by
the
app
or
the
framework
for
that
matter.
B
Right
and
there
are,
there
are
example,
cases
or
example,
scenarios
where
you
might
be
on
unix
and
still
be
working
with
windows
time
zones.
What
I
can
think
of
off
top
of
my
head
is
if
you're
working
with
sql
server,
it
has
a
timezone
functionality
that
is
windows
specific,
even
if
it
is
sql
for
linux.
C
B
False
has
iana
would
return
true,
because
it's
coming
from
timezone
info
would
be
coming
from
the
tz
data.
Again.
Alpine
doesn't
have
tz
data
by
default,
so
that
would
you
wouldn't
even
have
a
timezone
infill
without
it.
A
B
It
would
return
false
if
you
constructed
the
timezone
info
object
from
a
windows
id.
So
if
I
specific
so
regardless
of
which
platform
I'm
on,
if
I,
if
I
say
timezone
info
dot,
find
find
by
system
id,
I'm
going
to
get
a
timezone
info
object
back.
That
has
that
id,
even
if
there's
some
conversion
going
on
under
the
hood,
I'm
going
to
get
that
back.
B
So
I
might
be
on
linux
and
under
the
hood
we
might
map
to
america
los
angeles,
the
ian
id,
but
we're
still
going
to
set
the
id
property
to
the
one
you
asked
for
so
as
I
entity
would
be
false,
in
which
case.
If
I
need
the
windows
id,
then
I'm
going
to
have
to
say
well.
Does
it
have
the
id?
No,
it
doesn't.
So.
I
need
to
try
convert
iana
to
windows.
A
The
like,
if
people
write
basic
code
that
says,
and
it's
an
instance
property
right,
that's
correct:
it's
not
it's
not
a
because
it's
actually
tied
to
the
current
times
on
your
own
right.
So
the
the
idea
is
so.
If
I
say,
if
the
time
zone
info
does
not
have
an
iana
id,
then
I
can
then
I
have
to
call
one
of
the
static
methods
right
and
basically
other
k.
I
guess
what
I'm
trying
to
get
it
is
like
is
so
it
doesn't
sound
like
these.
A
B
Right
so
the
op,
the
alternative,
would
be
to
not
have
this
set,
of
instance,
boolean
and
static
conversions,
and
instead
you
would
have
instance,
methods
such
as
try
get
windows
id
try
get
in
id
which
tarek
and
I
discussed
and
felt
that
was
a
little
bit
cumbersome.
C
A
C
Just
making
sure
that
we're
using
iana
correctly
here
and
that
it
is
really
the
id
as
registered
by
the
internet
authority
on
names
and
at
whatever
the
other
is
addresses
and
that
it's
not
just
an
icu
id
or
or
whatever
is
it
so
iana
is
the
correct
term.
B
C
B
Right
since
it's
there's
a
there's,
a
whole
debate
about
whether
it
should
be
the
correct
term
or
not,
but
at
least
for
the
last
decade,
it
has
been
the
de
facto
term.
C
B
So
that's
also
complicated
in
that
windows
does
have
some
apis
that
are
using
ian
ids
and
it's
not
set
in
stone.
That
windows
will
always
use
its
legacy
ids
one
day
it
may
only
use
inids,
but
these
ids
do
not
exist
out
of
windows
so
calling
them
like
microsoft,
ids
isn't
quite
right.
The
best
term
we
have
is
windows
id.
C
Actually,
it's
more
than
that,
because
I
apologize
to
anyone
in
alaska
or
hawaii
and
guam.
F
C
G
Yeah
nullability
annotations.
G
B
It
that's
a
good
question:
it
could
just
it
could
just
resort
back
to
the
one.
Without
it
a
null
could
could
just
be
implicitly
the
same
as
not
providing
one,
but
that's
up
for
you
guys
to
decide.
I
guess
except
is
common
it.
It
makes
sense
like
maybe
I'm
I'm
calling
these
apis
in
bulk,
and
I
don't
want
to
have
to
put
my
own
if
no
I'll
call
one
version
of
the
api,
otherwise
not.
C
Then
then
it's
probably
a
bit
more
mainline
than
defaulted
parameters.
A
A
Well,
I
mean
there
was
like
you
know
before
we
had
tuples
right,
so
there
we
go
all
right
next,
one
that
looks
easy.
B
B
Going
back
to
the
original
design
of
adjustment
rule,
it
was
very
closely
modeled
to
the
registry
data
in
windows,
except
it
was
presumed
that
the
base
utc
offset,
would
never
change,
and
that
turns
out
to
be
false.
So
there
is
already
some
accountability
for
this
in
adjustment
rule,
but
not
by
a
field
that
is
exposed.
We
have
this
internal
field
called
base
utc
offset
delta,
which
tracks
the
delta
between
the
version
of
this
property.
That's
sitting
on
time,
zone
info
and
the
one
that
applies
to
that
rule.
B
B
The
one
on
time
zone
info
is
the
current
one
it
it
always
has
been,
but
if
it
changes
which
which
it
can
it's
not
the
one
that
was
in
effect
or
the
one
that
you
might
be
working
with
for
any
particular
conversion
operation,
it
is
the
current
one.
B
So
really
it's
it's
best
uses
for
like
calculating
a
display,
name
or
sorting
them.
The
one
on
adjustment
rule
is
fixed.
It
is,
though
it
is
the
one
that
applies
to
that
adjustment
role.
So
one
can
expect
that
if
you
look
at
the
applicability
dates
of
the
adjustment
rule
that
the
one
that
is
applicable
now
will
also
be
the
same
one
on
time.
Zone
info.
C
Yeah,
my
recollection
is
morocco
recently
changed
their
base.
Utc
offset
right,
but
let's
assert
that
they
did.
So.
If
you
ask
right
now,
the
time
zone
info
for
morocco
would
give
plus
one
or
wherever
there
and
but
if
you
ask
for
the
adjustment
rules
and
you
go
back
and
you're
looking
at
a
rule
that
was
only
active
five
years
ago.
B
Right
and
trek
has
a
good
example
here,
with
yeah
gakutsk
and
in
russia,
and
and
it
has
that
exact
situation.
Do
you
note
that
the
base
utc
offset
is
not
the
same
as
the
offset
that's?
In
effect,
we
have
a
method
for
that
on
times
and
info
already
called
get
utc
offset.
B
B
C
Right
arizona
decides
they're
done
being
based
off
mountain;
they
decide
they
want
to
jump
to
central,
so
the
arizona
time
zone
in
2022
changes
its
base
offset
to
minus.
C
I
can
do
this
six
yeah
five
five,
but
the
if
you
get
an
adjustment
rule
from
the
past,
it'll
say
minus
six,
and
so,
if
you're
doing
past
computations
you'll
be
wrong
or
future.
If
we
already
have
the
knowledge
that
the
rule
is
going
to
go
active
next
month,
so.
B
There's
actually
a
bill
in
the
us
senate
right
now,
it's
still
in
bill
status,
so
don't
panic
that
will
shift
all
of
our
standard
offsets
by
one
across
most
of
the
country.
But
this
could
happen
in
pacific
time.
For
example,
we
might
all
all
of
a
sudden
be
in
standard
minus,
seven
and
and
never
have
dst,
and
so
we
can't
you
know
we
would
look
at
time
zone
info
base,
ctc
offset
and
it
would
say
minus
seven
and
the
adjustment
rules
for
the
past
from
before
this
change
would
say:
minus
eight.
C
Yep
yeah,
it
makes
sense
to
me
I
think,
there's
probably
room
for
an
analyzer
that
says
basically
anybody
talking
about
the
current
one
on
time.
Zone
info
is
probably
has
a
subtle
bug,
but
I
don't
know
how
best
to
word
that
so
I'll,
just
let
that
float
around
in
your
head
and
almost
if
you're
doing
math
with
it.
It
seems
like.
E
B
A
C
Right,
yeah-
and
I
mean
even
my
recollect,
my
recollection
from
you
know,
15
years
ago-
is
in
linux
time
zone
info,
which
is
presumably
just
the
iana
ids.
There
was
a
there
was
both
america
los
angeles
and
a
like
utc
minus
eight,
and-
and
this
would
be
one
of
the
distinctions
is,
and
especially
if
the
us
and
canada
don't
agree
on
the
bill
that
if
it
passes
that
that
what
like
there
would
then
be
a
difference
in
america,
los
angeles
and
america
vancouver,
as
of
whatever
that
shift
date,
is.
B
Right
there
are
some
historical
differences
already,
but
currently
they
are
aligned,
and
so
presumably
they
would
delete
the
same
change
and
they'd
still
be
aligned,
but
either
way
you
could
have
you
know
an
adjustment
rule
in
the
future,
just
as
well
as
adjustment
rules
in
the
past.
It's
not
always
historical.
A
B
Be
ordering
matters
I
suppose
well,
we'd
have
to
make.
E
A
Yeah,
we
would
do
an
overload
that
just
basically
is,
and
we
should
probably
just
make
it
at
the
end.
So
for
just
you
know,
consistency.
C
What's
the
internal
one?
Well,
sorry,
the
internal
one
takes
the
delta.
Well,
there's
the
public,
create
adjustment,
rule
and
then
there's
internal
create
adjustment
rule.
The
difference
is
it
gives
the
base
utc
offset
delta
that
it
needs
in
order
to
properly
build
the
object
using
the
current
lack
of
public
api.
C
B
Yeah
right
yeah,
we
really
don't
want
the
delta
to
be
the
input
parameter.
It
should
just
be
the
offset.
The
delta
should
be
only
relevant
to
the
offset
that's
applied
so
like
normally
delta
is
either
z.
Daylight
delta
would
be
either
zero
or
or
one
hours
there's
one
time
zone
in
the
world.
That's
half
an
hour,
but
for
for
this
new
parameter
it
should
be
the
full
offset.
A
E
E
C
I
have
to
say
looking
at
what
the
data
that
they
have
right
now
from
the
current
create
adjustment
rule
makes
me
suggest
this
is
needs
to
go,
is
needs
more
info
to
make
sure
that
they
can
handle
existing
api
populating
this
member
without
causing
more
bugs,
because
it
doesn't
look
like
there's
any
way
that
they
have
a
chance
of
getting
this
data
populated
on
custom
adjustment
rules.
A
C
Right,
but
if
we
do
add,
you
know
the
analyzer
that
I
said
of,
if
you're
doing
math
with
basic
offset
off
of
the
time
zone
info,
then
that
would
lead
you
to
using
the
thing
that
may
now
be
simply
unset,
as
opposed
to
actually
being
zero.
So
nullable
would
convey
I'm
a
you
need
to
actually
go
back
and
use
the
other
one.
C
C
C
C
B
E
A
C
Yep,
okay,
so
we've
had
many
requests
over
the
years
for
things
like
you
know
why
don't
we
have
crc32
in.net
gur
I
have
to
define
it
in
every
different
project
that
I
work
on
and
that
combined
with
you
know,
some
other
reasons
means
we've.
This
is
floated
up
into
actionable
now,
so
the
basic
idea
is
that
the
screen
went
away.
C
So
the
proposal
starts
with
two
variants:
each
of
two
algorithms,
which
are
the
crc
and
xxhash
algorithms
and
looks
at
and
with
32
and
64-bit
versions
of
both,
not
that
we're
locking
ourselves
to
only
32
and
64-bit
versions,
just
that
those
are
the
commonly
used
ones
and
it
asks
what
would
a
what
would
the
family
of
this
look
like,
so
I
started
it
off
with
here's
the
things
we
like
the
low
concept.
C
So
in
order
to
make
sure
that
we
have
right,
there
are
then
two
main
scenarios.
One
is
one
shots
of
you
just
want
to
call
a
static
method,
get
the
answer
off,
of
an
amount
of
data
and
you're
done,
and
the
other
is
accumulator
patterns.
We
know
that
things
like
the
compiler
does
this
when
doing
has
this?
Has
the
file
content
changed
it?
It
doesn't
want
to
buffer
the
whole
file,
it
has
little
pieces,
it
wants
to
throw
them
in
a
piece
at
a
time
so
for
the
accumulator
patterns.
C
This
is
based
off
of
the
incremental
hash
type
from
crypto
hashes.
So
you
can
build
one
you
can
append
to
it.
You
can
reset.
You
can
ask
if
I
was
done
right
now.
What
would
the
hash
be
because
that's
the
thing
people
have
asked
for
and
or
you
can
say,
I'm
really
done-
give
me
the
hash
value
and
go
ahead
and
reset
yourself,
which
is
why
we
have
both
a
get
current
hash
and
a
get
hash
reset.
C
And
then
for
the
individual
algorithms,
so
each
each
class
should
only
represent
one
size
of
the
algorithm,
so
it
shouldn't
have
a
property
to
change
which
algorithm
variant.
It
is
because
that
usually
changes
an
initialization
condition
and
then
they
get
static
methods
called
hash
in
the
proposal
and
then
spanified
versions
thereof.
C
So,
let's
start
with
that,
and
then
we
can
talk
about
it
more
verbosely.
I
guess
there's
there
are
some
things
that
we'll
need
to
decide
because
they're
hard
to
decide.
One
is
how
we
want
to
distribute
this.
We
probably
have
usage.
C
C
I
included
just
above
the
current
screen
position:
three
different
names
that
were
suggested
in
the
thread
which
is
system
buffers
system,
buffers,
hashing
system,
io,
hashing
and
system
hashing.
I
liked
buffers
best,
so
it's
the
one
that
I
put
as
a
strawberry
and
then
the
base
class.
We
don't
expect
anyone
to
ever
really
take
this
as
a
parameter.
It's
really
just
here
for
making
sure
that
we're
letting
us
write
one
implementation
of
the
things
and
making
other
algorithms
be
easier
to.
C
They
only
have
to
override
three
abstract
things,
and
so
we
went
with
the
extraordinarily
reverse,
verbose
and
specific
non-cryptographic
hash
algorithm.
As
the
strawband
all
right
questions
comments,
knife
fights.
A
C
So
for
things
like
sha-1
and
md5,
we
certainly
can't
rename
space
the
class
and
re-architect
them.
This
is
for
things
that
were
always
designed
to
never
be
cryptographic.
A
G
H
Good
example:
yeah.
G
H
Header
that
has
md5
for
for
signing
purposes.
G
So,
jeremy,
so
I
first
about
the
name.
I
I
think
the
name
name's,
probably
fine,
honestly,
because
hash
algorithm,
just
by
itself,
I
think,
implies
cryptographic,
as
you
had
you
know
mentioned
so
having
this
prefix
on
the
name,
I
think,
is
appropriate
kim.
Are
you
open
to
suggestions
about
other
naming
stuff
right
now,
or
did
you
want
to
talk
about
something
else.
G
Sure
so,
the
the
initial
comment
that
I
had
two
comments.
First,
on
the
on
the
low
level
proposal
length
property
to
me,
I
think,
is
a
little
ambiguous
because
it's
it
could
mean
either
the
digest
length
or
the
length
of
all
the
data
that
I
fed
to
it
so
far,
so
I
think
just
calling
it
hash
length
or
digest
length
or
something
along
those
lines
would
be
less
ambiguous.
G
The
second
thing
that
I
wanted
to
call
out
was:
I
I
wonder
if
there
is
a
scenario
for
having
for
having
just
a
git
hash
and
destroy
as
opposed
to
get
current
hash
or
get
hash
and
reset
what
I
mean
by
that
is,
if
you
imagine
an
algorithm
like,
like
the
shaw
family,
for
instance,
whenever
you
get
the
hash,
they're
actually
mutating
their
underlying
buffers.
In
order
to
do
that
final,
computation
and
mutating,
the
underlying
buffers
means
you
have
to
make
a
copy
of
the
state.
G
If
you
think
that
you
might
need
to
go
back
to
that
state
in
the
future,
such
as,
if,
if
another
call
to
append
comes
in,
if
the
only
abstract
methods
that
we
have
here
are
get
current
hash
and
reset,
then
there's
no
way
for
the
class
to
make
an
optimized
just
get
hash.
And
then
you're
done
version
of
the
method
and,
if
usually
so,
you're
saying
just
expose
it
as
as
its
own
method,
not
using
the
low
level
apis.
C
Right
so
so
the
current
thing
has
get
current
hash
core
as
a
protected
member,
so
getting
the
current
one
which
for
most
algorithms
will
require
cloning.
Your
state,
because
once
you
add
the
final
length,
you
will
have
corrupted
it
so
that
one
is
abstract,
because
you
have
to
do
it.
Git,
hash
and
reset
can
be
implemented
in
terms
of
that,
but
it's
on
the
full
proposal.
That's
actually
a
protected
member,
because
to
allow
you
to
intercept
that
and
then
just
set
a
boolean
that
says.
G
C
Yeah,
just
so,
you
need
the
extra
state
of
the
dirty
bit
that
says
that
the
next
call
to
get
current
hash
or
get
hash
and
reset
or
append
needs
to
go
back
through
the
initialization
phase.
If
you
don't
want
to
pay
that
cost,
but
we've
seen
from
hash
algorithm
instances
that
people
really
like
pooling
objects
and
so
having
we
could
make
reset
be
an
explicit
step.
Again.
I
started
with
what
we
had
on
incremental
hash,
which
is
based
on
the
complicated
way
that
hash
algorithm
when
it's
an
eye,
crypto
transform,
behaved.
C
G
C
Yeah
I'll
also
note
once
you've
pointed
out,
the
length
length
was
supposed
to
be
the
hash
output,
size
and
bytes,
and
then
the
sample
I
said
crc32
is
about
eight
times
bigger
than
it
really
is
so
clearly
it
should
be
called.
I
H
Well,
I
mean
okay,
that
that
assumes
the
point
is
just
first
hashing
personally,
I
prefer
system.io
for
this.
A
I
mean,
I
would
say,
like
I
think,
if
you
introduce
a
new
namespace,
they
all
have
discoverability
issues,
because
you
have
to
know
to
type
the
namespace
name
right.
So,
like
I
think
in
practical
terms,
people
will
probably
find
the
type
name
before
they
find
the
namespace
name,
no
matter
what
we
do
and
given
that
you
know
I
have
cross
namespace
completion.
I
think
if
you
can't
find
it
in
the
usual
places
you
just
do
control,
jj
and
type
c
or
c32,
and
then
whatever
completion
shows
up.
A
A
I
System
io
at
least,
is
the
last
place.
I
would
expect
to
look
buffers,
I
think,
is
a
little
bit
closer.
I
would
think
system
hashing
or
even
system
numerics
would
be
closer
places.
If
I,
if
I
was
looking
for
hashing
algorithms,
I'd
look
for
hashing
or
numerics
before
buffers
and
io
would
be
the
last
place.
I
would
check
so
I
mean.
A
A
C
One
of
the
earliest
proposals
was
system,
numerix
hashing
and
you
know,
I
think
the
only
reason
I
didn't
put
it
in
the
list
here
is
at
this
point
system.
Numerics
really
feels
like
it's
about
vector
of
t
and
we.
I
We
have
been
expanding.
We
have
been
expanding
that
big
integers
there,
which
is
frequently
used
in
hashing
algorithms
as
well.
We've
got
bit
operations
which
has
the
primitive
crc32
algorithms
or
will
as
soon
as
we
they've
been
implemented.
They've
been
approved
already,
so
it
does
kind
of
fit
in
the
scheme
of
things.
It
definitely
was
originally
for
like
vector
types,
but
we
have
expanded
it
to
include
complex,
big,
integer
and
other
numerically
oriented
things.
H
So
I
I'd
object
to
that.
Simply
because
of
the
word
numerics
I
mean
people
don't
think
in
terms
of
the
output.
Often
they
think
I
want
to
there's
there's
a
bunch
of
things
where
you're
going
to
end
up
crc
32
in
a
string
or
or
something
of
that
elk
and
having
something
that
acts
on
strings
inside
system.numerics
feels.
I
H
C
I
mean
to
me:
it's
really
like
the
part
where
numerix
makes
sense
is
not
so
much
the
implementation.
Is
it's
basically,
if
you
let's
say
that
we
do
take
a
terrible
thing
which
takes
in
a
string
instead
of
bytes
and
where
you
have
the
concept
of
your
crc
32
and
a
string.
What
hash
codes
do
is
turn
things
into
numbers,
so
anything's
the
domain.
The
number
is
the
output.
C
G
Sure
does
it
is
there
ever
a
world
in
which
we
would
want,
like
the
the
base
abstractions
to
exist
in
a
hidden
name
space,
but
for
the
friendly
apis
like
crc32,
and
what
not
to
exist
in
a
more
common
name,
space.
I
Well,
rust
has
standard
hash,
hash
and
they've
got
a
hasher
trait,
which
is
basically
like
an
interface.
They
use
for
defining
things
c,
plus
plus
is
doing
system
hash
for
theirs.
A
Garbage
heap
number
one
yeah,
I
don't
know
like
I
mean
I'm,
I
think
I'm
fine
with
system
I
o
hashing
as
well.
I
mean,
if
people
I
don't
know,
I
I'm
probably
similar
to
barry-
I
very
much
dismissed
hashing
as
a
second
level
bomber.
What
do
people
think
is
that
it
should
be
elevated
as
a
top
level.
Namespace.
G
B
I
G
A
C
We
certainly
can
it's
the
nice
thing
about
the
the
builder
pattern
is
or
the
the
instance
methods
is
we
get
to
write
one
implementation
of
append
stream,
which
just
calls
you
know
reads
a
little
bit
and
then
calls
the
abstract
append
read-only
span.
C
If
we
do
it
as
the
static,
then
every
algorithm
has
to
write
it,
because
it's
a
pattern.
Unless
we
have
static
interfaces
by
the
time
we
ship
this,
in
which
case
it
still
looks
like
a
pattern.
If
we
make
it
net
standard.
A
G
C
I
don't
think
so,
because
it's
really
just
going
to
show
that
there
are
four
proposed
classes
and
sorry
four
proposed
non-abstract
classes,
one
abstract
class
and
then
it's
going
to
show
how
complicated
things
are,
because
they're
all
spanified.
I
I'm
asking
because
for
the
bit
operation
crc32,
I
think
we
have
the
default
one
being.
What
is
technically
crc
32c,
which
is
the
castagnoli,
and
so
it
uses
a
slightly
different
prime
in
its
input.
I
C
Yeah
I
mean
if
there
are
two
in
addition
to
two
sizes:
if
there
are
two
variants
of
crc
that
are
in
common
use,
then
we
can
expand
this
to
be
both
crc,
32
and
crc32c
and
then,
but
if
we're
using
crc32c
for
the
bit
operations,
then
I
agree.
We
should
call
it
crc32c.
I
So
we
did,
we
did
the
we
did
the
c1
with
bit
operations,
because
that's
the
one
that's
common
to
both
intel
and
arm
intel
amd
and
arm
arm,
however,
also
exposes
support
for
the
non
c1,
and
then
we
didn't
expose
that
in
bit
operations
today,
but
we
left
it
open
to
be
able
to
expose
in
the
future.
G
I
C
Yeah
granted
it's
a
different
proposal,
but
based
on
the
tangent
here,
I
it
sounds
like
the
one
embed
operations
should
have
the
c
suffix.
If
that's
the
standard
name
of
the
algorithm,
using
that
variant.
C
And
again
I
picked
crc,
32
and
64,
because
I
know
office
has
used
them
in
their
file
formats
for
years
and
that
I've
seen
many
requests
for
them.
I
personally
wasn't
aware
that
there
was
a
variant
using
an
extremely
similar
name.
C
And
we
can
add
the
others
as
necessary
again.
This
is
basically
about
making
a
template
that
we
would
follow
for
any
time
that
we
want
to
have
another
inbox,
hash,
algorithm
or
a
standard
ub
hash
out.
C
I
agree
with
tanner,
I
wouldn't
look
there.
I
agree
with
emo.
C
G
I
would
say
it's
in
system
runtime,
intrinsics
or
whatever.
I
A
H
A
Able
to
say
have
you
met
barry
I
mean
I
I
think,
but
I
think
it's.
We
all
seem
to
agree
that
the
actual
name
doesn't
matter
as
much,
because
you
can
always
complete
it,
but,
like
I
think
it
just
has
to
like.
You,
have
to
look
at
the
name
and
the
name
has
to
make
sense,
but
I
think
they
all
kind
of
have
that
property.
It's
just.
We
have
to
pick
one
place.
I
kind
of
agree
with
levi's
earlier
comment,
although
it's
we
can
treat
it
as
a
peer
to
compression.
A
It's
also
not
completely
inconceivable
that
we
could
have.
You
know
a
non-cryptographic
hash,
algorithm
stream
that
takes
an
underlying
stream,
takes
an
algorithm
and
then
as
you're
sucking
data
through
you're
getting
the
hash
as
an
output,
for
example
right.
So
we
could
add
this
feature
in
the
future.
So
it's
not
entirely
inconceivable
that
we
actually
have
a
stream.
That
does
something
sensible.
C
Here
we
could,
I
think
that
stream
is
one
of
the
hardest
types
in
dot
net
to
use
and
that
I
don't
know
that
I've
ever
seen.
Anyone
get
it
right
on
the
first
try,
but
this
is.
C
H
C
Well,
I
mean
that's
the
question
of
how
are
we
distributing
it?
It'll
probably
be
system.io.hashing.dll
and
netstandard2o,
but.
H
H
A
H
C
Yeah
anyway,
like
so
the
the
fact
of
you
know
who's
asking
for
this
is
why
I
expect
oob
is
desired.
Yeah.
I
personally
don't
have
a
horse
in
this
race,
so.
A
Yeah
I
mean
practically
speaking,
I
mean
levi
has
a
point
that
you
know
the
dll
name
probably
should
be
somewhat
related
to
the
namespace
name,
but
like
I
think
that
ship
has
celtin.net
a
long
time
ago
where
basically
things
are
completely
arbitrary.
At
this
point,
so
I
don't
actually
care
what
the
namespace
is
in
relationship
to
the
assembly.
That
can
be
completely
disjoint
as
far
as
I'm
concerned,
because
whatever
we
do
is
all
referenced
right.
A
No,
I
mean
like
if
it's
inbox
right
so
like
I
mean
I
don't
really
care
about
the
uber
experience,
because
the
uber
experience
is
always
going
to
be.
Somebody
has
to
tell
you
what
package
to
install
like
you
will
not
be
able
to
find
this
by
just
completing
you
know.
If
you
want
to
target
that
senate
too,
you
have
to
do
some
research
on
that,
but
like
if
you're
now,
building
a.net,
7
app
or
dot
net
six
app
and
you
want
to
use
crc32.
A
What's
the
experience
you
want
to
give
people
right
and
the
ideas
you
type
crc32
may
tell
you
like
yeah
using
this
namespace,
please
right
so
so
longer
namespace
makes
sense
and
it's
not
system
dot.
Barry's
favorite
stuff,
like
I
think
it's
fine
and
I
feel
like
system
buffers.
I
o
sorry
system
buffers
hashing.
Does
it
system
io
hashing?
Does
it
so
it's
just
like
whatever
we
pick,
let's
just
pick
one
and
go
with
it.
C
Yeah
david
or
stefan,
if
you're
on
the
call
I
can't
see
past,
I
can't
see
all
the
participants.
Do
you
use,
xx,
hash
or
crcs
in
asp.net?
Would
it
get
pulled
into
your
shared
framework
automatically.
C
All
right
I'll
take
your
word
on
it,
barry
yeah!
So
since
we
don't
have
any
internal
usage,
unless
compression
actually
needs
it,
I
think
that
it
would
be
if
it's
ub,
it's
full
lube.
I
don't
think
we
would
end
up
in
the
at
least
in
six.
I
don't
think
we
would
end
up
with
the
it's
both
in
and
out
of
the
box.
H
A
Like
in
practical
terms,
it's
less
about
patching
it's
more
about,
can
you
evolve
this
thing,
or
is
the
api
shape
immediately
frozen
right?
So
if
we,
if
we
ship
it
inbox
and
let's
say
some
existing
assembly,
and
then
we
expose
it
as
an
oop
that
just
means
the
oop
can
never
evolve.
So
if
we
add
a
new
algorithm
like
you're
screwed,
basically,
so
the
thing
is,
if
you
want
to
evolve
it
basically
because
we're
saying
we
start
with
your
minimal
approach
and
then
you
know
early.net
seven
we
decide.
A
Oh,
no
people
are
asking
for
xxx
hash,
32.
C
Is
the
full
proposal
here
and
then
we
can
talk
about
the
optional
things
at
the
bottom,
but.
A
Oh,
I
see
a
little
concept
versions
just
for
the
reviewers.
I
see
yeah
so
but,
like
I
mean
you
could
imagine,
we
had
another
algorithm.
I
don't
know
like
I
just
make
stuff
up
now,
like
the
immor
64
or
whatever
right
so
now.
Are
you
okay
with
saying
you
can't
anymore?
I
don't
know
like
that's
why
it
might
be
preferable
if
we
can't.
H
I'm
certainly
okay,
you're
saying
no.
You
can't
have
an
immo
hash,
but
no,
but
in
general
now
I
take
your
point
and
I
think
this
will
probably
open
the
floodgates
a
little
for
people
watching
wanting
more
of
the
the
slightly
weirder
hashes.
C
I
mean
I
think
that,
like
as
long
as
we're
not
doing
complicated
things
like
projections,
if
we
do
because
we've
had
the,
I
think
we
figured
out
how
to
be
successful
with
a
thing
that
is
both
inbox
and
ub
as
long
as
it's
not
a
projection
right.
But
it's
if
we
put
the
implementation
in
wherever
vector,
64
lives
right
now,
and
then
we
just
make
a
new
ub
for
the
for
the
ref
target,
like
that's
when
we
get
into
trouble
and
can't
rev
things
anymore,
so
I
think
it
could.
C
I
think
it
would
be
fine
as
a
full
ube,
even
if
it
ends
up
being
hybrid
later.
A
C
Yes,
the
original,
the
the
basically
minimum
viable
product
for
the
start
of
this
is
a
total
of
four
public
classes.
Four
instantiable
classes,
crc32
crc64,
xx,
hash,
32
and
xx,
64.
C
I
I
imagine
that
when
we
eventually
expose
int
128
and
you
want
un128
and
I'm
sure
that
it
will
happen
eventually
as
more
modern
languages
are
supporting
it
now,
I
imagine
users
will
want
things
like
cityhash128
and
stuff,
so
I
think
we
should
leave
it
open
in
the
future
for
for
the
possibility
in
the
future.
C
Sure
the
only
reason
I
said,
add
xx,
hash,
128
right
now
is
just
so.
It
doesn't
look
like.
We
believe
that
everything
needs
to
be
32
or
64.,
but
yeah.
This
is
that's
why
the
length
is
a
yes.
That
is
why
the
length
is
a
property
and
the
output
is
bytes
instead
of
a
concrete
numeric
type.
Also
it
gets
to
avoid
the
problem
of
indian-ness,
but
but
yeah
right
now,
all
the
ones
that
are
proposed.
C
G
I
I
G
I
Yeah,
basically,
because
today
we
do
not
have
a
way
to
represent
in
a
single
span
or
array
more
than
two
billion
elements,
but
in
practice,
particularly
with
hashing
and
things
like
isos
you're
likely
going
to
be
feeding
in
more
than
2
billion
bytes.
And
so
it
may
be
important
to
be
able
to
know.
F
C
I
Right
but
in
most
cases
that's
just
going
to
be
count
plus
equals
length.
G
I
I
C
That's
that's
called
a
hash
code.
Length
is
the
simplest
hash
code.
Anyone
has
ever
invented,
but
the
yeah
I
mean
it
feels
a
little
weird
I
mean
again.
We
could
certainly
do
it.
Append
becomes
a
protected
append
core
and
we
we
just
would
add
on
the
thing
reset
would
reset
it
back
to
zero,
but
it's
it
feels
weird
to
me
because
you're
calling
basically
it's
a
property
that
shows
the
side
effects
of
how
much
appending
you
did
it
just
is
weird
and
the
static
versions
won't
do
that.
H
A
Yeah
I
mean
just
to
like
play
the
difficult
here.
I
kind
of
agree
that
it
doesn't
seem
very
common,
but
it's
a
decision
we
can
make
only
once
right,
because
if
we
ever
wanted
the
length
now
it
will
be
a
pain
in
the
ass.
If
we
want
to
add
this
later
because
of
the
way
the
the
virtuals
are
basically
structured
in
this
type,
so
that's
a
decision
we
have
to
now
make
and
be
very
sure
that
we
get
it
right.
G
Indeed,
not
not
necessarily
because,
as
one
of
the
things
that
I
had
asked
about
earlier
is
like,
why
can't
we
put
blah
blah
method
on
the
base
class
and
jeremy's
like
we'll
just
add
it.
On
the
drive
class,
I
mean
the
derived
class
can
always
have
its
own
number
of
bytes
that
you
fed
me
properly
if
it
really
wants
to.
If
the
derived
class
is
already
keeping
track
of
that.
A
A
C
I
mean
we
technically
can
we
could
make
ourselves
be
open
to
the
concept
in
the
future
by
not
having
public,
abstract
members
right
at
the
moment
we
make
append
the
current
public
opinion
to
be
append
core
and
the
public
reset
be
reset
core.
C
We
now
have
the
ability
to
control
you
went
through
like
we
called
a
pinned
core,
you
didn't
throw
we
increment
the
bytes
consumed
property
and
oh
reset
got
called
you
didn't,
throw
we
reset
it
back
to
zero
like
we.
We
can
certainly
do
that.
I
made
them
public
and
abstract,
because
there
was
no
input,
validation
and
no
comment.
No
base
class
state
manipulation,
but
if
we
want
to
reserve
the
right
to
reserve
to
modify
state
in
the
future,
we
would
just
template
method,
template
method
pattern
them.
C
E
G
A
A
A
So,
like
I
mean
by
just
doing
the
append
core
and
reset
core,
you
basically
are
opening
yourself
up
to
saying
sorry,
we
we
do
have
not
sorry
like
we
basically
have
a
facility
to,
for
example,
count
the
bytes
or
do
some
validation
or
whatever
common
code.
You
want
to
have
right,
and
so
arguably,
if
stream
would
have
done
that,
maybe
stream
wouldn't
be
such
a
disaster
to
subtype
right.
G
C
Right
so,
if,
if
levi
or
let's,
let's
say,
barry
made
a
hashing
algorithm
that
took
append
string,
if
that
one
calls
that
encoding
and
then
calls
append
versus
append
core,
we
would
get
different
results
in
the
future.
If
we
were
trying
to
capture
the
number
of
bytes
that
were
processed.
F
What
should
we
expect
to
add
in
the
future,
hashing
seems
to
be
a
fairly
well
understood,
rote
thing
at
this
point:
do
it
can
we
reasonably
think
of
what
additional
features
we
would
have
a
pen
to
accomplish
attend,
or
you
mean
additional
overloads
or
what
well
append
versus
append
core?
What
what
would
we
make?
What
would
we
do
in
append
beyond
this
length?
You
know
lengthen
bytes
property.
C
Bytes
consumed,
I
think,
would
be
the
name
that
we
would
go
with
to
match
yeah
what
the
standard
methods
would
have
done,
but.
G
A
So
what
I'm
hearing
is,
we
don't
think
the
scenario
is
common.
We
don't
think
we
need
it
anywhere
else
and
we
believe,
even
if
we
had
the
append
core
and
reset
core,
we
might
corner
ourselves
anyway
due
to
breaking
changes
so
that
that
seems
to
suggest
that
we
don't
do
a
pen
core
and
reset
core,
and
we
also
don't
expose
the
length
or
the
sorry
the
input
length.
C
C
But
I
I
do
agree
with
the
the
notion
that,
while
it
gives
us
the
ability
to
do
it
to
simply
to
anybody
who
just
overrode
the
minimum
number
of
things,
they
would
work
if
they
were
additive
than
the
way
that
they
called
themselves
then
becomes
room
for
bugs
granted.
It's
their
bug
instead
of
our
bug.
But
it's
still
a
button.
A
C
C
G
A
Yeah,
I
guess
the
saving
grace
here
is
that
it's
pretty
straightforward
but
like
we
still
don't
have
a
delegating
stream
right,
but
that's
because
we
have
multiple
ways
to
read
and
multiple
ways
to
write.
So
it's
kind
of
hard
to
write
that
code
now,
but
this
one
has
a
single
way
to
get
data
in
so
that
maybe
that's
that's
good
enough.
F
Yeah,
I
don't
think
the
argument
of
90
of
the
time
you
call
it
it
returns.
Synchronously
is
a
thing
anymore,
because
we
have
value
task
doing
so
many
things.
I
I
feel
like
the
consideration
for
value
task
is
now.
A
C
F
A
C
And
that's
that's
why
my
proposal,
the
default
proposal
does
not
include
static
methods
for
streams,
because
it
creates
a
lot
of
work
that
has
to
be
replicated
in
every
class.
Granted
we
could
help
arise
it
to
actually
instantiate
the
type
and
just
call
the
other
one,
in
which
case.
Why
did
we
do
that?
But.
F
A
C
C
The
what
I
had
already
had
is
the
proposed
alternative
of
hash
length
and
bytes.
Okay,
so.
C
To
the
property
and
the
constructor
parameter,
yep
yeah,
and
so
then
the
yeah.
So
there's
the
three
abstract
methods
append
the
read-only
span
of
bytes,
abstract,
reset
and
abstract
get
current
hash
core,
which
again,
that
is
without
resetting
yourself,
give
the
hash
as
if
we
called
get
hash
and
reset
and
then
at
the
bottom
of
the
class
in
the
full
proposal.
C
G
C
G
C
Yeah
great,
but
for
allowing
of
more
complex
types
in
the
future
of,
I
feel
that
either
xx,
hash
or
city
hash
has
a
1024
variant
of
like
they're,
a
little
bigger.
Maybe
they
care,
but
again
resetting
usually
just
means
you're
blitting
over
a
thing
with
your
your
seed
state
value
like
it
isn't
really
hard,
and
so
we
could
get
rid
of
it.
I
just
left
it
here.
As
you
know,
it's
it's
my
nod
to.
Why
are
we
doing
wasted
work.
C
C
Yeah
so
there's
get
current
hash
and
get
current
hash
and
reset
spanified
versions
thereof
and
then
on
the
statics
or
then
on
the
non-abstract
types.
I
have
binary
returning
hash
and
try
hash
and
int
returning
hash
fill,
which
is
just
called
hash,
and
I
did
not.
I
moved
it
to
the
optional
addendum
and
my
recommendation
is
to
not
do
it
support
statics
for
streams,
because
there's
not
a
good
way.
We
can
code
share
them.
G
Yeah
at
most,
what
we
might
want
to
do
if
we
ever
want
to
support
something
like
stream.
Something
like
a
static
in
the
future
there
is
is
similar
to
what
we
did
with
the
crypto
apis
and
just
have
like
non-cryptographic
dot
hash
pass
in
like
an
enum
that
corresponds
to
the
hashing
algorithm
that
you
care
about
or
an
enum
string
or
something,
and
then
the
stream.
And
then
we
just
have
a
joint
switch
statement
inside
of
it.
C
G
It's
not
it's
not
optimal.
It's
just
making
the
music.
C
C
And
that
completes
did
I
have
the
cancellation
token
on
the.
D
C
C
Oh
yeah
morgan
had
that
as
a
thing
I
forgot
to
update
the
proposal.
Yeah
get
hash
code,
browsable,
never
throwing
an
obsolete,
which
is
what
we
did
on
system.hashcode.
G
C
G
G
Yeah,
that's
that's
what
hashcode.hashcode
does.
J
A
C
Which
is
again
yeah
why?
I
think
we
left
it
off
of
system.hashcode
there.
If,
if
we
made
it
work,
it
would
be
every
time
you
changed
it,
it
would
change
or
every
time
you
called
a
pen,
it
would
change.
So
now
we
can
go
with
the
longer
message:
use,
get
current
hash
or
get
hash
and
reset
to
get
the
current
hash
and
or
reset.
C
A
J
A
All
right,
then,
a
comment,
and
we
have
35
minutes
to
do
something.
I
A
Oh,
I
need
to
it's
not
an
api
review
list.
Apparently.
J
H
Stack
so
so
yeah
there's
there's
a.
I
can
see
this
opening
the
floodgates
for
people
who
want
more
of
the
the
weirder.
H
Well,
let's
read
the
most
non-cryptographic
hashes
are
weird,
but
some
of
the
ones
where
there's
no
actual
real
standard
for
it's
like
here's,
your
here's,
your
reference
information
and
see
good
luck,
but
yeah,
keeping
it
at
least
ooh
everywhere,
will
give
us
the
time
to
like
stabilize
and
get
more.
You
know
if
we
have
demand
for
more
more
hashing.
We
can
get
those
in
quicker.
J
C
The
current
expectation
is
nothing
in
in
net
runtime
or
the
asp.net
composed
shared
runtime,
we'll
ever
call
this
sorry
not
ever,
but
as
of
six.
There
are
to
be
no
calls
into
this.
Okay.
G
J
C
J
I
mean
like
I,
there
are
random
usages
of
non-cryptographic
hashing
in
throughout
the
framework,
so
I
wanted
to
make
sure
that,
like,
for
instance,
if
we
decided
that
we
needed
to
using
it
internally,
we
could
probably
get
away
with
unless
we
wanted
to
put
it
in
korlib.
But
but
definitely
if
we
started
exchanging,
then
that
will
get.
C
H
H
I
I
A
H
Yeah
I
mean
the
problem
with
that
lagging
has
always
been.
There
have
been
no
implementations
that
are
standardized,
so
this
is
this.
Is
you
know
the
the
uses
that
jeremy
into
that
before
you
know,
for
our
internal
move
to
move
away
from
any
use
of
sha-1?
It's
become
a
lot
harder,
because
we
now
have
no
known
cryptographic,
hashing
algorithms,
that
are
implemented.
C
Yes,
there
is
still
the
asterisk
and
berry
statement
of
things
that
are
required
by
spec
in
order
to
use
one
such
as
public
key
token
have
the
other
kind
of
exemption,
but.
A
H
C
I
mean
I
am,
I
am
expecting
honestly
that
someone
else
and
kevin-
don't
let
it
be
you
you
do
way
too
much.
Other
important
work
for
me
that
someone
else
will
jump
on
this
long
before
I
get
a
chance
to
get
to
it,
but.
G
A
D
G
H
G
Hi
hi,
so
this
is
this
is
a
request
from
the
orleans
team.
Basically,
they
are
in
the
process
of
moving
their
stuff
off
of
binary
formatter
hooray,
but
they
have
an
issue
that
they're
running
into
where
they
want
to
send
across
the
wire,
not
just
the
data
inside
of
a
dictionary.
But
what
compare
was
this
dictionary
using
and
it
turns
out?
That's
not
actually
a
very
straightforward
question
answer,
because
we
have.
G
We
have
a
concept
of
built-in
compares
in
the
framework.
Stringcompare.Org
no
string,
compare
dot,
ordinal
ignore
case
and
so
on,
but
there
are
other.
There
are
other
comparers
that
are
not
the
exact
instances
returned
by
those
singletons
that
still
have
basically
equivalent
behavior
when
dictionaries
hash
sets
and
others
are
constructed
around
them.
So
what
this
api
is
proposing
is
a
way
for
you
to
take
an
equality,
compare
and
query
hey
string.
G
Compare
is
this
something
that
you
know
about
that
that
you
can
tell
me
its
behavior
on
so,
for
instance,
if
you
take
string,
compare.organial
or
stringcompare.org
no
ignore
case
and
pass
in
is
well
known,
ordinal
comparer,
it
will
say.
Yes,
I
am
a
well-known
ordinal
comparer
and
I
am,
or
am
I
am
not
ignore
case.
Similarly,
if
you
pass
in
equality,
compare
of
string
dot
default,
his
well-known
ordinal
compare
will
say.
Yes,
I
am
a
well-known
ordinal
comparer
meaning
I
am
not
ignore
case.
G
Additionally,
there
are
scenarios
where
you're
using
culture
aware
compares
maybe
I've
wrapped
a
compare
around
culture,
info.current
culture
or
around
culture
and
photon
and
variant
culture.
That's
what
that
second
api
there
allows
you
to
do
it
allows
you
to
take
an
equality.
Compare
and
say
hey
is:
is
there
some
combination
of
magic
parameters
that
I
can
pass
into
stringcompare.create?
G
G
Now
compare
options
is
the
correct
enum,
because,
when
you're
dealing
with
culture,
aware
specifically,
when
you
create
a
culture
aware,
compare
the
two
parameters
that
you
have
to
pass
in
are
the
compare
info
and
the
compare
options.
The
reason,
the
very
specific
reason
we're
not
returning
string
comparison
as
an
enum
is
because
string
comparison
has
things
like
current
culture
and
current
ui
culture
hanging
off
of
it.
Well,
the
server
and
the
client
might
disagree
on
what
the
current
culture
is.
G
G
G
So
the
the
compare
options
flags
would
say
things
like
ignore
punctuation
ignore
accents.
So
I
want
the
n
and
the
enya
to
compare
as
equal,
for
instance,
under
linguistic
comparison,.
C
C
Just
a
is
compared
dot,
get
type
equal
to
a
fixed
list
of
things.
If
so
cast
it
and
ask
the
questions.
G
Basically,
yeah
because
we
don't
that
that
list,
it's
not
intuitive
as
to
how
large
that
list
actually
is.
I
have
the
list
written
after
all
the
usage
samples
and
I
don't
want
to
a
have
to
make
all
the
people
special
case.
What's
in
that
list
and
b
make
that
list
public.
C
G
C
G
One
of
these
is
a
non-public
type
that
makes
it
easier
yeah,
because
the
singletons
all
give
you
back
instances
of
non-public
types,
because
we
rely
on
gt
virtualization
to
make
things
faster.
There
is
a
gigantic
warning
underneath
this.
That
basically
says
hey,
so
you
want
to
serialize
behavior,
not
just
data.
Please
keep
the
following
things
in
mind:
don't
do
it
unless
you
know
what
you're
doing.
A
A
G
No,
it's
it's
the
very
bottom
paragraph
in
the
issue.
C
So
if
the
looking
at
this
from
the
purpose
of
I'll
call
it
serialization,
but
let's
just
make
it
more
general
to
state
save
and
resume,
do
you
do
we
have
the
appropriate
other
direction
api
like
do?
We
have
a
thing
that
you
can
give
a
compare
info
and
to
compare
options
to,
and
it
will
give
you
our
our
wealth,
known
implementation.
G
Yes,
and
in
fact,
if
you
scroll
up
just
a
little
bit
email,
I
show
sample
code
for
this
a
little
bit
more,
keep
going
there.
So
this
sample
code
demonstrates
calling
the
is
well
known
apis
and
then
reconstructing
the
compare,
based
on
the
results
of
those
apis.
G
Compare
and
like
how
do
you
transmit
it
across
a
wire
yeah
use
the
name
property.
G
Correct
but
compare
info
is
its
own.
It
is
its
own,
separate
type
where
you
can
query
its
own
name
and
also
use
compare
info
dot,
get
compare
info
of
name
so
pass
the
name
as
a
string
across
the
wire
and
then
reconstruct
it
on
the
other
side.
Again,
look
at
the
disclaimer.
Don't
do
this
unless
you
trust
the
data.
G
G
So
it's
it's
not
a
very
sexy
api
to
be
perfectly
honest,
but
it
does.
It
does
solve
a
problem
of
how
do
you
transmit?
How
do
you
persist
the
same
information
without
actually
using
binary
formatter,
and
this.
C
G
When
you
call
when
you
call
cultureinfo.getcultureinfo
or
compareinfo.compareinfo,
it's
only
going
to
give
you
the
standard
ones
anyway,
unless
you
call
the
specific
overload
that
says
like
use,
allow
user
overrides
or
whatever
the
overload
is,
so
you
you
will
get
back
stuff.
That's
that
the
system
knows
about
okay.
The
problem
is
the
system
can
also
just
start
generating
things
on
the
fly
based
on
what
it
thinks
you
mean.
So,
for
instance,
I
could.
G
I
can
actually
query
windows
right
now
and
look
for
the
en
us
dash
whatever
culture
and
it
will
say
yeah.
I
know
what
you
mean
and
it's
a
distinct
culture
from
en-us,
so
sure
yeah,
trust
we
do
things
different
washington
yeah.
Make
sure
that
you
trust
the
the
data
that's
coming
back
before
you
call
these
apis.
G
C
Do
do
you
need
to
use
both,
oh
because
the
first
one
is
is
well
known,
ordinal.
So
yes,
okay,.
G
Yeah,
so
I
ideally
ideally
what
I
actually
want
to
return
to.
You
is
three
things.
The
first.
The
first
option
is
this
is
ordinal
and
it's
ordinal
or
ordinal
ignore
case.
The
second
option
is
it's
culture
aware:
here's
a
compare
info
here
so
compare
options
and
the
third
return
value
is,
I
don't
know
what
this
is,
but
because
we
don't
have,
we
don't
have
discriminated
unions
in
the
run
time
yet
and
in
the
compiler,
like
I.
C
A
A
A
I
was
just
going,
I'm
sorry,
there's
another
blocking
one
that
we
just
got.
Oh
yeah,
okay,
fair
enough!
You
can
look
at
that.
J
I
can
speak
to
it
so
asp.net.
You
know.
E
J
Every
allocation,
no
matter
how
small
but
cancellation
token
source
in
particular,
can
have
a
multitude
of
allocations
associated
with
it,
so
it
can
have
a
timer
associated
with
it.
J
It
can
have
a
bunch
of
cached
registration
objects
from
previous
registrations
that
were
then
unregistered,
and
so
it
can
end
up
having
a
fair
amount
of
state
associated
with
it
and
in
some
situations
you'd
like
to
be
able
to
reuse
them
and
pool
them,
there's
technically
nothing
stopping
you
from
doing
that
today,
as
long
as
you
kind
of
are
careful
about
how
you
manage
stuff,
but
in
particular
for
asp.net
they're
concerned
about
a
situation
where
they've
handed
out
the
token
to
arbitrary
code
and
that
arbitrary
code
has
registered
with
it
and
then
just
simply
hasn't
unregistered,
and
they
really
only
want
to
reuse
the
token
if
at
a
given
moment
in
time,
all
of
those
registrations
have
been
cleared
out
now,
there's
nothing
to
prevent
someone
after
that
from
registering,
but
it's
from
their
perspective.
J
They
see
that
as
being
no
different
from
just
someone,
you
know
being
handed
the
token
again
and
registering
so.
The
purpose
of
this
api
is
basically
to
say:
I
would
like
to
reset
this
cancellation
token
source
for
reuse.
J
Reset,
specifically
just
means,
if
the
token
has
not
yet
been
cancelled,
then
reset
it.
So
it
it'll
only
return
true
if,
if
the
cts
wasn't
cancelled
and
no
one
is
still
registered
with
it,
okay,
otherwise
it'll
return
false.
J
I
believe
that
is
the
desired
behavior.
I
could
be
wrong
if
you
scroll
up,
maybe
it
clears
them
go
up.
Let
me
see
because.
C
Right
because
if
it's
because
if
it's
going
to
return
false,
if
there
are
still
registrations,
then
the
verb
doesn't
seem
to
be
reset,
which
is
like.
I
can
understand
that
you
can't
that
you
don't
want
to
reset
from
a
canceled
state
because
that's
ambiguous
but
resetting
from
an
unfired
state
to
a
unfired
and
no
one's
listening
kind
of.
F
C
B
J
C
Much
less
about
anything
else,
so
that's
that's
where
the
try
comes
in.
If
it's
a
timer
based
cts,
does
that
reset
the
timer
or
does
it
kill
the
timer
it'll
kill
the
timer,
basically
as
if
setting
it
to
infinite.
J
The
answer
is
it's
answering
the
question.
May
I
may
I
use
this
for
something
else
right.
If
it
turns
true,
go
have
at
it
if
it
returns.
No,
no,
please
do
not
try
and
use
it
again.
C
C
Okay,
because
otherwise,
we
should
just
maybe
make
the
try
reset
return
false
for
timer-based
sources
but
hold
on.
D
J
G
I
I
think
so
yeah
and
as
as
steve
you
and
I
just
kind
of
bantered
a
few
minutes
ago.
We
just
need
to
be
careful
about
the
wording.
J
I
J
A
while
yep
the
goal
is
to
expose
a
static
random
that
anyone
can
use
at
any
time
rather
than
having
to
construct
their
own.
If
they
want
to
do
something,
it
shows
up
all
over
the
place
you
want
to
you
want
it
in
32,
so
you
have
to
say
new
random
or
you
want
to
fill
in
a
byte
array.
So
you
have
to
say,
you
know
new
random,
and
the
idea
is
just
to
expose
a
random
instance
that
you
can
use
from
anywhere
for
any
purpose
and
it'll
just
work.
J
I
love
it
and
it's
backed
by
a
thread.
Local.
The
the
each
operation
is
backed
by
threat,
local,
because
we
we
don't
want
to
get
into
a
situation
where
someone
hands
this
access
it
on
one
thread,
hands
it
to
another
thread
and
have
that
be
a
problem.
So
it's
giving
you
back
a
non-thread
local
instance
where
every
operation
accesses
tls.
A
C
G
Are
there
potential
situations
where
somebody
could
be
that
this
might
encourage
people
to
pass
around
arbitrary,
random
instances?
Thinking,
oh
like
I,
I
got
it
through
random.shared,
so
it
must
be
fine,
but
someone
actually
gives
them
like
some
new
random
or
something.
Then
they
just
start
partying
on
it
for
multiple
threads.
G
C
J
C
Yeah
the
pretend
that
the
documentation
still
adds
the
automatic
threading
statement
of
static
members
are
thread
safe
and
instance.
Members
aren't
asterisk
like
if
you
took
a
random
as
a
parameter,
it's
not
thread
safe
or
you
can't
assume
it's
fed
safety.
J
C
E
C
F
The
99
case
is
that
someone
just
calls
shared.next,
should
we
just
add
a
random.next.
J
C
Does
anything
left
look
like
it's
a
10
minute
issue
or
since
we
finished
the
other
meeting,
10
minutes
late?
Do
we
want
to
finish
this
one
10
minutes
early.
A
I
think
what
is
this
one
here?
That's
the
reflection
there.
Anybody
who
knows
this
issue
here,
I
forgot
who
did
it?
I
think
santi
did
this
but
sandy's
not
on
the
call.
I
believe
right
and
then
this
one
yeah
this
one
is
stevens
as
well.
J
Yeah,
so
this
one
is,
people
want
to
be
notified
when
you
have
a
bounded
channel
when
it's
there,
there
are
options
that
you
can
specify
for
the
bounded
channel
about
what
happens
if
it's
full
and
you
try
and
write
something
to
it.
Those
are
things
like
the
default.
Behavior
is
to
just
block,
but
there
are
then
other
options
like
I
want
to
drop
the
oldest
item.
I
want
to
drop
the
newest
item.
I
want
to
drop
the
one
that
I'm
adding
and
still
consider
it.
J
A
J
We
could
consider
that
I
have
no
strong
opinion.
C
Yeah,
but
it
feels
like
we've
had
channels
for
a
couple
of
releases,
and
this
is
the
first
time
we
want
to
see
tea
in
an
option.
So
when
we
get
a
second
one,
then
we
can.
This
will
be
a
slight
wart,
but
it's
definitely
not
the
ugliest.
We
have
see
previous
discussions
about
cryptographic,
algorithms.
J
J
The
job
of
the
configuration
binder
is
to
take
configuration
source,
it
could
be
a
json
file,
could
be
environment,
variables,
many
different
things,
but
it
ends
up
getting
read
as
a
bag
of
name
value
pairs,
and
so
this
attribute
would
take
a
property
name
on
a
target
type,
and
rather
than
look
in
the
configuration
collection
based
on
the
property
name,
it's
a
layer
of
indirection
that
defines
a
different
name
for
the
key
value.
So
you
know,
if
you
have,
you
know
property
name
foo,
but
you
want
it
stored
as
bar.
Then
you
would
set.
J
You
know.
You'd,
add
this
attribute
to
your
property.
That
would
rename
it
from
the
point
of
view
of
the
extensions
configuration
binder
so
yeah,
the
the
main
thing
that
was
in
the
discussion
that
was
happening
here
was
around.
Should
we
use
any
existing
attribute
for
this
or
create
a
new
one?
J
And
you
know
we
basically
looked
at
every
attribute
in
the
framework
and
said:
do
any
of
these
make
sense
to
reuse
for
this
purpose,
and
it's
like
every
single
you
know
almost
any
serialization
technology
we
have
has
an
attribute
that
does
this
sort
of
thing,
but
they're
all
pretty
closely
tied
to
those
systems.
J
So
you
know
there's
one
in
component
model,
there's
one
in
data
contracts,
there's
one
in
xml
serial
serializer,
there's
one
json
now
so
you
know
this
is
you
know
it
doesn't
make
sense
for
us
to
solve
to
create
the
one
attribute
to
rule
them
all,
but
the
you
know
it
seemed
feels
like
the
right
thing
to
do
here
is
is
enable
this
scenario
with
a
new
attribute.
A
C
Yeah
and
so
just
to
confirm
this,
is
you:
have
you
know
a
public
property
foo
you
put
this
attribute
on
it.
That
says
the
name
is
bar
and
then
that
just
controls
the
reading
and
writing
to
a
from
a
file
somewhere,
yeah,
okay.
So
it's
just
a
serialization,
alias
yeah
yeah,
and
then
I
guess
it's
a
runtime
error.
If
the
name
makes
no
sense
like
you,
don't
want
yeah,
an
analyzer
or
anything
complicated,
just
runtime
error.
J
Yeah,
if
you,
if
you
want
to
create
something
that
doesn't
work,
you're
free
to
do
that,
the
value
space
there's
already
challenges
with
the
configuration
system
and
it's
value
space
for
keys,
because
the
the
what
is
legitimate
there
is
actually
domain
dependent.
J
So
some
configuration
keys
can
come
from
environment
variables
and
rules
for
environment
variables
apply
there
and
some
configuration
keys.
You
know,
depending
on
you're,
using
a
json
provider.
Okay.
Well,
it's
coming
from
an
adjacent
property
and
a
different
set
of
rules
apply
there.
So
you
kind
of
have
to
there's
no
there's.
No.
You
know.
C
B
J
C
J
I
I
would
put
that
as
a
suggestion
for
the
implementer
say
like
if
it
makes
sense
to
do
a
companion
analyzer,
but
I
think
if
we
did
come
up
with
an
analyzer,
we
might
want
to
come
back
with
yeah.
J
What
that
would
look
like,
I
suspect.
The
only
way
to
do
a
safe
analyzer
here
would
be
to
constrain
the
the
space
and
strain
the
value
space,
because
I
bet
you
there's
already
divergence
between
the
providers.
C
Yeah
because
I
I
like,
I
can't
imagine
any
that
are
going
to
be
happy
with
an
embedded
null
or
super
happy
with
a
unpaired
surrogate,
but
the
I
totally
agree
that
the
domain
will
determine
several
other
kinds
of
errors.
So
it
maybe
just
doesn't
make
sense.