Skip to main content

File parser and writer for optical time-domain reflectometry interchange files (Bellcore SOR)

Project description

otdrs

otdrs is a Rust implementation of a SOR file parser and generator. SOR files are used as a storage format for optical time-domain reflectometry (OTDR) tests, which are commonly used to characterise and validate the proper construction of fibre optic networks. SOR is formally known as the Bellcore OTDR interchange format, specified in Telcordia SR-4731, a proprietary standard. OTDR testing involves firing short pulses of light down fibres under test, and measuring the intensity of returned light over time.

otdrs is intended as a minimal but valid and robust parser implementation to enable a translation from the closed binary format to open, self-documenting formats, to permit easy development of analysis tools without having to deal with the complexities of managing a binary format that is broadly undocumented and difficult to parse. It also provides Rust primitives for OTDR files and a writer to allow files to be loaded, modified, and written back.

Wherever possible, translation preserves the input format; otdrs does not try to fix peculiarities of particular test equipment or post-processing software or work around quirks in their input, except where they would break parsing of the format. No normalisation is attempted.

Where the parser cannot reliably extract information it is omitted; in this sense, otdrs is a best-effort parser.

Writing of files is performed with as much care as possible and the optional checksum block is computed. Generated files open without issue in several professional applications, and proprietary data is preserved losslessly.

Rust was chosen for its robustness, type-safety, and the excellent nom parser library. serde is used for serialisation for output.

Rust Cargo Downloads Python

Usage

otdrs takes one positional argument, the path to a SOR file. Its output is a single JSON or CBOR blob which contains the information within the SOR file; flags are used to set the output path (default is stdout) or the format to output. otdrs --help shows the available options.

A post-processing example is shown in the demo.py script in this repository, which will plot the data from an OTDR file.

Installing

If you have Rust/Cargo installed you can install otdrs with cargo install otdrs. otdrs is not otherwise packaged currently.

Library Usage

You can use otdrs as a Rust library to read, modify, and write SOR files. For instance, the following minimal program will modify the fiber ID and cable ID of the file, and print the nominal wavelength of the file to the terminal.

use otdrs::parser::parse_file;
use std::fs::File;
use std::io::prelude::*;
fn main() -> std::io::Result<()>  {
    // Read the file into memory
    let mut in_file = File::open("input.sor")?;
    let mut in_data = Vec::new();
    in_file.read_to_end(&mut in_data)?;
    // Parse the file
    let mut sor = parse_file(&in_data).unwrap().1;
    // Most blocks are Options because the parser can't guarantee them
    // This is true even of "required" blocks in the spec, because otdrs is permissive.
    match sor.general_parameters.as_mut() {
        Some(mut gp) => {
            // If we've got a block we can read and modify it!
            println!("Nominal wavelength of this SOR record: {:?}", gp.nominal_wavelength);
            gp.fiber_id = "Hello world";
            gp.cable_id = "Foo bar";
            // Note that we don't check the values you write a valid, outside of type enforcement
            // Even then you need to be careful to adhere to the spec. e.g. no UTF-8 glyphs
            // No emojis in your comments field 😭😭😭
        }
        None => {
            println!("Your SOR file has no General Parameters block!")
        }
    }
    // Encode the SORFile structure to a binary SOR file again...
    // Note you'd normally want to handle errors properly here, but we're an example, so...
    let bytes_to_write = sor.to_bytes().unwrap();
    // Write the file out to disk!
    let mut out_file = File::create("output.sor").unwrap();
    out_file.write_all(&bytes_to_write)?;
    return Ok(());
}

Python module

otdrs is also available as a Python module, with limited functionality. Currently, reading SOR files is supported.

import otdrs
sor_from_file = otdrs.parse_file("input.sor")
sor_from_file.fixed_parameters.acquisition_offset #=> returns the acquisition offset, and so on
file = open("input.sor", "rb")
sor_from_bytes = otdrs.parse_bytes(file.read())
sor_from_bytes == sor_from_file #=> True

The resulting objects and methods are fully type hinted.

Checksums and file validation

otdrs computes checksums when generating SOR file bytes, and can be used to validate checksums after files are parsed.

Checksums are optional and most software doesn't either produce or validate them, but otdrs will try several strategies (given the vagueness of the spec) to match any supplied checksum against bytes in the file, and return an enum containing details of the match. Callers can then surface this information or ignore it.

Code Quality, Conformance/Compliance

This is the author's first major Rust project, so use with caution.

