I composed in VI, and the tabs were a problem. I apologize; there is no
good excuse not to have called the function before attaching it.

I had a logic problem. Accumulating the decimal conversion of hex needed to
be modular divided to be within range, and I had the name of the hex string
(pool) wrong.

It runs as a program now. From quickly testing large ranges, it hovers near
the mean, but on 10 and 60, it seemed to do ok.

I am far less optimistic now.

James

On Tue, Nov 15, 2022 at 7:56 AM James Johnson <jj126...@gmail.com> wrote:

> I am an amateur enthusiast. The random function I found in documentation
> was in 2014 or so. I do not have the vocabulary to differentiate between
> various prng's. I only knew of one, and I it returned some version of the
> bell curve, with three favorite values, and one of THEM a pronounced
> preference.
>
> The scholars here are referencing white papers and using hardware and
> software interchangeably (?) I am not a randomization expert, and I do not
> seek academic recognition. It's a novel hack is all, and I don't know how
> to invoke the quality algorithms you reference.
>
> Chris A. asked me to "post" a module. I'm pretty sure he means on git-hub,
> and I don't know how to use it. I attach a script with a randbelow()
> function.
>
> The kernel of my idea is to use randomness from a hash value, so I
> declared the hash globally, and called it in the function. I know this may
> not be correct, but I don't know how to declare one momentarily and then
> destruct it or release the ram the next minute, between random numbers.
>
> Normally, I would update the hexdigest outside the function, and pass it
> to randbelow(range, hexdigest_string) as two arguments. Chris A wants it to
> feed an analysis program that may not agree well with the "permanence" of a
> hash between random numbers.
>
> I am willing to put in effort, but it's a steep learning curve for me. I
> DO understand that my first script was a lot of data entry, data checking
> and elementary reporting that was not germane.
>
> I use my fast computer off-line, and connect to the web with a Chromebook,
> so online tools would mean changing my setup. I remain interested to help
> and learn.
>
> I hope this is not too bare-bones.
>
> On Tue, Nov 15, 2022 at 7:17 AM Stephen J. Turnbull <
> stephenjturnb...@gmail.com> wrote:
>
>> James Johnson writes:
>>
>>  > I want to be good natured about it, not combative. I tried whatever
>> random
>>  > function I found in documentation online, and used it. Without
>> analyzing
>>  > the world, I was simply dissatisfied with the results.
>>
>> On the Python lists, you'll get much better discussion if you're
>> specific about your "dissatisfaction".  (If it's just the repetition
>> problem, that's better handled by composing with a filter than by
>> altering the PRNG itself, which should be as close to uniform as
>> possible to make generating other distributions as simple as possible.)
>>
>> Your method *as described* is unclear.  Don Knuth tried something
>> similar (you have better tools available than he did, but the basic
>> idea seems to be similarly "let's compose a few pseudo-randomizing
>> transformations"), and got an embarrassing result.  (Spoiler in
>> footnote [1] if you don't feel like digging through Seminumerical
>> Algorithms.)  You may have had more method than Knuth did (cf Dave
>> Mertz's statement that it "looks like Random123"), but again, it would
>> really help communication if you described why you think your PRNG
>> will do better than Python's current one.  It's a heavily researched
>> field for many decades now, and there are quite a few core devs with a
>> lot of knowledge and experience in the field (Python apps provide
>> quite of bit of the "attack surface" exposed on the Internet, it would
>> be irresponsible if there weren't!)
>>
>> By the way, nobody here is going to laugh if it turns out that your
>> thinking was naive.  My point is to communicate more effectively, not
>> that your idea is bad (despite having a copy of Seminumerical
>> Algorithms, I'm not competent to evaluate your algorithm itself :-).
>> How you feel about "getting schooled" is a personal thing, but my
>> personal experience has been that there's an excellent education to be
>> had by posting naive ideas to this list. :-)
>>
>> Sincere regards,
>>
>> N.B. Deliberately not trimming so you have to work to see the
>> spoiler. :-)
>>
>>  >
>>  > Here’s what I settled on. I actually “put my thumb on the scales,” to
>> rule
>>  > out repetitions for seven questions, so randomness didn’t ultimately
>> answer
>>  > my question.
>>  >
>>  > I’m not sure that the function I “got” was the Mersenne Twister. I do
>> know
>>  > Mersenne was a truly great mathematician.
>>  >
>>  > I acknowledge that updating with time.asctime() EVERY time I update the
>>  > hash would be random; I’m not qualified to know if it would be “more”
>>  > random. After you ask about the bell curve v square distributions, I am
>>  > quite out of my depth.
>>  >
>>  > Here’s my “wizard” for anyone who wants to sell him cryptocurrency or
>>  > overcome his objections to the environmentalist agenda, or query him
>> about
>>  > foreign policy. I hope you find it better than average.
>>  >
>>  > https://drive.google.com/file/d/1EqQsMfBHDrNpOBQrI7CJxrpbowvKPD2G/
>>  >
>>  > Regards,
>>  >
>>  > James J
>>  >
>>  > On Tue, Nov 15, 2022 at 4:31 AM Wes Turner <wes.tur...@gmail.com>
>> wrote:
>>  >
>>  > > While FWIU it is advisable to keep seeding an RNG after startup -
>> that's
>>  > > what e.g. rngd does - the cryptography.io docs do advise to just use
>>  > > `os.urandom()` (which is not the same as random.SystemRandom()?).
>>  > >
>>  > > There probably should be better default random in CPython; though I'm
>>  > > personally not at all qualified to assess, TIL about NIST 800-22 and
>> FIPS
>>  > > 140-2 for evaluating sources of entropy.
>>  > >
>>  > > Differential entropy > Differential entropies for various
>> distributions
>>  > > https://en.wikipedia.org/wiki/Differential_entropy
>>  > >
>>  > >
>>  > > ***
>>  > >
>>  > > (TIL that quantum information is never destroyed; so which physical
>>  > > processes are actually nonreversible like hashing and RNG are
>> supposed to
>>  > > be is up for consideration as classical information is a subset of
>> quantum
>>  > > information. Do black holes shift gamma radiation may actually be
>> relevant!
>>  > > Perhaps a permanent magnet under a (double-jointed?) bar and ball
>> pendulum
>>  > > on a magnetic bearing would produce enough Brownian motion to get
>> enough
>>  > > uniform random to call it sufficiently entropic for purposes of
>> CSPRNG?
>>  > > Nondeterministic NDE fluid calculations diffract into many possible
>>  > > outcomes, but a brute force combinatorial search of all the possible
>> return
>>  > > values is still deterministically ordered. And the quantum computing
>> folks
>>  > > are working on increasing coherence / reducing error propagation;
>> like ECC.)
>>  > >
>>  > > - [ ] DOC: The docs could advise regarding which decent enough open
>> source
>>  > > hw RNG would be supported by os.urandom or random.SystemRandom if
>> rngd is
>>  > > not configured to keep nondeterministically seeding with entropy that
>>  > > should presumably be from a Uniform random entropic process
>>  > >
>>  > > There should be better software random in python.
>>  > >
>>  > >
>>  > > On Tue, Nov 15, 2022, 1:19 AM James Johnson <jj126...@gmail.com>
>> wrote:
>>  > >
>>  > >> Thank you for replying with such specific assistance. I am made
>> acutely
>>  > >> aware that I am only a Python enthusiast, and not an academic.
>>  > >>
>>  > >> Hashes are deterministic, not random, but byte by byte, they can be
>> very
>>  > >> random. Please accept the attached script as a "hack," that might
>> be novel,
>>  > >> or a curiosity. My first script was defective several ways. In
>> this, I seed
>>  > >> the hash by hashing the uu-8 ENCODED string value of the time - it
>> is not
>>  > >> random, but it is rarely the same twice. I used 0-9 because it is
>> decimal,
>>  > >> and 0-59, because hours and minutes come in 60's.
>>  > >>
>>  > >> I found that taking time.time_nc() gave me far more odds than evens.
>>  > >>
>>  > >> I do not know how the scheme I devised of adding hex digits together
>>  > >> would scale to larger ranges - it is done by adding hex digits that
>> vary
>>  > >> from 0 - 15 repeatedly, but, since the number of hex digits varies
>> with the
>>  > >> range, it could actually work for larger ranges.
>>  > >>
>>  > >> The random function in Python is not really adequate for a magic
>> eight
>>  > >> ball program, so as a consumer I am dissatisfied without examining
>> it at a
>>  > >> quantum level, for repeated reference thousands of times each.
>>  > >>
>>  > >> Thank you for your kind attention, and I hope the (much improved)
>> hack
>>  > >> can be helpful to other enthusiasts.
>>  > >>
>>  > >> James J
>>  > >> (A.A. Faulkner University)
>>  > >>
>>  > >> On Mon, Nov 14, 2022 at 11:23 AM Wes Turner <wes.tur...@gmail.com>
>> wrote:
>>  > >>
>>  > >>> QRNG "Quantum Random Number Generation" -> Hardware random number
>>  > >>> generator > Physical phenomena with random properties > Quantum
>> random
>>  > >>> properties
>>  > >>>
>>  > >>>
>> https://en.wikipedia.org/wiki/Hardware_random_number_generator#Quantum_random_properties
>>  > >>>
>>  > >>>
>>  > >>> FWIW, SciPy and SymPy have various non-CSPRNG random distributions:
>>  > >>>
>>  > >>> - https://docs.scipy.org/doc/scipy/reference/stats.html
>>  > >>>   -
>>  > >>>
>> https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.uniform.html#scipy.stats.uniform
>>  > >>>
>>  > >>> - https://docs.sympy.org/latest/modules/stats.html
>>  > >>>   -
>> https://docs.sympy.org/latest/modules/stats.html#sympy.stats.Uniform
>>  > >>>   -
>>  > >>>
>> https://docs.sympy.org/latest/modules/stats.html#sympy.stats.DiscreteUniform
>>  > >>>
>>  > >>> "RFC 8937: Randomness Improvements for Security Protocols" (2020)
>>  > >>> https://www.rfc-editor.org/rfc/rfc8937.html
>>  > >>>
>>  > >>> ***
>>  > >>>
>>  > >>> FWIW,
>>  > >>> UUIDs and W3C DIDs require entropy e.g. from a CSPRNG or better:
>>  > >>> https://www.w3.org/TR/did-core/#terminology :
>>  > >>>
>>  > >>> > Universally Unique Identifier (UUID)
>>  > >>> > A type of globally unique identifier defined by [RFC4122]. UUIDs
>> are
>>  > >>> similar to DIDs in that they do not require a centralized
>> registration
>>  > >>> authority. UUIDs differ from DIDs in that they are not resolvable
>> or
>>  > >>> cryptographically-verifiable
>>  > >>>
>>  > >>> On Mon, Nov 14, 2022, 11:54 AM Wes Turner <wes.tur...@gmail.com>
>> wrote:
>>  > >>>
>>  > >>>> https://docs.python.org/3/library/random.html :
>>  > >>>>
>>  > >>>> > Warning: The pseudo-random generators of this module should not
>> be
>>  > >>>> used for security purposes. For security or cryptographic uses,
>> see the
>>  > >>>> secrets module
>>  > >>>>
>>  > >>>> https://docs.python.org/3/library/secrets.html#module-secrets
>>  > >>>>
>>  > >>>> PEP 506 – Adding A Secrets Module To The Standard Library
>>  > >>>> https://peps.python.org/pep-0506/#alternatives
>>  > >>>> https://github.com/python/peps/blob/main/pep-0506.txt
>>  > >>>>
>>  > >>>> PEP 12: new PEP template:
>>  > >>>> https://github.com/python/peps/blob/main/pep-0012/pep-NNNN.rst
>>  > >>>>
>>  > >>>> Pseudorandom number generator > Cryptographic PRNGs
>>  > >>>>
>>  > >>>>
>> https://en.wikipedia.org/wiki/Pseudorandom_number_generator#Cryptographic_PRNGs
>>  > >>>>
>>  > >>>> Random number generator attack > Defenses
>>  > >>>>
>> https://en.wikipedia.org/wiki/Random_number_generator_attack#Defenses
>>  > >>>>
>>  > >>>>
>>  > >>>> /? CSPRNG
>>  > >>>> https://www.google.com/search?q=CSPRNG
>>  > >>>>
>>  > >>>> From "THE LINUX CSPRNG IS NOW GOOD!"
>>  > >>>> https://words.filippo.io/dispatches/linux-csprng/ :
>>  > >>>>
>>  > >>>> > [ get random() is from OpenBSD and LibreSSL ]
>>  > >>>>
>>  > >>>> > Performance and ChaCha20
>>  > >>>> > Some people would say they needed a userspace CSPRNG for
>> PERFORMANCE.
>>  > >>>> I never really believed most of them, but to be fair Linux was
>> using a
>>  > >>>> kinda slow SHA-1 extractor back then. However, since Linux 4.8
>> (2016) the
>>  > >>>> default getrandom(2) source is a fast ChaCha20-based CSPRNG, with
>> separate
>>  > >>>> pools per NUMA node to avoid contention. (Just ignore the rude
>> comments in
>>  > >>>> the code about applications not running their own CSPRNG, this is
>> still
>>  > >>>> Linux after all.)
>>  > >>>> >
>>  > >>>> > There's even a neat trick XOR'ing some of the CSPRGN output
>> back into
>>  > >>>> the ChaCha20 state to prevent an attacker from recovering any
>> past output
>>  > >>>> from before the time of compromise.
>>  > >>>> >
>>  > >>>> > Some of these improvements came along thanks to the Wireguard
>> work by
>>  > >>>> Jason A. Donenfeld
>>  > >>>>
>>  > >>>> "Problems emerge for a unified /dev/*random" (2022)
>>  > >>>> https://lwn.net/Articles/889452/
>>  > >>>>
>>  > >>>> From
>>  > >>>>
>> https://www.redhat.com/en/blog/understanding-red-hat-enterprise-linux-random-number-generator-interface
>>  > >>>> :
>>  > >>>>
>>  > >>>> """
>>  > >>>> How does the kernel initialize its CSPRNG?
>>  > >>>> The kernel has an “entropy pool,” a place where unpredictable
>> input
>>  > >>>> observed by the kernel is mixed and stored. That pool serves as a
>> seed to
>>  > >>>> the internal CSPRNG, and until some threshold of estimated
>> entropy is
>>  > >>>> reached initially, it is considered uninitialized.
>>  > >>>>
>>  > >>>> Let’s now see how the kernel initializes its entropy pool.
>>  > >>>>
>>  > >>>> 1. After the kernel takes control on power-on, it starts filling
>> its
>>  > >>>> entropy pool by mixing interrupt timing and other unpredictable
>> input.
>>  > >>>>
>>  > >>>> 2. The kernel gives control to systemd.
>>  > >>>>
>>  > >>>> 3. Next, systemd starts and initializes itself.
>>  > >>>>
>>  > >>>> 4. Systemd, optionally, loads kernel modules which will improve
>> the
>>  > >>>> kernel's entropy gathering process on a virtual machine (e.g.,
>> virtio-rng).
>>  > >>>>
>>  > >>>> 5. Systemd loads the rngd.service which will gather additional
>> input
>>  > >>>> entropy obtained via a random generator exposed by hardware
>> (e.g., the x86
>>  > >>>> RDRAND instruction or similar) and jitter entropy1; this entropy
>> is fed
>>  > >>>> back into the kernel to initialize its entropy pool, typically in
>> a matter
>>  > >>>> of milliseconds.
>>  > >>>>
>>  > >>>> After the last step, the kernel has its entropy pool initialized,
>> and
>>  > >>>> any systemd services started can take advantage of the kernel’s
>> random
>>  > >>>> generator.
>>  > >>>>
>>  > >>>> Note that the virtio-rng kernel module loading in step (3), is an
>>  > >>>> optional step which improves entropy gathering in a virtual
>> machine by
>>  > >>>> using the host's random generator to initialize the guest systems
>> in KVM.
>>  > >>>> The rngd.service loading at the final step (4) is what ensures
>> that the
>>  > >>>> kernel entropy pools are initialized on every scenario, and
>> furthermore it
>>  > >>>> continues mixing additional data in the kernel pool during system
>> runtime.
>>  > >>>> """
>>  > >>>>
>>  > >>>> https://github.com/nhorman/rng-tools/blob/master/fips.c :
>>  > >>>>
>>  > >>>> ```c
>>  > >>>> /* fips.c -- Performs FIPS 140-1/140-2 RNG tests
>>  > >>>> ```
>>  > >>>>
>>  > >>>> /? FIPS 140-1/140-2 RNG tests
>>  > >>>> https://www.google.com/search?q=FIPS+140-1%2F140-2+RNG+tests
>>  > >>>>
>>  > >>>> /? CMVP "cprng"
>>  > >>>> https://www.google.com/search?q=CMVP+%22cprng%22
>>  > >>>> https://csrc.nist.gov/publications/detail/fips/140/3/final
>>  > >>>>
>>  > >>>> https://www.google.com/search?q=rng+tests
>>  > >>>>
>>  > >>>> - https://www.johndcook.com/blog/rng-testing/ :
>>  > >>>>
>>  > >>>>   > We test RNGs using the standard test suites: PractRand,
>> TestU01
>>  > >>>> (BigCrush), DIEHARD(ER), NIST SP 800-22.
>>  > >>>>
>>  > >>>> Randomness tests:
>>  > >>>>
>>  > >>>>
>> https://en.wikipedia.org/wiki/Randomness_test#Notable_software_implementations
>>  > >>>> :
>>  > >>>> - https://en.wikipedia.org/wiki/Diehard_tests
>>  > >>>> - https://en.wikipedia.org/wiki/TestU01
>>  > >>>> - /? NIST 800-22 https://www.google.com/search?q=nist+800-22
>>  > >>>>
>>  > >>>> /? nist 800-22 site:github.com
>>  > >>>> https://www.google.com/search?q=nist+800-22+site%3Agithub.com
>>  > >>>>
>>  > >>>> -
>>  > >>>>
>> https://github.com/google/paranoid_crypto/blob/main/docs/randomness_tests.md
>>  > >>>>
>>  > >>>>
>>  > >>>> From https://cryptography.io/en/latest/random-numbers/
>>  > >>>>
>> https://github.com/pyca/cryptography/blob/main/docs/random-numbers.rst
>>  > >>>> :
>>  > >>>>
>>  > >>>>
>>  > >>>> ```rst
>>  > >>>> Random number generation
>>  > >>>> ========================
>>  > >>>>
>>  > >>>> When generating random data for use in cryptographic operations,
>> such
>>  > >>>> as an
>>  > >>>> initialization vector for encryption in
>>  > >>>> :class:`~cryptography.hazmat.primitives.ciphers.modes.CBC` mode,
>> you do
>>  > >>>> not
>>  > >>>> want to use the standard :mod:`random` module APIs. This is
>> because
>>  > >>>> they do not
>>  > >>>> provide a cryptographically secure random number generator, which
>> can
>>  > >>>> result in
>>  > >>>> major security issues depending on the algorithms in use.
>>  > >>>>
>>  > >>>> Therefore, it is our recommendation to `always use your operating
>>  > >>>> system's
>>  > >>>> provided random number generator`_, which is available as
>>  > >>>> :func:`os.urandom`.
>>  > >>>> For example, if you need 16 bytes of random data for an
>> initialization
>>  > >>>> vector,
>>  > >>>> you can obtain them with:
>>  > >>>>
>>  > >>>> .. doctest::
>>  > >>>>
>>  > >>>>     >>> import os
>>  > >>>>     >>> iv = os.urandom(16)
>>  > >>>>
>>  > >>>> This will use ``/dev/urandom`` on UNIX platforms, and
>>  > >>>> ``CryptGenRandom`` on
>>  > >>>> Windows.
>>  > >>>>
>>  > >>>> If you need your random number as an integer (for example, for
>>  > >>>> :meth:`~cryptography.x509.CertificateBuilder.serial_number`), you
>> can
>>  > >>>> use
>>  > >>>> ``int.from_bytes`` to convert the result of ``os.urandom``:
>>  > >>>>
>>  > >>>> .. code-block:: pycon
>>  > >>>>
>>  > >>>>     >>> serial = int.from_bytes(os.urandom(20), byteorder="big")
>>  > >>>>
>>  > >>>> In addition, the `Python standard library`_ includes the
>> ``secrets``
>>  > >>>> module,
>>  > >>>> which can be used for generating cryptographically secure random
>>  > >>>> numbers, with
>>  > >>>> specific helpers for text-based formats.
>>  > >>>>
>>  > >>>> .. _`always use your operating system's provided random number
>>  > >>>> generator`:
>>  > >>>>
>> https://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers/
>>  > >>>> .. _`Python standard library`:
>>  > >>>> https://docs.python.org/3/library/secrets.html
>>  > >>>>
>>  > >>>> ```
>>  > >>>>
>>  > >>>>
>>  > >>>> On Mon, Nov 14, 2022, 10:57 AM Barry <ba...@barrys-emacs.org>
>> wrote:
>>  > >>>>
>>  > >>>>>
>>  > >>>>>
>>  > >>>>> > On 14 Nov 2022, at 14:31, James Johnson <jj126...@gmail.com>
>> wrote:
>>  > >>>>> >
>>  > >>>>> > 
>>  > >>>>> > I wrote the attached python (3) code to improve on existing
>> prng
>>  > >>>>> functions. I used the time module for one method, which resulted
>> in
>>  > >>>>> disproportionate odd values, but agreeable means.
>>  > >>>>> >
>>  > >>>>> > I used the hashlib module for the second. It is evident that
>> the
>>  > >>>>> code is amateur, but the program might result in better PRN
>> generation.
>>  > >>>>> >
>>  > >>>>> > The "app" lends itself to checking, using statistical tools
>> (see
>>  > >>>>> comments.)
>>  > >>>>>
>>  > >>>>> Have you used any cryptographic tools to prove the quality of
>> your
>>  > >>>>> PRNG?
>>  > >>>>> What results did you get?
>>  > >>>>> How does your PRNG compare to what python already has?
>>  > >>>>>
>>  > >>>>> Without that this analysis this will be unlikely to be
>> considered as a
>>  > >>>>> candidate for python stdlib.
>>  > >>>>>
>>  > >>>>> Barry
>>  > >>>>>
>>  > >>>>> >
>>  > >>>>> > I remain a fan,
>>  > >>>>> >
>>  > >>>>> > James Johnson
>>  > >>>>> > <testrandom.py>
>>  > >>>>> > _______________________________________________
>>  > >>>>> > Python-ideas mailing list -- python-ideas@python.org
>>  > >>>>> > To unsubscribe send an email to python-ideas-le...@python.org
>>  > >>>>> >
>> https://mail.python.org/mailman3/lists/python-ideas.python.org/
>>  > >>>>> > Message archived at
>>  > >>>>>
>> https://mail.python.org/archives/list/python-ideas@python.org/message/VENAT2YTVYVHTBSEVHHMIURCU6MG2CEO/
>>  > >>>>> > Code of Conduct: http://python.org/psf/codeofconduct/
>>  > >>>>>
>>  > >>>>> _______________________________________________
>>  > >>>>> Python-ideas mailing list -- python-ideas@python.org
>>  > >>>>> To unsubscribe send an email to python-ideas-le...@python.org
>>  > >>>>> https://mail.python.org/mailman3/lists/python-ideas.python.org/
>>  > >>>>> Message archived at
>>  > >>>>>
>> https://mail.python.org/archives/list/python-ideas@python.org/message/HWQV4AKQAUM7CY4NWS2IRIVLRAYMKR3V/
>>  > >>>>> Code of Conduct: http://python.org/psf/codeofconduct/
>>  > >>>>>
>>  > >>>> --
>>  > Truth causes consequences; consequences bring pain; pain exorcises
>> guilt!
>>  > _______________________________________________
>>  > Python-ideas mailing list -- python-ideas@python.org
>>  > To unsubscribe send an email to python-ideas-le...@python.org
>>  > https://mail.python.org/mailman3/lists/python-ideas.python.org/
>>  > Message archived at
>> https://mail.python.org/archives/list/python-ideas@python.org/message/ODL773AIV43GLUSO5UUNIPZYTPYJPQOZ/
>>  > Code of Conduct: http://python.org/psf/codeofconduct/
>>
>> Footnotes:
>> [1]  He composed several pseudo-random transformations, mostly linear
>> congruential but also including at least one nonlinear one (middle
>> square).  The resulting sequence always converged to a short cycle
>> within a handful of iterations.
>>
>>

Attachment: randbelow.py
Description: Binary data

_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/XOX7RFI75Q3RT6JU357QVKNL3X5GXWD3/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to