This is absolutely not guaranteed to work in all cases with all files or produce correct output in all cases (or indeed any). Check the output with the files you're using and a known-good viewer if you care about what you're doing.

Security Considerations

As otdrs handles arbitrary binary input and performs some arithmetic on it which can potentially lead to underruns and overruns as well as exciting undefined behaviour.

While Rust is a very good language to write such tools in, since runtime errors such as this are handled, otdrs makes an effort to avoid obvious situations where slice pointers violate bounds or where arithmetic on SOR contents may lead to unexpected situations. cargo-fuzz is used to fuzz with libFuzzer (on Linux only at present) to discover scenarios in which this can occur, including through writing and round-tripping OTDR files and structure-aware fuzzing. AFL can also be used for fuzzing, though given the large binary inputs this isn't recommended.

Checking of result validity is not performed on all fields, and users of the tool should take care to avoid trusting input parsed from SOR files. Sanitise your inputs.

Known Issues

  • The "link parameters" block is not currently decoded, as the author does not have files which contain it for testing. This is not used in common OTDR sets.
  • Testing is not as comprehensive and extensive as it should be, particularly for writing files.

There is no application of fixed scaling factors described in SR-4731. This is generally intentional, to permit correct post-processing as required in other applications.

Proprietary Blocks

While SOR files are standardised, not all of the content is; there are a set of standard and required blocks for the basic information, and otdrs only attempts to parse the standard blocks in a SOR file.

The content of proprietary blocks is dumped for analysis by upstream tools that may either have knowledge of proprietary formats or wish to simply know of the existence of such blocks. The map block will in all cases list all blocks within the file.

Writing SORs

otdrs has experimental support for generating SORs from Rust data structures. Strictly, the map block is heavily recomputed when writing; a BlockInfo block with a revision number and header will be expected for all blocks, but sizes and counters are dynamically generated. This is because it is practically impossible (or very difficult, at least) to compute sizes before serialising data, so this is best done at the point of writing.

Editors are responsible for ensuring that any modification of data elsewhere in the file makes sense, e.g. if the number of points within a DataPointsAtScaleFactor struct is changed, then the n_points field must be amended by the editor; otdrs will not do this for you.

Currently, landmarks and LinkParameters are not written out, as these are very rarely used in practice and no example data is currently available to support testing.

Testing

The parser has been tested on SOR files generated from:

  • Noyes OFL280 OTDRs, including those re-exported from EXFO FastReporter3
  • Anritsu Access Master OTDRs
  • EXFO MaxTester 730C and FTB-4/FTBx730 OTDRs
  • EXFO iOLM files exported to SOR from EXFO FastReporter3
  • EXFO 735C-SM7R modules in centralised PON test deployments (shooting through splitters to high-reflectance devices)

Round-trip testing has also confirmed that all of the above files can be read and written out by otdrs with no loss or alteration of data.

Further test files are desired and should be submitted to the author or as a pull request with tests against known values.

Interpretation

To actually interpet any of this data correctly you are probably going to need to read SR-4731, which can be found here for around $750.

This parser makes no attempt to correctly interpret the resulting data from the SOR file format, merely to make it accessible for applications to perform correct interpretation. Actually locating events and measuring cable data based on OTDR data requires careful consideration of data offsets (e.g. front panel to user offset, scaling factors, etc).

Vendor Quirks

As with pretty much every standard out there, every vendor has interpreted it differently. For one example, some Noyes OTDRs store a 30 second averaging period as 3000 whereas EXFO and Anritsu record it as 30. The specification, of course, says this should be stored as 300. Professional software struggles with this - for instance, EXFO's FastReporter3 software misinterprets the Noyes result.

Documentation of storage quirks compared to "standard" behaviour such as the above, against known behaviour would be helpful for those developing post-processing software; if you have access to test equipment, you can helpfully run a controlled test, write down the actual values displayed by the tester etc and store the SOR file directly.

While "fixing" vendor quirks to generate a standards-compliant output is not currently in the scope of otdrs, this is something that could be added as an optional post-processing step.

Versions

  • 1.1.1 - Bump to Rust 2024 edition, remove last macros in favour of generic functions
  • 1.1.0 - Adds checksum parsing support, fixes incorrect initialisation vector in checksum block generation
  • 1.0.5 - License change from GPLv3 to LGPLv3
  • 1.0.4 - Python module type hints, dependency fix
  • 1.0.3 - Python module fixes
  • 1.0.2 - Python module added as an optional feature
  • 1.0.1 - upgraded nom to 8.0.0, clap to 4.x
  • 1.0.0 - refactored to avoid some beginner Rust errors; SORFile now owns its data. Updated dependencies.
  • 0.4.2 - upgraded nom to 7.1.0, clap to 3.0.0-rc7
  • 0.4.1 - upgraded nom to 6.1.2, improved README and demo scripts
  • 0.4.0 - added SORFile#to_bytes and a whole bunch of related functions and macros which altogether mean that otdrs can now write OTDR files
  • 0.3.0 - switched to using clap for command-line argument handling for better error handling, added option to write to file instead of stdout and added CBOR export support
  • 0.2.0 - restructured to allow use as a library, added fuzzing and fixed a number of bounds-check/error propogation problems
  • 0.1.0 - initial release

License

Versions of otdrs up to 1.0.4 were licensed under the GPL version 3. GPLv3 was selected specifically to drive improved open source engagement with equipment manufacturers and developers of OTDR processing software in an industry that has struggled with open data exchange, proprietary (and vendor-locked) software, and poor maintenance of existing software.

Version 1.0.5 onwards is licensed under the LGPL version 3, which unambiguously allows use of otdrs as a library in proprietary tools and services, to encourage use of open-source tooling in proprietary services.

otdrs - a SOR file parsing tool Copyright (C) 2021, 2022, 2023, 2025 James Harrison

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

otdrs-1.1.1.tar.gz (665.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

otdrs-1.1.1-cp313-cp313t-win_amd64.whl (222.7 kB view details)

Uploaded CPython 3.13tWindows x86-64

otdrs-1.1.1-cp313-cp313t-win32.whl (208.2 kB view details)

Uploaded CPython 3.13tWindows x86

otdrs-1.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl (545.2 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

otdrs-1.1.1-cp313-cp313t-musllinux_1_2_i686.whl (573.9 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ i686

otdrs-1.1.1-cp313-cp313t-musllinux_1_2_armv7l.whl (637.8 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARMv7l

otdrs-1.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl (549.0 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

otdrs-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (327.9 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ x86-64

otdrs-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl (355.2 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ i686

otdrs-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (302.8 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ ARMv7l

otdrs-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (311.3 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ ARM64

otdrs-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl (333.3 kB view details)

Uploaded CPython 3.13tmacOS 11.0+ ARM64

otdrs-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl (345.9 kB view details)

Uploaded CPython 3.13tmacOS 10.12+ x86-64

otdrs-1.1.1-cp37-abi3-win_amd64.whl (225.6 kB view details)

Uploaded CPython 3.7+Windows x86-64

otdrs-1.1.1-cp37-abi3-win32.whl (212.3 kB view details)

Uploaded CPython 3.7+Windows x86

otdrs-1.1.1-cp37-abi3-musllinux_1_2_x86_64.whl (549.6 kB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ x86-64

otdrs-1.1.1-cp37-abi3-musllinux_1_2_i686.whl (579.1 kB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ i686

otdrs-1.1.1-cp37-abi3-musllinux_1_2_armv7l.whl (643.0 kB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ ARMv7l

otdrs-1.1.1-cp37-abi3-musllinux_1_2_aarch64.whl (552.1 kB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ ARM64

otdrs-1.1.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (332.7 kB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ x86-64

otdrs-1.1.1-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl (360.6 kB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ i686

otdrs-1.1.1-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (306.1 kB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ ARMv7l

otdrs-1.1.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (315.5 kB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ ARM64

otdrs-1.1.1-cp37-abi3-macosx_11_0_arm64.whl (346.0 kB view details)

Uploaded CPython 3.7+macOS 11.0+ ARM64

otdrs-1.1.1-cp37-abi3-macosx_10_12_x86_64.whl (358.0 kB view details)

Uploaded CPython 3.7+macOS 10.12+ x86-64

File details

Details for the file otdrs-1.1.1.tar.gz.

File metadata

  • Download URL: otdrs-1.1.1.tar.gz
  • Upload date:
  • Size: 665.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.1.1.tar.gz
Algorithm Hash digest
SHA256 4b56d2873525d55f78f9df9ea65fcba830ef9f482d0d4b1c8a73c605c791138a
MD5 5ed2bd2fcc57200cbc402864a918d613
BLAKE2b-256 8ff52728f810a96c6cdeb0452036008f1e87e8610a82e56e670412f5e34cdf29

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp313-cp313t-win_amd64.whl.

File metadata

  • Download URL: otdrs-1.1.1-cp313-cp313t-win_amd64.whl
  • Upload date:
  • Size: 222.7 kB
  • Tags: CPython 3.13t, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.1.1-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 cb7e76c9fb9ccf380b580243ab6927d12ae8050a33407bcdd16de3d76a4bfe45
MD5 bdacedb9ab4664aaa9847d85f6962ac3
BLAKE2b-256 7d9af75eb0a380c29442f77a37abae82c1f8a00b60c6b5c0a1970fac38b0d8e9

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp313-cp313t-win32.whl.

File metadata

  • Download URL: otdrs-1.1.1-cp313-cp313t-win32.whl
  • Upload date:
  • Size: 208.2 kB
  • Tags: CPython 3.13t, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.1.1-cp313-cp313t-win32.whl
Algorithm Hash digest
SHA256 a0f366165dfdb4327c6d77f43f62c6173b11ecf5f514dfd7f89b33644348f7ae
MD5 c789fbc1c150ab0c4665c1cf65eaeae4
BLAKE2b-256 cc6a13cd1f9a8bd13e6a64aa15ae936444ccf60c68b9e9b5284dd0f8a4168928

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6ec750db537b9fa5116036048c40242cd391dc15d82bc57d57d06ca4f91742f6
MD5 c6f078dd64655ff187bf2c17d061bcea
BLAKE2b-256 4b1cfae9388db5f26bbb96e56bd2f868c0ca5e13cf58b6885dcfc91207a7e09a

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp313-cp313t-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp313-cp313t-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 6c2e232c15c11e128cd83fe42e0c6fd525ed09e3bc0b39668158700c89788566
MD5 1ba940301ce29bf751622b8518926493
BLAKE2b-256 1155a38a5df386f86d639fd4a3b6b4eb84cadd0be7d46d71af0db0f2fa27fbee

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp313-cp313t-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp313-cp313t-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 cc26cce120dfd49462c9bdcbffc18f0078ae9e0b7f1226a27c14b17157f08393
MD5 176db4d3259d41f63eb9d6bd3963022b
BLAKE2b-256 aafc5aa633dc8e72fc1cb62d7e1061b699fdf971372288dc497c26a88609a9db

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d79607e33ef2d47e034835805344ac2861faec0ba8c5cc87d658c20ca1b632fd
MD5 da9f57e2210bba142e842fadb22ada27
BLAKE2b-256 c7e821993381b5526cbdf07f254b824775795d85f91baf3a27b1c158dfec2029

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 525b21e8eb4d8b2b00e6961fb409eba1f3188f4e8a386c91e260f711135568ab
MD5 def047d82577ed27519fd7dc3e604201
BLAKE2b-256 97fe38bb38b85227f259fdf1d912a4c13eab492d1b88c7cc33110fb11e6f2fd0

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 743f66d83730915974f74ca0f3f07e42774ce2b4de000b279653847f8e35c9b7
MD5 01942c5014e8fe882a717d1debe564e1
BLAKE2b-256 b158c475b34074590b67585441062f7b60276be58a5f45538a11332adb238e9b

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 a792f874070b3cac47d7c6bda5c97416183f9505b3da8f8acfa4cf525470a626
MD5 ed29c5860bf8bd985ef6b090b9bc428c
BLAKE2b-256 add19a980eda123723773d1bee15306fcf307733b0d104bb03fd6e3beff2e0b1

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a5e5bebabaa00322de4766f5e5c8fa07372a84d5896807f97f24b1eb0e871d48
MD5 44cf2af517660e1ce5973a725df52a7f
BLAKE2b-256 a0d26574e6fe369f6999eb2306b2531e4e452349f3e8a3acb997266197a62345

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 96be1c13ba2c4bdd890ac55d677aff3bce727899ff04bf03f49ab895dcfe123d
MD5 4d1ceb1e70610379266d0d8e80a634b2
BLAKE2b-256 a0b1d64fc33718b3bd1e1813bd54aa053280b0b6ae942f8e0ffd6ca7e36ac470

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 dda9314ff289f6be73ecb132886708a4b17684144206dbd75848020e0963bec9
MD5 37d495d020a2289e37f95a41ff1b7f6d
BLAKE2b-256 3cadbed4d2bd048ee60db711fc595f178f3016d746c2f8d282197f1b6020d62c

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp37-abi3-win_amd64.whl.

File metadata

  • Download URL: otdrs-1.1.1-cp37-abi3-win_amd64.whl
  • Upload date:
  • Size: 225.6 kB
  • Tags: CPython 3.7+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.1.1-cp37-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 7b8135035870234859c8d116d4ea838c56455e9ee7a798a87f33dc0d5c09f967
MD5 1c609af44170dcf9621ac39e0e783015
BLAKE2b-256 bee452d1d4f699dd245547cc92c4844a4ed8d4a1723747109aaac0f8eebe1858

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp37-abi3-win32.whl.

File metadata

  • Download URL: otdrs-1.1.1-cp37-abi3-win32.whl
  • Upload date:
  • Size: 212.3 kB
  • Tags: CPython 3.7+, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.1.1-cp37-abi3-win32.whl
Algorithm Hash digest
SHA256 b22480fe51069d2691cf7996fcd48cb0e56dea395177dd267d2e50ad818338a4
MD5 998cb9031842c1beccbf41d0f44d9fcf
BLAKE2b-256 75a48a42c90df35966091b33a4083f40e679e74c885c52104d837729f03b790a

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp37-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp37-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 37642f9b396e46ac728cdad6c6c2bb5b61dfe23104410fdd2757e6f063b3121e
MD5 a3c7c3ea7c3fa4b7ef80f9af3eeccb4a
BLAKE2b-256 fb1c442f1ebddbd334fc52de8b8e7b91d90a4ff5ba11e0bd580feac2ca3aa328

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp37-abi3-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp37-abi3-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 6e8b432a501f422b61daa404a289393002ce49a645e2ea963f9880d7ef760937
MD5 6d910f50a2efc335cb0041206cbd961b
BLAKE2b-256 b7fb014b1da572c15a1b40be34532898e3e78b1110d0eae62edc890ce8427449

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp37-abi3-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp37-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 0a7bbbb20837796164116f419d0c6413202309a3889752f61654f52483bf7d0a
MD5 abe617ef38d5424854773c200f0cdec9
BLAKE2b-256 95a05a9082551b651e370f79f080d91969b4346d2f22152713cd3e9e2faa57df

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp37-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp37-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 29d238c42e55eee1cddf102b25ad020ca7d4efe4c8e321335d75c2adc30a85a7
MD5 9465b2d3139eaa85ba40c89e00c65f69
BLAKE2b-256 7556fc5b3f0bf34fcae49dc9a9db9f72329b6e52944f76436006f9cad7c4f294

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 35d4ce26cdf3e2ca804d0c28296a063cb45a95c46d7949de2499a8188b4079db
MD5 28a53686258de327b012a481711eccba
BLAKE2b-256 e09a4949d2e288656dda5787ac6d89dda27a36b83849bb1ddee4427433ec339e

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f19a50d9d7a1eef70fd607458d2939c2f8217296b13bc389b92ec77df64011ce
MD5 82bad0cdd3531f5d2c52d740c0139973
BLAKE2b-256 2715446b19194eef77d504f78f68b9fa79f46aeb71d35c126cb5ff339b40b7e8

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 a74f6366657dfacd27a995e0bbc049b2928345b0522e90669fead68764f5484b
MD5 b59a9d01e93a0f62cf4d1c923fc4407f
BLAKE2b-256 a7c9a5a13c82586789346103c604f3d807b1bc40aa9f913263f1c97ac26dc973

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1d446dc5ef8e9d90e6f24f1b6fc010b79e1cf9cf32afdabaf6612cbac3407931
MD5 3131558faec842ed6aaf3716a86b4416
BLAKE2b-256 5968c791181ecf71c3362129a2f2f33563c845ed0ea2cfb01c892c89c32f5523

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp37-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp37-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c8208fa4b406863120bbb69e537e8af990172261ad81f0146642d05294daa4c3
MD5 5aa1ea37519bfbd296b703c4fd1b12f7
BLAKE2b-256 82c4e6a5a07c4ef6a47ba4bdaeea8e93c99cbfe5c08c4495cf1d46411586c5d0

See more details on using hashes here.

File details

Details for the file otdrs-1.1.1-cp37-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.1-cp37-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0c79b90f3f3641631a09db59b7d25e98cfd75538f2ca3243a1d8104fc37332ed
MD5 ce2811c8d409f9fe192810ab5c13bc86
BLAKE2b-256 fdfa36709509dc5f31f8aec01cf3be5af3da449b6e317bc1dcf4b4e7ead2fb77

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page