This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

AgileTV Origin & Media Server

Origin and Media Server components

1.1 -

ESB3002 Software Repackager User Guide

ESB3002 Software Repackager User Guide

1 Confidentiality notice

This document is confidential and may not be reproduced, distributed or used for any purpose other than by the recipient for the assessment, evaluation and use of AgileTV products, unless written permission is given in advance by AgileTV.

2 About this document

This document covers an overview of the SW Repackager including chapters describing the installation, configuration, and running of the product. No prior knowledge about the system is assumed. Intended audiences include system administrators who install the system, operators who use it, and anyone who is interested in learning more about the product.

3 How to use this document

This document aims to be used as a foundation to build an understanding around the product. The document is to be used a guideline when working with the product. This document does not define any specific information on feature development in specific releases, please refer to “Release Notes”. Neither does this document define any applications relying on the specific product, please refer to “Application Notes”.

4 References

[1] EDGS-069 Convoy Management Software - User Guide

[2] EDGS-122 Convoy Management Software - CCMI Specification

[3] EDGS-138 VCP Origin User Guide

[4] Nginx documentation - http://nginx.org/en/docs/

[5] Timed Text Markup Language 1 (TTML1) - https://www.w3.org/TR/ttaf1-dfxp/

[6] DASH Industry Forum Profiles -http://dashif.org/identifiers/profiles/

[7] EDGS-156 TV content capture - CCMI CLI

[8] RFC6381 - The 'Codecs' and 'Profiles' Parameters for "Bucket" Media Types

[9] HLS Authoring Specification for Apple Devices - https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html

[10] EDGS-107 - HTTP Configuration Interface

[11] EDGS-168 - DRM Gateway User Guide

[12] Codes for the Representation of Names of Languages - https://www.loc.gov/standards/iso639-2/php/code_list.php

[13] License generation in Xops and ScientaMedia for SW Licenses

[14] VoD Ingest user guide - https://docs.agilecontent.com/docs/acp/esb3021

[15] EDGS-216 - Software Origin Use Cases

4.1 Third party acknowledgement

The Software Repackager uses the Bento4 C++ library to read MP4 files in some workflows.

Bento4 Software Copyright © Axiomatic Systems LLC, 2002-2017. All rights reserved.

5 History

VersionDateChanges
A12017-06-12First version
A22017-01-15Add CacheFS section
A32017-02-22ESB3002-1.4.0 features
A52018-08-28Update DASH configuration
2018-12-04Update DRM configuration
2018-12-08Add Alarms
A62019-06-12Add DRM key rotation
2019-06-13Update HLS configuration
A72019-08-16Add new HLS ad marker type
2019-09-06Add health and monitoring
2019-11-28Add S3 storage support
A82020-01-24Add HLS fMP4 support
2021-06-04Add subtitle styling support
A92022-02-09Add WebVTT support to HLS fMP4
2022-02-22Drop unmanaged VOD support
2022-04-12Update HLS configuration
2022-05-11Update storage configuration
A102022-07-18Update HLS configuration
2022-07-20Update upgrade instructions
2022-08-29Drop Active Edge
A112022-11-28Add segment cache
2023-01-17Add RHEL8 support
A122023-03-07Update cache flushing
2023-05-08Add channel timeshift
A132023-06-22Update cache configuration
2023-09-26Add DASH Timeline with $Number$ support
2023-09-15Add DASH WebVTT subtitle support
2023-10-09Add HLS muxed TS support
2023-11-23Add colorspace filter
A142024-03-14Update DASH configuration
2024-04-19Drop RHEL7 support
2024-04-26Update installation instructions
2024-05-29Update Used files and ports
2024-08-14Update segment cache
2024-10-02Add DASH thumbnails support
2024-10-18Add DASH Low Latency configuration
A152025-05-20Add DASH and HLS thumbnail configuration

6 SW Repackager overview

6.1 Description

The SW Repackager provides just-in-time packaging (JITP) of adaptive bitrate content into the commonly used formats DASH, HLS, and MSS. Among other features the SW Repackager supports encryption on egress, subtitling and multiple audio tracks.

The image below shows how the SW Repackager fits into AgileTV's ecosystem of products and services:

6.2 Content source format

For video-on-demand the repackager supports only content that has been ingested in the internal ESF format. All media files must be accessible in the file system on the SW Repackager, e.g. by using an NFS-mounted resource, alternatively as S3/Azure object storage.

The SW Repackager can also serve live content that has been generated by the SW Live Ingest.

For all types of content, there is a possibility to add a whitelist of allowed output profiles. A typical use case is that some live channels should be provided in the clear, while other should only be available encrypted with DRM. One should then make two channel groups and include the output profile for clear content in one, and an output profile with encryption in the whitelist for the other.

The configuration is done via services.repackaging.content.X.name.outputProfiles where X is the type of content, and name is the name of the content group. For example: The whitelist parameter for live channels in channel group "live" is services.repackaging.content.channelGroups.live.outputProfiles.

If the outputProfiles list is empty, all output profiles are allowed for that content group, while if the list have some entries, that content group is only accessible via the ones listed.

The default configuration for the outputProfiles whitelist is ["default"] which means that the content is only accessible with the "default" output profile. By emptying the list, all output profiles will be accessible. For instance, to empty the output profile list for the channel group named live do:

confcli services.repackaging.content.channelGroups.live.outputProfiles -d

The matching against the whitelist is performed only on the output profile name, regardless of the account.

6.2.1 Live Content

In order to stream a live channel from SW Live Ingest, the SW Repackager needs to be configured with a source of type channel and provide a location which points to the SW Live Ingest host using HTTP over port 8090. For example, http://sw-liveingest:8090. There is also a possibility to add a backup location pointing to secondary SW Live Ingest host. See Content Sources for more details how to configure a live channel source.

6.2.2 Video-on-demand Content

The common storage format that is used by the Software Repackaging System consists of MPEG CMAF (Common Media Application Format) files for audio, video, and text data, in combination with a number of additional metadata files. This complete set of files is referred to as a managed asset or an ESF (Edgeware Storage Format) asset. This format is what the WebTV Recorder produces when it makes a recording (content record) from a live channel or when it converts (content upload) an existing VOD asset.

In a workflow where output from the Recorder is repackaged and streamed, a source of the type managed should be added to the SW Repackager. See Content Sources for more details how to configure a managed source.

6.3 Encryption and Digital Rights Management (DRM)

The SW Repackager supports integration with different DRM solutions through the DRM Gateway [11] which provides a single integration point for third party DRM Systems. Once the SW Repackager has obtained the DRM information it can protect the content by encryption before streaming it to the client. The following modes of encryption is supported by the SW Repackager:

Streaming FormatEncryption Mode
HLSAES-CBC (AES-128 and SAMPLE-AES)
MSSAES-CTR (Full sample)
DASHAES-CTR (Full sample)

DRM is configured by adding DRM-enabled output profiles. See the section Output profiles for further details.

DRM key rotation is supported for live content, with output formats DASH and HLS. For DASH, multiple periods will be used when a manifest spans across a key period boundary. Key rotation is set up in the DRM Gateway [11].

See [2], [7], and [11] for details on how to control the content DRM ID.

Note: SW Repackager from version 1.14.2 and onwards use newer version of eDRM API and needs DRM Gateway version 2.4.1 or higher.

6.4 Presentations

The set of variants that is presented to a client when accessing multi-bitrate content can be controlled by using presentation filters. Each filter is configured to accept variants based on media properties such as bitrate or the number of audio channels. Variants that do not match the filtering rules will be excluded from the content's manifest.

6.4.1 Accessing presentations

The SW Repackager uses the manifest name - or the name of the master playlist for HLS - to determine what presentation filters to use when rendering a response. More specifically, the SW Repackager will remove any extension from the requested manifest filename and use the remaining name to search among the defined presentations. The example below shows what manifest names to use to select a user-defined presentation called mobile:

Streaming FormatManifest nameSelected presentation
HLSmobile.m3u8mobile
MSSmobile.manifestmobile
DASHmobile.mpdmobile

In order to support standard manifest names for HLS, MSS and DASH, the Software Repackager is shipped with the following presentations installed:

Streaming FormatManifest namePresentation name
HLSindex.m3u8index
MSSManifestManifest
DASHmanifest.mpdmanifest

6.4.2 Filter chain logic

When the current presentation has been selected based on the requested manifest name, the SW Repackager filters the variants in the content through the filters in the presentation. The variants are grouped and filtered based on their media type, i.e. video variants are sent through the videoFilters list and so on.

Within each media type, the filters are applied in the order that they appear in the filter list. As the set of variants pass through the list of filters the subset of variants that matches the current filter is moved to the output and the rest of the variants are passed on to the next filter in the list.

The pre-installed index presentation for HLS illustrates how the filter chain can be used to promote variants in the resulting manifest. In their HLS Authoring Specification [9], Apple specifies that the 2000 kb/s video variant should be listed first in the master playlist, so the first video filter, 2Mbps_selection, picks variants with a bitrate between 1800 kb/s and 2200 kb/s and adds to the output. The remaining video variants will be passed on to the next filter, remaining_video, that sorts the remaining variants before adding them to the output.

{
    "index": {
        "audioFilters": [
            {
                "codec": "*",
                "languages": [
                    "*"
                ],
                "maxBitrate": 4294967295,
                "minBitrate": 0,
                "name": "all_audio",
                "numChannels": 0,
                "order": "none"
            }
        ],
        "name": "index",
        "subtitleFilters": [
            {
                "languages": [
                    "*"
                ],
                "name": "all_subtitle"
            }
        ],
        "videoFilters": [
            {
                "codec": "*",
                "colorspaces": [
                    "*"
                ],
                "maxBitrate": 2200000,
                "minBitrate": 1800000,
                "name": "2Mbps_selection",
                "order": "descending"
            },
            {
                "codec": "*",
                "colorspaces": [
                    "*"
                ],
                "maxBitrate": 4294967295,
                "minBitrate": 0,
                "name": "remaining_video",
                "order": "descending"
            }
        ]
    }
}

6.4.3 Trick Play Support

SW Repackager can generate trick play tracks as defined in the HLS and MPEG-DASH specifications. These can be used to implement trick play modes, but possibly also scrub bar with thumbnails, in the client applications. Whether such extra variants or representations are included in the master playlist or MPD is controlled by parameters in the presentations.

6.4.3.1 For HLS

  • I-frame Playlists are used as defined in the HLS specification.
  • There is one I-frame Playlist per video track.
  • Each I-frame segment is generated on the fly and contains an I-frame from the corresponding video segment.
  • Works for both TS segments and fMP4 segments.
  • The I-frame Playlist bitrate, as reported by the BANDWIDTH attribute, is calculated by multiplying the BANDWIDTH of the corresponding video track by (number_of_i_frames_per_video_segment / (2 * video_segment_length_in_seconds)).
  • This feature is enabled via the iframePlaylist parameter in the presentation's HLS configuration.

6.4.3.2 For DASH

  • Following the DASH-IF IOP specification, there is an extra adaptation set with EssentialProperty descriptor with URL http://dashif.org/guidelines/trickmode that provides trick mode representations corresponding to all the normal video representations
  • Each trick play segment is generated on the fly and contains the first I-frame of the corresponding video segment
  • Each trick mode segment carries one I-frame corresponding to the first I-frame in the normal segment
  • This feature is enabled via the trickMode parameter in the presentation's DASH configuration.
  • Following the DASH-IF IOP specification, Representations in two or more Adaptation Sets may provide the same content. In addition, the content may be time-aligned and may be offered such that seamless switching across Representations in different Adaptation Sets is possible.
  • A content author may signal such seamless switching property across Adaptation Sets by providing a Supplemental Descriptor along with an Adaptation Set with @schemeIdUri set to urn:mpeg:dash:adaptation-set-switching:2016 and the @value is a comma separated list of Adaptation Set IDs that may be seamlessly switched to from this Adaptation Set.
  • Different players will have different configurations, some players don't support adaptation-set-switching and some players already support switching across Adaptation Sets without any further editing in the manifest.

Tip: Use ew-repackager-tool for quickly testing the presentation configuration, see ew-repackager-tool.

6.4.4 Thumbnail support

Many client applications do not support scrub bar with thumbnails using Trick Play tracks. One of the alternatives, "image-based thumbnail track", can be included to HLS master playlist or DASH MPD by SW Repackager if:

  • The upstream supports thumbnail generation, either on-the-fly in ESB3003 or at ingested time in ESB3021.
  • Corresponding parameter under presentations is enabled.

NOTE: It is recommended to enable segmentCache in SW Repackager and CBM Accelerator cache in SW Live Ingest to reduce performance impact of thumbnail generation.

6.4.4.1 For HLS

  • Image media playlist specification is not developed by Apple, but 3rd-party.
  • This feature is enabled via thumbnail parameter in the presentation's HLS configuration.

NOTE: It is recommended to check and test player compatibility before using this feature since no Apple player and only a few non-Apple players support this.

6.4.4.2 For DASH

  • Follow DASH IOP specification, the adaptation set with EssentialProperty descriptor with URL http://dashif.org/guidelines/thumbnail_tile provides thumbnail representations.
  • This feature is enabled via thumbnail parameter in the presentation's DASH configuration

6.5 Scripting

ESB3002 has scripting capabilities provided by Lua scripts https://www.lua.org/. This is made possible by using the Lua Nginx module https://github.com/openresty/lua-nginx-module.

Some use cases where scripting can be useful in repackager are:

  • Manipulating repackager manifests/playlists
  • Manipulating text based segments e.g. subtitles
  • Add or change HTTP headers

Lua scripts can be pretty powerful and documentation on how to use it together with Nginx event model can be found on the module's Github page (see link above).

6.5.1 Scripting in Repackager

The Lua code can be written either in separate files or in nginx config blocks.

When using Lua scrips in repackager they should always be implemented in, or called from /etc/ew-repackager/ew-repackager-custom.conf in order to not be overwritten on an upgrade.

NOTE:

  • According to doc and due to the fact that Repackager might issue multiple subrequests to many upstreams (i.e. drm-gw, live ingest), lua scripts can be executed more than once each client requests. Be careful on conditioning to process the right target. For illustration, the uri of client request is a substring of uri to drm-gw, only checking extension like below example isn't enough.
  • Locations inside ew-repackager-custom.conf that shallows locations in ew-repackager-server.conf MUST including to send corresponding customer headers (if any), since only the first match is executed (see nginx doc).

6.5.1.1 Example

This is an example on how to change the language attributes in a DASH manifest from 'dan' to 'Dansk' using lua script implemented in nginx config blocks.

Content of /etc/ew-repackager/ew-repackager-custom.conf:

# When changing the length of the response body,
# clear content-length to enforce streaming output
header_filter_by_lua_block {
    if ngx.status == 200 then
        -- Only act on 200 responses
        local uri = ngx.var.uri
        if uri:sub(-4) == ".mpd" then
            -- It is a DASH manifest request -
            -- clear content length
            ngx.header.content_length = nil
        end
    end
}

body_filter_by_lua_block {
    if ngx.status == 200 then
        -- Only act on 200 responses
        local uri = ngx.var.uri
        if uri:sub(-4) == ".mpd" then
            ngx.log(ngx.DEBUG, "edgeware - DASH Manifest request: "..uri)
            -- It is a DASH manifest request - read the response body
            local chunk = ngx.arg[1]
            -- Substitute language code and update response body
            ngx.arg[1] = string.gsub(chunk, "lang=\"dan", "lang=\"Dansk")
        end
    end
}

Since the new text is longer the resulting response body will be larger and hence the HTTP header Content-Length will be incorrect. This is fixed by clearing the Content-Length header which will force use of chunked transfer encoding (this is being done in header_filter_by_lua_block in the example). If you know how much content length will change you can just update it with, in this case 2 bytes

header_filter_by_lua_block {
    ngx.header.content_length = ngx.header.content_length + 2
}

The example also uses Lua comments -- and is logging to the repackager error log (on debug log level).

7 Output Formats

7.1 Description

The SW Repackager outputs HTTP streaming media in three formats: MPEG-DASH (DASH), Apple HTTP Live Streaming (HLS), and Microsoft Smooth Streaming (MSS) from a common internal format based on CMAF. The output consists of manifests (or playlists) and media segments for video, audio and subtitles. Video and audio can be encrypted.

The output formats are configured in two places. Output profiles define essential properties that influence the media segments and manifests such as encryption, while presentations only influence the manifests, but not the segments.

The output is also depending on the ingest process. In particular, the video sample entry format (e.g. avc1 or avc3 for H.264) is transparently used. When inband parameter sets are used, like in avc3, the stream properties may change over time as the original source parameter sets changes. A typical change would be picture aspect ratio. For audio, properties that may change are the number of channels or language. This type of changes may lead to minor discrepancies between the description of the media in manifests or playlists compared to what is currently streamed.

7.1.1 Language codes

For source material using three-letter ISO 639-2 language codes, being either live channels or ingested VOD content, two-letter ISO 639-1 codes are used in the output whenever there is a direct translation to this format. ISO 639-2/B and ISO 639-2/T codes having ISO 639-1 counterparts are supported. See e.g. [12] for a listing of these codes.

7.1.2 HLS Output

The HLS output format is MPEG-2 TS segment for audio and video and WebVTT segments for subtitles. Individual files are used for all segments and these are addressed as numbers.

Video and audio are always delivered as separate streams (not multiplexed). The HLS version is automatically chosen depending on what features are used. The minimal version is 4, but using Sample-AES means that the version is at least 5.

7.1.2.1 Subtitle Styling and Layout

For VOD, ingested from HLS/WebVTT, the following elements are output as ingested: inline styling tags, the file header (with e.g. stylesheets) and layout control (from WEBVTT settings). For a precise description of exactly what is ingested please refer to the ESB-3005 user guide.

7.1.3 DASH Output

DASH can be served either using the live profile, urn:mpeg:dash:profile:isoff-live:2011, or the on-demand profile, urn:mpeg:dash:profile:isoff-on-demand:2011.

For live and catchup content, regular segmentation is used throughout the system. Segment URLs are described in the manifest using SegmentTemplate with either $Number$ or SegmentTimeline depending on output profile settings. Please see Output profiles for details.

For VoD, the SegmentTemplate is used together with SegmentTimeline to provide a more flexible solution that can handle irregular segmentation.

The on-demand profile requires that the client uses HTTP byte-range requests to download parts of the media content. This profile can be used for both streaming and for dowloading assets for offline playback.

7.1.3.1 DASH thumbnails

For VOD and Recordings, thumbsnails tracks can be served along with DASH manifest if there are tracks with media type thumbnails in content_info.json. This can be generated by enable thumbnails option when recording or uploading by ew-vodingest (ESB3021). For assets lacking thumbnails tracks, ew-generate-thumbnails can be used to generate that kind of track. See [14].

Image-based thumbnails are not part of the DASH standard, but specified by DASH-IF. According to the DASH-IF IOP specification, imaged-based thumbnails should be provided as separate AdaptationSets. An additional constraint is that they must use SegmentTemplate with $Number$ independent of the SegmentTemplate of other AdaptationSets. Below is an example:

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" type="static" mediaPresentationDuration="PT9H57M21S" minBufferTime="PT3S">
  <Period>
    <AdaptationSet contentType="video" par="16:9" segmentAlignment="true" mimeType="video/mp4" startWithSAP="1" scanType="progressive">
      <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
      <Representation id="video_h264_150kbps" bandwidth="150000" width="640" height="360" sar="1:1" frameRate="50/1" codecs="avc1.64001F">
        <BaseURL>video_h264_150kbps.cmfv</BaseURL>
        <SegmentBase indexRange="715-75422">
          <Initialization range="0-714"></Initialization>
        </SegmentBase>
      </Representation>
    </AdaptationSet>
    ...
    <AdaptationSet contentType="image" mimeType="image/jpeg">
      <SegmentTemplate media="$RepresentationID$/$Number$.jpeg" duration="35841" startNumber="1"></SegmentTemplate>
      <Representation id="thumbnails-240x135" bandwidth="1000" width="720" height="22545" codecs="jpeg">
        <EssentialProperty schemeIdUri="http://dashif.org/thumbnail_tile" value="3x167"></EssentialProperty>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

It depends on player to support mixed SegmentTemplates and tiling of thumnails.

NOTE: A limitation of the $Number$-based SegmentTemplate is that the time of the thumbnails cannot be fine tuned. The thumbnail process in VoD Ingest generates thumbnails from the first image of every segment.

7.1.3.2 Clock Synchronization

For live DASH with $Number$ template, it is very important that the server and client clocks are synchronized. To guide the client, DASH has standardized a number of different UTCTiming methods and they can be listed in decreasing priority order in the MPD.

The default output from the SW Repackager is a single entry:

<UTCTiming
    "schemeIdUri" : "urn:mpeg:dash:utc:http-iso:2014"
    "value": "https://time.akamai.com/?iso"
/>

but a list of UTCTiming values can be specified as dash parameters in a presentation.

7.1.3.3 Subtitle Styling and Layout

The subtitle style and layout is controlled from the subtitle styling template. This style is used for all DASH subtitle output.

For DASH, the output TTML should follow the IMSC-1 specification and the template path is: /etc/ew-repackager/ttml-styling-DASH-custom.template. If the custom template is missing then the default template is used: /etc/ew-repackager/ttml-styling-DASH-default.template. The default template may be modified when upgrading to new versions. Upgrading will not affect the custom template.

The styling and layout sections of the DASH template can look like this:

    <styling>
      <style xml:id="s0"  tts:fontFamily="sansSerif"
                          tts:fontSize="100%"
                          tts:lineHeight="normal"
                          tts:color="#FFFFFF"
                          tts:wrapOption="noWrap"
                          tts:textAlign="center"/>
      <style xml:id="s1"  tts:color="#ffffff"
                          tts:backgroundColor="#000000"
                          ebutts:linePadding="0.5c"/>
    </styling>
    <layout>
      <region xml:id="r0" tts:origin="15% 80%"
                          tts:extent="70% 20%"
                          tts:overflow="visible"
                          tts:displayAlign="after"/>
    </layout>

E.g: to get a black background with 75% transparency change tts:backgroundColor="#000000" [opaque] to tts:backgroundColor="#00000040" For changes in the styling template to take effect, the repackager service must be restarted. The template variables such as {{ lang }} and {% block cues %}, must not be touched. Edit the template with great care, no verification is made of its correctness.

7.1.3.4 Ingested Styling Tags

For VOD, ingested from HLS/WEBVTT, inline styling is translated as follows: Style tags <b>, <i> and <u> are translated into the corresponding TTML span attributes. Color tags (e.g: <c.yellow>) are translated only for the foreground colors, and only for the standard colors. Background colors are ignored. (The standard colors are: "white", "lime", "cyan", "red", "yellow", "magenta", "blue", "black", "green") Ingested layout control (from WEBVTT settings) and stylesheet styling is currently not translated for DASH and MSS.

7.1.4 MSS Output

The MSS follows the Microsoft Smooth Streaming format 2.0 by default.

According to the MSS specifications, the manifest URLs must have the format ..../something.ism(l)/Manifest. The repackager will accept such URL but ignores the something.ism(l)/.

The timescale used in MSS output is 10MHz. This can lead to very large timestamps for live content, since by default all timestamps are in UNIX Epoch time. Javascript cannot handle integers needing more than 53 bits, and therefore some JavaScript players may have issues with the timestamps. To make the timestamps smaller, the referenceTimeVsEpochS setting in ESB3003 can be changed. Note that this will change the time reference for DASH as well.

In order to use the r= tag feature, to make manifests shorter when having consecutive segments with identical duration, change MSS version to 2.2 using the presentation configuration parameter `mss.version'.

Example below:

services.repackaging.streaming.accounts.default.presentations.Manifest.parameters.mss.version 2.2

7.1.4.1 Subtitle Styling and Layout

Templatized subtitle styling and layout is described under DASH Output -> Subtitle Styling above.

For MSS the template path is: /etc/ew-repackager/ttml-styling-MSS-custom.template. If the custom template is missing then the default template is used: /etc/ew-repackager/ttml-styling-MSS-default.template. The default template may by modified when upgrading to new versions. Upgrading will not affect the custom template.

7.1.4.2 Ingested Styling Tags

Ingested styling is handled the same way for MSS and DASH. Please see DASH Output -> Ingested Styling Tags

7.2 Live and Catchup Manifests

Live and catchup have many similarities. Live manifests provide a sliding window of fixed duration. Its duration is given by the configuration parameter liveWindow, which is set in the corresponding presentations. A catchup request is a request for a live channel with extra time-marker parameters in the query string.

7.2.1 Time markers to extract catch-up content

SW Repackager accepts two query parameters, startTime and stopTime in the request URL. These can be used to specify an open-ended (startTime only) or double-ended (startTime and stopTime) interval to limit the content. The resulting manifest will either be of live or VOD type, depending on whether stopTime is in the past, or in the future. The details are described below, and for DASH, there is a table describing how all the relevant Manifest parameters change.

The times can be specified as IETF timestamps in UTC time such as 20170101T140000Z or as epoch time (seconds since 1970-01-01T00:00:00Z) such as 1483279200.

7.2.1.1 Open-ended interval

This is the case where only startTime is specified. The result is a live manifest that will start at startTime and grow until it reaches maximumManifestDuration at which time it becomes a sliding window. For DASH, which does not have an explicit list of segments, this behavior is achieved by setting availabilityStartTime = startTime and timeShiftBufferDepth = maximumManifestDuration.

Note that this manifest is always a live manifest. The typical player behavior is therefore to start playing from the live-point and not from the start of the interval.

The manifest is limited in the following way:

7.2.1.1.1 startTime > now

In this case, there is no valid content, so the HTTP response is "HTTP 412 Precondition Failed".

7.2.1.1.2 startTime < now and (now - startTime) < maximumManifestDuration

For HLS and MSS, a live manifest starting at startTime and ending at now is returned.

7.2.1.1.3 startTime < now and (now - startTime) > maximumManifestDuration

In this case, the manifest is limited by the maximumManifestDuration and transitions into becoming a sliding window covering the the interval [now - maximumManifestDuration, now]. For DASH, this is achieved automatically without updating the manifest, since the timeShiftBufferDepth value governs what is available.

7.2.1.2 Double-ended interval

In this case, both startTime and stopTime are specified.

  • If stopTime is in the past, the manifest returned is a VoD manifest.
  • If stopTime is in the future, a live manifest with a fixed first segment is returned. This corresponds to #EXT-X-PLAYLIST-TYPE:EVENT in HLS, and this is also signaled. For DASH, and the manifest is of type dynamic before stopTime, and of type static after.
7.2.1.2.1 startTime > stopTime

startTime must always be before stopTime, so in this case, "HTTP 400 Bad Request" is returned.

7.2.1.2.2 startTime > now

Content not available, and the HTTP response is "HTTP 412 Precondition Failed".

7.2.1.2.3 startTime < now < stopTime

Content is available as a growing live interval. The HLS media playlists signal #EXT-X-PLAYLIST-TYPE:EVENT. DASH manifest is of type dynamic with AST= startTime, timeShiftBufferDepth = stopTime - startTime. Manifest is limited by maximumManifestDuration just like open-ended case.

7.2.1.2.4 stopTime < now and startTime > (now - circularBuffer)

Content is available as a fixed VoD asset limited by maximumManifestDuration, e.g, covers interval [max(startTime, stopTime - maximumManifestDuration), stopTime]. The HLS media playlists signal #EXT-X-PLAYLIST-TYPE:VOD. For DASH, the manifest type is now static.

7.2.1.2.5 startTime < (now - circularBuffer)

startTime is outside the circularBuffer interval, so the content range is not available, "HTTP 410 Gone" is returned.

7.2.1.3 DASH manifest details

DASH Manifests have a number of parameters that will have different values in the different live and catchup cases. In the table below, these values are listed:

ParameterLivestartTime onlystopTime in futurestopTime in past
MPD@typedynamicdynamicdynamicstatic
MPD@availabilityStartTimereference timestartTimestartTimeNA
SegmentTemplate@startNumberNumber at (now - liveWindow)Number at startTimeNumber at startTimeNumber at startTime
MPD@minimumUpdatePeriodDASH MUPDASH MUPDASH MUPNA
MPD@timeShiftBufferDepthliveWindowMax manifest durationstopTime - startTimeNA
MPD@mediaPresentationDurationNANANAstopTime - startTime
AdaptationSet@presentationTimeOffsetnow - liveWindowstartTimestartTimestartTime
MPD@publishTime (Number Template)ASTstartTimestartTimeLast segment end time
MPD@publishTime (Segment TimelineLatest end timeLatest end timeLatest end timeLast segment end time
and Segment Timeline with $Number$)
Event@presentationTime0variablevariablevariable
Event@durationoriginal valuevariablevariablevariable
Latency@target>= targetLatency>= targetLatency>= targetLatencyNA

Notes:

  • The availabilityStartTime for live is configured with the referenceTimeVsEpochS parameter.
  • The minimumUpdatePeriod, DASH MUP, is configured as as a dash parameter in a presentation
  • The liveWindow and maximumManifestDuration are general parameters in a presentation
  • The mediaPresentationDuration and timeShiftBufferDepth values will not be exactly stopTime-startTime, but be clamped to the closest segment start and end times.
  • An Event's presentationTime (EPT) and duration (ED) parameters are adjusted based on the first segment's presentation time (SPT), which is also the Period start time.

    If the EPT is before SPT, then:
    • the EPT value is set to the relative beginning of the SPT, which is 0,
    • the ED value is shortened by the difference between SPT and EPT
    If the EPT is after SPT, then:
    • the EPT value is set to the relative beginning of the SPT, which is the difference between EPT and SPT
    • the ED value remains unchanged
  • The Latency's target won't exceed the configured targetLatency by an amount of average segment duration.

8 Installation

8.1 Prerequisites

The SW Repackager requires RHEL 8.9+ as operating system. Other RedHat binary compatible distributions are unofficially supported.

8.1.1 Hardware

Contact AgileTV for information regarding the recommended hardware setup.

8.2 Preparation

8.2.1 Firewall

The following ports must be opened in the firewall:

PortDescription
:80Default HTTP streaming port
:5000Optional. Control port for the configuration
service. Needed if Convoy or ESB3011 GUI is used
for propagating the configuration.
:12345Optional. Control port for the monitor service.
Needed if ESB3011 GUI is used for monitoring the
SW Repackager node.
:4999Optional. Port to get error log and version of
SW Repackager. Needed if ESB3011 GUI is used for
monitoring the SW Repackager node.
:2000Optional. Port for health check service. Needed
if ESB3011 GUI is used for monitoring the SW
Repackager node.

Note: The firewall is not part of the SW Repackager bundle and it is assumed that it is configured and managed by the customer.

8.2.2 SELinux

The SELinux should be in permissive or disabled mode. In enforcing mode, customer has to manage rules themself to let SW Repackager works.

8.2.3 System limit

To avoid service runs out of file descriptors when in high load, the system-wide and process limit of opened files must be at least 1048576.

First, check the current system value

# sysctl fs.nr_open
# sysctl fs.file-max

If any of them is smaller than 1048576, then add corresponding entry to /etc/sysctl.conf, nr_open must not exceeds file-max. For example:

fs.nr_open = 1048576
fs.file-max = 6537812

To apply the changes without rebooting:

# sysctl -p

You can verify the change by running sysctl without -p again.

8.3 Installation

For installing the SW Repackager

[root@esb3002 ~]# chmod +x install-esb3002-X.Y.Z
[root@esb3002 ~]# ./install-esb3002-X.Y.Z

8.4 Starting, stopping and restarting

To perform any action on SW Repackager:

[root@esb3002 ~]# systemctl <action> ew-repackager

where <action> is one of below:

<action>What it does
startStart service
statusVerify service status (running, stopped, failure, etc.)
restartRestart service and flush the cache
reloadRestart service without flushing the cache, no downtime
enableAuto-start service on system boot

8.5 Removal

To uninstall the SW Repackager do as follows:

[root@esb3002 ~]# systemctl stop ew-repackager ew-repackager-confd confd
[root@esb3002 ~]# dnf autoremove esb3002

9 Upgrade

Follow these steps to upgrade the SW Repackager to a newer version.

Note: Always review the release note for any particular instructions or compatibility issues in addition to the general procedure explained here in the user guide.

Run the installer with option -u:

[root@esb3002 ~]# chmod +x install-esb3002-X.Y.Z
[root@esb3002 ~]# ./install-esb3002-X.Y.Z -u

Then restart confd to load any configuration updates in the new version. Finally start the repackager service which in turn should start ew-repackager-confd service:

[root@esb3002 ~]# systemctl restart confd ew-repackager-confd
[root@esb3002 ~]# systemctl restart ew-repackager

9.1 Complete reinstallation

  1. Remove the repackager according to above
  2. Install the new Repackager according to above
  3. Restore configuration If you have made manual changes to configuration files such files will be saved in textfiles named <filename>.rpmsave, e.g: nginx.conf.rpmsave for nginx.conf. Inspect the following directories for such saved files, and manually merge your changes from the save files:
  • /etc/ew-repackager/*
  • /etc/logrotate.d/*
  1. Restart the service according to above

9.2 Update of encryption settings for output profiles

If upgrading from ESB3002 1.12 or earlier, encryption settings in output profiles need to be reconfigured on both SW Repackager and on DRM Gateway.

The steps needed to transform the configuration are:

  • Create accounts and output profiles with same names in DRM Gateway as in SW Repackager. Only output profiles that use encryption need to be created.
  • The last part in keyServerUrl in the output profile is shared secret. That value goes into a new parameter sharedSecret.
  • The encryption parameter is moved from SW Repackager to DRM Gateway.
  • The list of the processors from keyServerUrl goes into processors list in DRM Gateway. List of processors is part of keyServerUrl between /api/1/eDRM and shared secret part, split on /. If the list of processors starts with a processor of type Cenc (named cenc in default configuration), it can be omitted.

For example, if output profile named profile1 on default account was configured like:

{
    ...
    "drm": {
        "encryptAudio": true,
        "encryption": "cenc",
        "enable": true,
        "validateCert": true,
        "keyServerUrl": "https://edgeware-drm-gw:4443/api/1/eDRM/cenc/clearkey/widevine/playready/shared-secret",
        "certPath": "/etc/edgeware/drm-gw/server.crt"
    },
    "name": "profile1"
},
{
    ...
    "drm": {
        "encryptAudio": true,
        "encryption": "sample-aes",
        "enable": true,
        "validateCert": true,
        "keyServerUrl": "https://edgeware-drm-gw:4443/api/1/eDRM/fairplay/shared-secret",
        "certPath": "/etc/edgeware/drm-gw/server.crt"
    },
    "name": "profile2"
}

Then, the new configuration in SW Repackager should be:

{
    ...
    "drm": {
        "encryptAudio": true,
        "enable": true,
        "validateCert": true,
        "keyServer": "edgeware-drm-gw:4443",
        "keyServerBackup": "",
        "sharedSecret": "shared-secret",
        "certPath": "/etc/edgeware/drm-gw/server.crt"
    },
    "name": "profile1"
},
{
    ...
    "drm": {
        "encryptAudio": true,
        "enable": true,
        "validateCert": true,
        "keyServer": "edgeware-drm-gw:4443",
        "keyServerBackup": "",
        "sharedSecret": "shared-secret",
        "certPath": "/etc/edgeware/drm-gw/server.crt"
    },
    "name": "profile2"
}

And the new section with accounts and output profiles in DRM Gateway should be:

"accounts": [
    {
        "name": "default",
        "outputProfiles":
        [
            {
                "name": "profile1",
                "encryption": "cenc",
                "processors": ["clearkey", "widevine", "playready" ]
            },
            {
                "name": "profile2",
                "encryption": "sample-aes",
                "processors": ["fairplay" ]
            }
        ]
    }
]

10 Configuration

10.1 Configuring using confd

The SW Repackager is configured through the confd service, that is included in the SW Repackager installer. The SW Repackager can also be configured via an HTTP REST API. For more information about this, see [10].

In this document, all configuration will be performed via the confd command line interface confcli.

To work with the configuration, a basic understanding of the JSON format is needed. Please see http://en.wikipedia.org/wiki/JSON for more information.

The configuration is modeled as a tree, with different paths for the various groups of configuration. The base path for all repackaging configuration is services.repackaging.

To list the complete configuration for the SW Repackager, enter the following on the command line on the SW Repackager node:

    confcli services.repackaging

The command line switch -h can be used to make confcli display a short description of the current configuration element if such a description is available. Below, the help for the SW Repackagers logging settings is shown:

[root@esb3002 ~]# confcli services.repackaging.logging.repackaging. -h
repackaging:

Resource Commands:
  enable  Turn logging on or off (default: True)
  level   The repackaging log level (default: info)
  path    The path to the repackaging log (default: /var/log/edgeware/ew-
          repackager/repackaging.log)

10.2 Configuration elements

10.2.1 Cache

The cache configuration is located in:

  • services.repackaging.metadataCache: store upstream server metadata objects, divided into 3 groups: drm for DRM objects, esf for managed content, and channel for live content. For performance reason, they are cached in each worker memory.

  • services.repackaging.segmentCache: store jitp output segments, and HTTP upstream server objects. For same reason, but due to nature of objects (mostly big binary files), they are stored on RAM disk.

NOTE: Caches from this level and downstream must be purged after any changes in configuration that affects content generation, for example, change dashContent of output profile, in order to get new fresh content. However, that action will result in temporarily increased load on SW Origin as the caches are refilled. To clear all caches, run the following command:

    sudo ew-repackager-tool clear-cache all

10.2.1.1 Segments cache

The generated files and input files from ingest servers, e.g. metadata, media segments, etc., are cached on /dev/shm/cache-repack, which basically a RAM disk.

enable - Toggle on/off the cache. The default value is True.

numObjects - The maximum number of files to be cached. The default value is 20000.

capacity - The capacity of cache. The default value is 10GB.

upstreamLive - Enable caching for HTTP Live channel upstream responses. The default value is False.

upstreamVod - Enable caching for HTTP VOD upstream responses. The default value is False.

The cache-missed requests are logged into /var/log/edgeware/ew-repackager/access-forward.log. The subrequests to ingest servers are logged into /var/log/edgeware/ew-repackager/access-upstream.log.

NOTE:

  • The cache efficiency depends on the uniqueness of requests and upstream latency. Check the system setup and properties of incoming traffic before using. In some conditions, with upstreamLive and/or upstreamVod enabled, response time is not improved or even worse, such as:
    • The requests are mostly live toward one dominant pair of output profile and presentation.
    • SW Repackager and SW Live Ingest (or HTTP VOD service) are on same host or latency between them is better than RAM disk.
  • The cache capacity must not exceed the size of /dev/shm. An excessive cache would cause serious system malfunction. For this reason, such values are not applied and the cache is turned off with a log warning to /var/log/edgeware/ew-repackager-confd/ew-repackager-confd.log. As a result, the cache is always disabled when RAM amount on system is 2GB or less.

  • The ratio capacity/numOjects should be slightly below the average segment size. A too high ratio makes cleaning less efficient and potentially fills up cache partition, while a too low one drops the cache hit ratio.

10.2.1.2 Content cache

The metadata, such as the codec and the bitrate, of media assets that are repackaged are cached in memory. This cache is cleared upon reload or restart service.

See Content Sources for details about the different content types.

For esf group:

  • movieObjects - The maximum number of movie objects that are cached for ESF content. The default value is 500. Set to 0 to disable caching.

  • trackObjects - The maximum number of track objects that are cached for ESF content. The default value is 2000. Set to 0 to disable caching.

For channel group:

  • numObjects - The maximum number of channel objects that are cached for live content. The default value is 500. Set to 0 to disable caching.

10.2.1.3 DRM cache

The cache size for DRM objects is set in services.repackaging.metadataCache.drm.

redisCache: when set to True (default) a shared cache in a Redis database is used which reduces the number of DRM requests towards DRM-GW. When set to False an internal per worker cache will be used.

numObjects: defines the maximum number of DRM objects to keep in the cache. Only effective when redisCache is False. The default value is 500. Set to 0 to disable per worker cache.

10.2.2 Repackaging log

Information about each repackaging request is logged to file. The repackaging log is controlled in services.repackaging.logging.repackaging in the confd configuration and has the following parameters:

enable - Turn repackaging log on or off. Valid values are True and False. The default value is True, meaning that repackaging log is on.

level - Sets the repackaging log level. Messages with a log level below the provided value will be suppressed. Valid values are trace, debug, info, warning, error, and fatal. The default value is info.

path - The path to the repackaging log in the file system. The default log location is /var/log/edgeware/ew-repackager/repackaging.log.

10.2.3 Performance log

The logging of information regarding the SW Repackager's performance can be configured in services.repackaging.logging.performance. The performance log has the following configuration parameters:

enable - Turn performance log on or off. Valid values are True and False. The default value is False, meaning that performance log is off.

level - Sets the performance log level. Messages with a log level below the provided value will be suppressed. Valid values are trace, debug, info, warning, error, and fatal. The default value is info.

path - The path to the performance log in the file system. The default log location is /var/log/edgeware/ew-repackager/repackaging-performance.log.

10.2.4 Request details log

This log is used to show detailed information for certain requests without having to use logging with high verbosity for all requests. The log is configured in services.repackaging.logging.requestDetails. The path parameter sets the location of the request details log in the file system, which defaults to /var/log/edgeware/ew-repackager/request-details.log.

10.2.4.1 Details for slow requests

To log information for requests that have a high internal processing time in the repackager, use the configuration in requestDetails.slow:

requestDetails.slow.enable - Turn the slow request details log on or off. Valid values are True and False. The default value is False, meaning that this log is turned off.

requestDetails.slow.processingThreshold - Requests having an internal processing time that exceeds this value will be logged in detail regardless of the repackaging log level. The unit of this parameter is milliseconds and the default value is 2000.

The processing time includes the time spent downloading the media data and the DRM information needed to complete the request. It also includes the repackaging of the content to the output format, including the encryption.

The processing time does not include the time spent sending the response to the client. Having slow responses, in e.g. the access log, without seeing any entries in the request details log means that the client, or the network to the client, might be the limiting factor.

10.2.5 Upstream TrackingID

When handling requests which trigger upstream live-ingest requests, a tracking ID can be included in the upstream requests in the form of a "trackingID" query parameter. The value of this parameter will be the same as the internal repackager request ID, as seen in e.g. repackaging.log. It's enabled via services.repackaging.logging.sendUpstreamTrackingIDs and defaults to False.

NOTE: It might break upstream caching.

10.2.6 Content Sources

The repackager can handle two kinds of content:

  • Managed - Content that has been converted to the intermediate ESF format by the Recorder.
  • Channel - Live channel content, including catch-up and start-over that still resides in the SW Live Ingest circular buffer. Channels are organized into channel groups.

In summary, the content section of the configuration is broken down into the above types of content. From there, references are made to the locations section which is found parallel to the content section in the configuration hierarchy. For an incoming request for a content a lookup will be performed to find the location or locations from which to fetch the content.

In a bit more detail, the locations section contains the subsections:

  • azureContainers - A list with the configuration fields necessary to reach an Azure Blob storage container with a name for each entry.
  • fileMounts - A list of paths along with a name for each path.
  • ingestServers - A list of HTTP URLs to SW Live Ingest servers along with a name for each entry.
  • s3Buckets - A list with the configuration fields necessary to reach an S3 object storage bucket together with a name for each location entry.
  • httpServers - A list of HTTP servers providing managed content.

The content section contains the subsections:

  • channelGroups - A list of named objects pointing to locations specified in the ingestServers subsection of locations.
  • managed - A list of named objects, each pointing to locations specified either in fileMounts, s3Buckets, azureContainers or httpServers.

Where multiple locations are allowed in a content object, the list of locations will represent a failover chain and each location will be tried in the listed order.

The name field in a content object corresponds to the __cl part in the CCMI URL format. When accessing managed content, the name is prefixed with s: (for storage) in the resource URL. Live channels, catch-up and start-over are prefixed with cg: which is short for channel group.

10.2.6.1 Azure blob storage container locations

Example: Adding one managed source with an azure blob storage container using confcli's wizard mode. Note that for Azure blob storage containers it is recommended that endpoint is left blank, unless you need to use a custom azure endpoint.

[root@esb3002 ~]$ confcli services.repackaging.locations.azureContainers -w
Running wizard for resource 'Azure Containers'
<List of Azure Containers used for managed content>

Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string

Azure Containers <List of Azure Containers used for managed content>: [
  azureContainer : {
    Name (default: ): vod-container
    Container (default: ): some-container
    Path (default: ):
    Azure endpoint (default: ):
    Azure account (default: ): azure-storage-account
    Authentication method (default: managedIdentity):
    Azure storage account configuration file (default: ):
    Connection Timeout (default: 300):
    Read Timeout (default: 2000):
    Send Timeout (default: 2000):
    Timeout read retries (default: 3):
  Add another 'azureContainer' element to array 'azureContainers'? [y/N]:
Generated config:
{
  "azureContainers": [
    {
      "name": "vod-container",
      "container": "some-container",
      "path": "",
      "endpoint": "",
      "account": "azure-storage-account",
      "authType": "managedIdentity",
      "authConfigLocation": "",
      "connectTimeoutMs": 300,
      "readTimeoutMs": 2000,
      "sendTimeoutMs": 2000,
      "timeoutRetries": 3
    }
  ]
}
Merge and apply the config? [y/n]: y

followed by:

[root@esb3002 ~]$ confcli services.repackaging.content.managed -w
Running wizard for resource 'Managed'
<Configuration of source locations for ingested VoD and recordings>

Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string

Managed <Configuration of source locations for ingested VoD and recordings>: [
  managed : {
    Name (default: ): azure-vod
    Locations <List of locations>: [
      location (default: ): vod-container
      Add another 'location' element to array 'locations'? [y/N]: n
    Output profiles <List of allowed output profiles>: [
      outputProfile (default: ):
      Add another 'outputProfile' element to array 'outputProfiles'? [y/N]: n
  Add another 'managed' element to array 'managed'? [y/N]: n
Generated config:
{
  "managed": [
    {
      "name": "azure-vod",
      "locations": [
        "vod-container"
      ],
      "outputProfiles": [
        "default"
      ]
    }
  ]
}
Merge and apply the config? [y/n]: y

The delivery URL for a content with the above defined source would look something like:

    /__cl/s:azure-vod/__c/casablanca/__op/default/__f/index.m3u8

Please see Content source format for how to limit or expand the list of allowed output profiles per content.

10.2.6.1.1 Authentication

The repackager supports authentication to Azure blob storage containers by

  • managedIdentity - This is the default method for authentication and requires no further configuration. However, this method works only for repackager running on an Azure VM. The repackager will fetch authorization tokens from Azure Instance Metadata Service. See Azure documentation for further information regarding Instance Metadata Service.
  • sharedKey - The storage account key is read from a file. The authentication config file and its directory needs to be fully readable by the edgeware user; both read and execute permissions are needed for the directory and read permission is needed for the file. Example:
[root@esb3002 ~]$ confcli services.repackaging.locations.azureContainers.vod-container.authType sharedKey
[root@esb3002 ~]$ confcli services.repackaging.locations.azureContainers.vod-container.authConfigLocation /etc/ew-repackager/vod-container.conf

The azure account key must be specified in the authentication config file.

accountKey <storage account key>

Note that if the authentication config file is modified while the repackager is running, the repackager needs to be reloaded for the changes to be active. Example:

[root@esb3002 ~]$ systemctl reload ew-repackager.service
10.2.6.1.2 Latency considerations

In order to achieve low latency for Azure storage requests, you may need to tweak the connections parameters. This can be done using the connectionTimeoutMs, readTimeoutMs and timeoutRetries parameters. Example:

[root@esb3002 ~]$ confcli services.repackaging.locations.azureContainers.vod-container.connectTimeoutMs 300
[root@esb3002 ~]$ confcli services.repackaging.locations.azureContainers.vod-container.readTimeoutMs 1000
[root@esb3002 ~]$ confcli services.repackaging.locations.azureContainers.vod-container.timeoutRetries 3

If different timeout settings per retry attempt is desired, multiple content locations for the same azure storage container can be specified with a timeoutRetries count of 0. The locations will be tried in sequential order, where the timeout settings could be individually configured. Example:

"managed": [
  {
    "name": "vod",
    "locations": [
      "vod-container",
      "vod-container-retry1",
      "vod-container-retry2",
    ]
  }
]

10.2.6.2 File mount content locations

File mounts used for managed content, such as ingested VODs or recordings, are specified in services.repackaging.locations.fileMounts.

name - Each file mount has a name by which it can be referred to from the content section of the configuration.

path - The path of the file mount is a directory that is available in the file system on the repackager node, for instance an NFS mount point.

useAIO - For each file mount it can be specified whether or not asynchronous I/O (AIO) should be used. The default is to use AIO.

Note: The Repackager's nginx configuration in /etc/ew-repackager/nginx.conf specifies aio on. This is needed for asynchronous handling of HTTP upstreams such as live channels and DRM servers. useAIO overrides the aio setting specifically for file mounts, so aio in nginx.conf should not be turned off on order to use synchronous file mounts.

Example: Adding one managed source with a locally mounted file system using confcli's wizard mode.

[root@esb3002 ~]# confcli services.repackaging.locations.fileMounts -w
Running wizard for resource 'File Mounts'
<File mount points in the local file system that can be used to fetch managed content>

Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string

File Mounts <File mount points in the local file system that can be used to fetch managed content>: [
  fileMount : {
    Name (default: ): vod-nas
    Path (default: ): /mnt/media/vod
    Asynchronous (default: True): true
  Add another 'fileMount' element to array 'fileMounts'? [y/N]: n
Generated config:
{
  "fileMounts": [
    {
      "name": "vod-nas",
      "path": "/mnt/media/vod",
      "useAIO": true
    }
  ]
}
Merge and apply the config? [y/n]: y

followed by:

[root@esb3002 ~]# confcli services.repackaging.content.managed -w
Running wizard for resource 'Managed'
<Configuration of source locations for ingested VoD and recordings>

Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string

Managed <Configuration of source locations for ingested VoD and recordings>: [
  managed : {
    Name (default: ): vod
    Locations <List of locations>: [
      location (default: ): vod-nas
      Add another 'location' element to array 'locations'? [y/N]: n
    Output profiles <List of allowed output profiles>: [
      outputProfile (default: ): hls-drm
      Add another 'outputProfile' element to array 'outputProfiles'? [y/N]: n
  Add another 'managed' element to array 'managed'? [y/N]: n
Generated config:
{
  "managed": [
    {
      "name": "vod",
      "locations": [
        "vod-nas"
      ],
      "outputProfiles": [
        "hls-drm"
      ]
    }
  ]
}
Merge and apply the config? [y/n]: y

The delivery URL for a content with the above defined source would look something like:

    /__cl/s:vod/__c/casablanca/__op/hls-drm/__f/index.m3u8

Please see Content source format for how to limit or expand the list of allowed output profiles per content.

10.2.6.3 Ingest server content locations

Example: Adding one channel source for live content with a primary and secondary location using confcli's wizard mode.

[root@esb3002 ~]# confcli services.repackaging.locations.ingestServers -w
Running wizard for resource 'Ingest Servers'
<Live Ingest servers from which to serve live, catchup and start-over content>

Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string

Ingest Servers <Live Ingest servers from which to serve live, catchup and start-over content>: [
  ingestServer : {
    Name (default: ): live-primary
    URL (default: ): http://sw-liveingest-1:8090
    Connection Timeout (default: 500): 400
    Read Timeout (default: 1000): 800
    Send Timeout (default: 2000): 1000
  Add another 'ingestServer' element to array 'ingestServers'? [y/N]: y
  ingestServer : {
    Name (default: ): live-secondary
    URL (default: ): http://sw-liveingest-2:8090
    Connection Timeout (default: 500): 400
    Read Timeout (default: 1000): 800
    Send Timeout (default: 2000): 1000
  Add another 'ingestServer' element to array 'ingestServers'? [y/N]: n
Generated config:
{
  "ingestServers": [
    {
      "name": "live-primary",
      "url": "http://sw-liveingest-1:8090",
      "connectTimeoutMs": 400,
      "readTimeoutMs": 800,
      "sendTimeoutMs": 1000
    },
    {
      "name": "live-secondary",
      "url": "http://sw-liveingest-2:8090",
      "connectTimeoutMs": 400,
      "readTimeoutMs": 800,
      "sendTimeoutMs": 1000
    }
  ]
}
Merge and apply the config? [y/n]: y

followed by:

[root@esb3002 ~]$ confcli services.repackaging.content.channelGroups -w
Running wizard for resource 'Channel Groups'
<Configuration of source locations for live, catchup and start-over served by circular buffer>

Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string

Channel Groups <Configuration of source locations for live, catchup and start-over served by circular buffer>: [
  channelGroup : {
    Name (default: ): live
    Locations <List of Ingest servers>: [
      location (default: ): live-primary
      Add another 'location' element to array 'locations'? [y/N]: y
      location (default: ): live-secondary
      Add another 'location' element to array 'locations'? [y/N]: n
    Output profiles <List of allowed output profiles>: [
      outputProfile (default: ):
      Add another 'outputProfile' element to array 'outputProfiles'? [y/N]: n
  Add another 'channelGroup' element to array 'channelGroups'? [y/N]: n
Generated config:
{
  "channelGroups": [
    {
      "name": "live",
      "locations": [
        "live-primary",
        "live-secondary"
      ],
      "outputProfiles": [
        "default"
      ]
    }
  ]
}
Merge and apply the config? [y/n]: y

The delivery URI for the example above would look something like this:

    /__cl/cg:live/__c/channel1/__op/default/__f/index.m3u8
10.2.6.3.1 Ingest server timeout configuration

As seen in the example above, timeout values can be specified for Live Ingest locations when they are created. When communicating with the server, connectTimeoutMs, readTimeoutMs, and sendTimeoutMs determine the maximum time for establishing the connection, and the maximum time for each read and write operation towards the server. The unit for these parameters is milliseconds. If a timeout value is exceeded, the upstream request to the current ingest server is abandoned and the request fails over to any remaining ingest server in the channel group.

The timeout values for an ingest server named ingest01 can be set in the following way using confcli:

[root@esb3002 ~]$ confcli services.repackaging.locations.ingestServers.ingest01.connectTimeoutMs 300
[root@esb3002 ~]$ confcli services.repackaging.locations.ingestServers.ingest01.readTimeoutMs 1000
[root@esb3002 ~]$ confcli services.repackaging.locations.ingestServers.ingest01.sendTimeoutMs 1000

10.2.6.4 S3 bucket content locations

Example: Adding one managed source with an S3 bucket using confcli's wizard mode. Note that for AWS S3 buckets it is recommended that endpoint is left blank, unless you need to use a custom AWS endpoint.

[root@esb3002 ~]$ confcli services.repackaging.locations.s3Buckets -w
Running wizard for resource 'S3 Buckets'
<Definition of S3 Buckets that can be used for managed content>

Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string

S3 Buckets <Definition of S3 Buckets that can be used for managed content>: [
  s3Bucket : {
    Name (default: ): vod-bucket
    Bucket (default: ): some-bucket
    Path (default: ):
    Region (default: ): eu-central-1
    S3 Endpoint (default: ):
    AWS credentials profile (default: ):
    AWS credentials location (default: http://169.254.169.254/latest/meta-data/iam/security-credentials/ew-repackager):
    Connection Timeout (default: 100):
    Read Timeout (default: 2000):
    Send Timeout (default: 2000):
    Timeout read retries (default: 3):
  Add another 's3Bucket' element to array 's3Buckets'? [y/N]: n
Generated config:
{
  "s3Buckets": [
    {
      "name": "vod-bucket",
      "bucket": "some-bucket",
      "path": "",
      "region": "eu-central-1",
      "endpoint": "",
      "credentialsProfile": "",
      "credentialsLocation": "http://169.254.169.254/latest/meta-data/iam/security-credentials/ew-repackager",
      "connectTimeoutMs": 100,
      "readTimeoutMs": 2000,
      "sendTimeoutMs": 2000,
      "timeoutRetries": 3
    }
  ]
}
Merge and apply the config? [y/n]: y

followed by:

[root@esb3002 ~]$ confcli services.repackaging.content.managed -w
Running wizard for resource 'Managed'
<Configuration of source locations for ingested VoD and recordings>

Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string

Managed <Configuration of source locations for ingested VoD and recordings>: [
  managed : {
    Name (default: ): s3-vod
    Locations <List of locations>: [
      location (default: ): vod-bucket
      Add another 'location' element to array 'locations'? [y/N]: n
    Output profiles <List of allowed output profiles>: [
      outputProfile (default: ):
      Add another 'outputProfile' element to array 'outputProfiles'? [y/N]: n
  Add another 'managed' element to array 'managed'? [y/N]: n
Generated config:
{
  "managed": [
    {
      "name": "s3-vod",
      "locations": [
        "vod-bucket"
      ],
      "outputProfiles": [
        "default"
      ]
    }
  ]
}
Merge and apply the config? [y/n]: y

The delivery URL for a content with the above defined source would look something like:

    /__cl/s:s3-vod/__c/casablanca/__op/default/__f/index.m3u8

Please see Content source format for how to limit or expand the list of allowed output profiles per content.

10.2.6.4.1 Authentication

By default S3 bucket content sources are setup using an AWS IAM role ew-repackager for AWS authentication credentials. Retrieved from the instance IAM metadata, using the AWS URL: http://169.254.169.254/latest/meta-data/iam/security-credentials/<role>. See AWS documentation for further information regarding IAM roles.

Authentication credentials could also be specified in a file. The credentials file and its directory needs to be fully readable by the edgeware user; both read and execute permissions are needed for the directory and read permission is needed for the file. Example:

[root@esb3002 ~]# confcli services.repackaging.locations.s3Buckets.vod-bucket.credentialsLocation /etc/ew-repackager/aws-credentials

The file should contain the credentials for one or more profiles, where default will be used unless a specific credentialProfile is configured.

[<profile name>]
aws_access_key_id=<access key id>
aws_secret_access_key=<secret access key>

Note that if the credential file is modified while the repackager is running, the repackager needs to be reloaded for the changes to be active. Example:

[root@esb3002 ~]$ systemctl reload ew-repackager.service
10.2.6.4.2 Latency considerations

In order to achieve low latency for S3 requests, AWS recommends performing requests with short timeouts and several retries. That is, if a single S3 request is slow, it should be aborted quickly and retried. The successive retry for the same end point is likely to be served from a different location and provide a faster response. To achieve this in the SW repackager, set the timeoutRetries and timeout parameters for the bucket. Example:

[root@esb3002 ~]# confcli services.repackaging.locations.s3Buckets.vod-bucket.connectTimeoutMs 20
[root@esb3002 ~]# confcli services.repackaging.locations.s3Buckets.vod-bucket.readTimeoutMs 100
[root@esb3002 ~]# confcli services.repackaging.locations.s3Buckets.vod-bucket.timeoutRetries 3

If different timeout settings per retry attempt is desired, multiple content locations for the same S3 bucket can be specified with a timeoutRetries count of 0. The locations will be tried in sequential order, where the timeout settings could be individually configured. Example:

"managed": [
  {
    "name": "s3-vod",
    "locations": [
      "vod-bucket",
      "vod-bucket-retry1",
      "vod-bucket-retry2",
    ]
  }
]

10.2.6.5 HTTP server content locations

Managed VOD assets that are located on another HTTP server can be accessed through the repackager by specifying an HTTP server location in httpServers. In essence an HTTP location works like an S3 or Azure Blob storage container without any authorization.

Example: Adding an HTTP server upstream for managed content using confcli's wizard mode.

[root@esb3002 ~]$ confcli services.repackaging.locations.httpServers -w
Running wizard for resource 'HTTP servers'
<HTTP servers that can be used for managed content>

Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string

HTTP servers <HTTP servers that can be used for managed content>: [
  httpServer : {
    Name (default: ): HttpVodServer
    URL (default: ): http://myserver/vods/
    Connection Timeout (default: 100):
    Read Timeout (default: 2000):
    Send Timeout (default: 2000):
    Timeout read retries (default: 3):
  Add another 'httpServer' element to array 'httpServers'? [y/N]: n
Generated config:
{
  "httpServers": [
    {
      "name": "HttpVodServer",
      "url": "http://myserver/vods/",
      "connectTimeoutMs": 100,
      "readTimeoutMs": 2000,
      "sendTimeoutMs": 2000,
      "timeoutRetries": 3
    }
  ]
}
Merge and apply the config? [y/n]: y

followed by:

[root@esb3002 ~]$ confcli services.repackaging.content.managed -w
Running wizard for resource 'Managed'
<Configuration of source locations for ingested VoD and recordings>

Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string

Managed <Configuration of source locations for ingested VoD and recordings>: [
  managed : {
    Name (default: ): vods
    Locations <List of locations>: [
      location (default: ): HttpVodServer
      Add another 'location' element to array 'locations'? [y/N]: n
    Output profiles <List of allowed output profiles>: [
      outputProfile (default: default):
      Add another 'outputProfile' element to array 'outputProfiles'? [y/N]: n
  Add another 'managed' element to array 'managed'? [y/N]: n
Generated config:
{
  "managed": [
    {
      "name": "vods",
      "locations": [
        "HttpVodServer"
      ],
      "outputProfiles": [
        "default"
      ]
    }
  ]
}
Merge and apply the config? [y/n]: y

The delivery URL for a content with the above defined source would look something like:

    /__cl/s:vods/__c/casablanca/__op/default/__f/index.m3u8

Please see Content source format for how to limit or expand the list of allowed output profiles per content.

10.2.7 Streaming accounts

To facilitate creation of multi-tenant video networks, where parts of the configuration can be customized for each customer, the following properties are defined per account:

Each of these configuration elements are described in detail in later sections of this document.

The accounts are available in a list, located at services.repackaging.streaming.accounts in the configuration structure. For example, to see the custom response headers that are configured in the account named CustomerX, enter the following on the command line:

[root@esb3002 ~]# confcli services.repackaging.streaming.accounts.CustomerX.customHeaders

The Software Repackager is shipped with an account named default. This account contains the output profiles and presentations needed to start working with the product.

To stream content from the Software Repackager using a specific account, the name of the account is included in the CCMI URI using the token __a followed by the account name. The account token should be located after the content location, __cl, in the URI. For example:

http://host:port/__cl/cg:live/__a/CustomerX/__c/channel2/__op/...

If no account token is present in the content URI, the default account will be used when serving the request.

10.2.8 Custom headers

A list of custom HTTP headers, that will be included in all responses, can be defined in services.repackaging.streaming.accounts..customHeaders. Each object in the list has a name and a value that together will constitute one header field in the HTTP response.

Example: Configure a custom header field with the name Access-Control-Allow-Origin and the value * in the default account using confcli's wizard mode:

[root@esb3002 ~]# confcli services.repackaging.streaming.accounts.default.customHeaders. -w
Running wizard for resource 'customHeaders'

Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string

customHeaders : [
  customHeader <Adds a custom HTTP header in the HTTP response.>: {
    Field name (default: ): Access-Control-Allow-Origin
    Field value (default: ): *
  Add another 'customHeader' element to array 'customHeaders'? [y/N]: N
Generated config:
{
  "customHeaders": [
    {
      "name": "Access-Control-Allow-Origin",
      "value": "*"
    }
  ]
}
Merge and apply the config? [y/n]: n
Exiting...

10.2.9 Expire time

10.2.9.1 Vod

The expiration time to include in VOD asset responses, i.e. not a channel source, is specified in expireTime.defaultMaxAgeVod located in services.repackaging.streaming.accounts.<account>.defaultMaxAgeVod is defined relative to the point in time when the client fetches the media asset.

The table below shows the suffixes that can be used when specifying the defaultMaxAge, the default value is 12h, meaning twelve hours.

UnitSuffixExample
Millisecondms1ms
Seconds1s
Minutem1m
Hourh1h
Dayd1d
Weekw1w
MonthM1M
YearY1Y

Example: Set max-age in Cache-Control HTTP header to 10 days in the default account:

[root@esb3002 ~]# confcli services.repackaging.streaming.accounts.default.expireTime.defaultMaxAgeVod 10d
services.repackaging.streaming.accounts.default.expireTime.defaultMaxAgeVod = '10d'

10.2.9.2 Live channels

For live channel content the expiration time is dependent on the content type. Manifests have an expire time of half a segment duration. The expire time for a media segment is by default based on the time it falls outside the catchup buffer. In other words, the CDN will be told to cache the segment as long it exists inside the catchup buffer. If a media segment is requested using an output profile with a catchup limitation (set with maxAllowedCatchupDuration) the expire time will be based on that limit instead.

As a final step, it is also possible to further limit the expire time using the expireTime.defaultMaxAgeLive configuration parameter.

Example: A configuration with one output profile with a limited catchup duration of 1 hour and one output profile with a catchup duration of 7 days, also a maximum expiretime of 24 hours for any segment from a channel source.

[root@esb3002 ~]# confcli services.repackaging.streaming.accounts.default.outputProfile.short.maxAllowedCatchupDuration. 3600
services.repackaging.streaming.accounts.default.outputProfiles.short.maxAllowedCatchupDuration = 3600

[root@esb3002 ~]# confcli services.repackaging.streaming.accounts.default.outputProfile.long.maxAllowedCatchupDuration. 604800
services.repackaging.streaming.accounts.default.outputProfiles.long.maxAllowedCatchupDuration = 604800

[root@esb3002 ~]# confcli services.repackaging.streaming.accounts.default.expireTime.defaultMaxAgeLive. 24h
services.repackaging.streaming.accounts.default.expireTime.defaultMaxAgeLive = '24h'

Manifests on any of these profiles will have an expire time of half a segment.

Requesting the latest created live segment from the short profile will have an expiration time of around 3600 seconds. Note that requesting a segment that is 3500 seconds old will expire 100 seconds later.

Segments requested from the long profile will have an expire time of 24 hours. However, if the segment is older than 6 days, the expire time will be set to the time when the segment will be unavailable (shifted out of the catchup buffer).

10.2.10 Output profiles

Egress encryption is controlled by adding DRM-enabled output profiles. The SW Repackager communicates with the DRM Gateway to get access to the DRM information that is needed for the encryption. A secondary DRM Gateway can be configured for redundancy. Output profiles that have enabled encryption in SW repackager needs to be configured in DRM Gateway also. Please see [11] for instructions on how to set up the DRM Gateway.

Output profiles are set in services.repackaging.streaming.accounts..outputProfiles. Each outputProfile has the following parameters:

  • name - The name of this output profile. The value corresponds to the __op (output profile) part of the CCMI URL format.

  • drm.enable - Enable encryption. The default value is false.

  • drm.certPath - Path to a trusted certificate file for communication with the DRM Gateway. The default value is /etc/edgeware/drm-gw/server.crt.

  • drm.encryptAudio - Turn audio encryption on or off. The default value is true. N.B. if the DRM Gateway returns a "per variant" DRM configuration or in HLS presentation the muxedTS segment format is used, this parameter has no effect.

  • drm.disableIFrameTrackEncryption - If true, disables encryption of the I-frame track (I-frame playlist for HLS, TrickMode AdaptationSet for DASH). Default false.

  • drm.keyServer - The address to the DRM Gateway. See [11] for details.

  • drm.keyServerBackup - The address to the secondary DRM Gateway.

  • drm.sharedSecret - Shared secret used to authenticate messages toward DRM Gateway,

  • drm.validateCert - Whether or not to validate the certificate in case of HTTPS. The default value is true.

  • drm.connectTimeoutMs - Timeout in milliseconds for establishing connections to the DRM server.

  • drm.readTimeoutMs - Timeout in milliseconds between successive read operations towards the DRM server.

  • drm.sendTimeoutMs - Timeout in milliseconds between successive write operations towards the DRM server.

  • liveChannelDelay - Delay in seconds for a live channel. Also called channel time-shift. Note: Should be an integer multiple of the segment length. A typical use case for delaying a channel is to create regional channel versions, in different time-zones.

  • expectedSegmentDurationMs - The expected duration of a segment in milliseconds. It is recommended to be at least double the average segment length of ESF, else it has no effect. Note: Only applies to HLS and DASH output of VOD and recordings.

  • maxAllowedCatchupDuration - Limit the available catchup duration to this value expressed in seconds.

  • dashContent - Type of DASH repackaging. The available types are: SegmentTimeline, SegmentNumber, SegmentTimelineNumber, OnDemand and None. SegmentTimeline uses $Time$ addressing while SegmentTimelineNumber uses $Number$ addressing. The default value is SegmentTimeline. A number-based addressing is required in order to be compatible with both DASH and HLS at the same time. SegmentTimeline and SegmentTimelineNumber can be used for both Live and VOD. OnDemand is VOD exclusively while SegmentNumber is for Live only. None is used for HLS/MSS profiles. To have identical segments for both DASH and HLS format, in same output profile, the DASH packaging formats using $Number$ addressing (SegmentNumber and SegmentTimelineNumber) and the hls.segmentFormat set to fMP4 are required.

  • avcSampleDescriptionFormat - Change the AVC version announced for H264 content in DASH manifests and CMAF/fMP4 init segments. The default is keepInput and this will leave the content untouched. Other options are avc1 and avc3. These will overwrite the codec version in an H264 video adaptation set in the manifest, as well as in the STSD box in the video init segment.

  • hevcSampleDescriptionFormat - Change the HEVC version announced for HEVC content in DASH manifests and CMAF/fMP4 init segments. The default is keepInput and this will leave the content untouched. Other options are hev1 and hvc1. These will overwrite the codec version in an HEVC video adaptation set in the manifest, as well as in the STSD box in the video init segment.

  • avoidIdenticalWebvttCues - Some HLS players have problems with cues spanning multiple segments since this leads to identical adjacent subtitle cues in the output. This setting breaks the sequence of identical cues by adding an invisible unicode space in every other WebVTT segment. Not all clients have full unicode support, so use this setting with care.

NOTE: Unencrypted output profile (including the default) can be used to steal content if their names and urls to encrypted content are both known. It is recommended to remove or regularly rename those profiles.

Example: Setup a Sample AES encryption output profile with a 24 hour catchup limitation in the default account using confcli's wizard mode:

    [root@esb3002 ~]$ confcli -w services.repackaging.streaming.accounts.default.outputProfiles
    Running wizard for resource 'Output profiles'
    <List of output profiles>

    Hint: Hitting return will set a value to its default.
    Enter '?' to receive the help string

    Output profiles <List of output profiles>: [
      Output profile <Configuration for an output profile>: {
        Name (default: ): hls-sample-aes
        DASH content type (default: SegmentTimeline): None
        DASH output AVC version (default: keepInput):
        Maximal allowed catchup duration (default: 8640000): 86400
        Delay for live channel (default: 0): 0
        Avoid identical adjacent WebVTT cues (default: False):
        DRM <Configuration for DRM>: {
          Enable audio encryption (default: True): True
          Enable (default: False): True
          Disable i-frame-track encryption (default: False): False
          Key Server host:port (default: ): edgeware-drm-gw:4443
          Secondary Key Server host:port (default: ): ew-drm-gw-2:4443
          Key Server shared secret (default: ): shared-secret
          Validate Certificate (default: True): True
          Certificate path (default: /etc/edgeware/drm-gw/server.crt):
          Connection Timeout (default: 2000): 1000
          Read Timeout (default: 4000): 2000
          Send Timeout (default: 4000): 2000
      Add another 'outputProfile' element to array 'outputProfiles'? [y/N]: n
    Generated config:
    {
      "outputProfiles": [
        {
          "name": "hls-sample-aes",
          "dashContent": "None",
          "avcSampleDescriptionFormat": "keepInput",
          "hevcSampleDescriptionFormat": "keepInput",
          "maxAllowedCatchupDuration": 86400,
          "avoidIdenticalWebvttCues": false,
          "drm": {
            "encryptAudio": true,
            "enable": true,
            "disableIFrameTrackEncryption": false,
            "keyServer": "edgeware-drm-gw:4443",
            "keyServerBackup": "ew-drm-gw-2:4443",
            "sharedSecret": "shared-secret",
            "validateCert": true,
            "certPath": "/etc/edgeware/drm-gw/server.crt",
            "connectTimeoutMs": 1000,
            "readTimeoutMs": 2000,
            "sendTimeoutMs": 2000
          }
        }
      ]
    }
    Merge and apply the config? [y/n]: y

A delivery URI for the example above would look something like this:

    /__cl/s:vod/__c/drama/__op/hls-sample-aes/__f/index.m3u8

Please see Content source format for how to limit or expand the list of allowed output profiles per content.

10.2.10.1 Single node DRM Gateway configuration

When The DRM Gateway is configured with the default configuration on the same node as the SW Repackager, edrm-server hostname should be resolved as the loopback ip address. To achieve that, append the following line to /etc/hosts on the SW Repackager node:

    127.0.0.1   edrm-server

10.2.11 Presentations

10.2.11.1 Filter parameters overview

Below follows a summary of the configuration parameters that are available for presentation filters. If a parameter is omitted in the definition of a filter, the default value for that parameter will be used.

Video filter parameterDescription
codecThe accepted codec pattern for this filter
maxBitrateThe maximum bitrate to pass through the filter
minBitrateThe minimum bitrate to pass through the filter
nameThe name of this filter
orderSort order based on variant bitrate
Audio filter parameterDescription
codecThe accepted codec pattern for this filter
maxBitrateThe maximum bitrate to pass through the filter
minBitrateThe minimum bitrate to pass through the filter
nameThe name of this filter
orderSort order based on variant bitrate
numChannelsThe number of channels to accept in the filter
languagesA list of languages to accept in the filter
Subtitle filter parameterDescription
nameThe name of this filter
languagesA list of languages to accept in the filter

10.2.11.2 Filter parameters detailed description

codec - The codec parameter controls what media formats a filter lets through. The format identifier is defined in [8] and looks something like avc1.4d401e or mp4a.40.2. The codec pattern can either be a fixed string containing the exact format identifier, or end with * to match multiple codecs. For instance, specifying avc1* as codec in a video filter will let all H264 video variants pass through the filter regardless of their profile.

languages - The languages parameter specifies the languages that a filter will pass through in the form of a list of ISO 639 codes. The order of the languages in the list will be used when generating the manifest. A final wildcard element * can be added to the list to allow all languages while keeping the desired language order. For instance, specifying "languages": ["eng", "*"] will pass through all languages while making sure English ends up first, whereas "languages": ["eng"] will pass through English as the only language.

When not explicitly sorted, the order of the languages in the input will be maintained in the output.

maxBitrate and minBitrate - The bitrate filter parameters accepts or rejects variants based on their bitrate. The bitrate is specified in bits per second. The value of maxBitrate should be greater than or equal to the value of minBitrate.

10.2.11.3 Manifest parameters

Manifest parameters applicable for all output formats are grouped under parameters.general. Parameters specific to just one output format are grouped under the appropriate group in parameters, e.g. parameters.dash.

parameters.general.liveWindow - The duration of the manifest's live window in seconds.

parameters.general.maximumManifestDuration - The maximum duration of the manifest in seconds.

parameters.dash.minimumUpdatePeriod - The description to the client on a minimum validity duration of a live DASH manifest. It is automatically calculate to be segmentation duration, but can be overriden by setting another value that greater than default -1. See DASH manifest details for how this parameter is used.

It is highly recommended that a non-default value is only used for tuning the behavior of streaming clients when playback issues have been discovered.

parameters.dash.suggestedPresentationDelay - The fixed delay offset from the presentation time in seconds. Sets the value for the suggestedPresentationDelay attribute in the DASH manifest. When the value is 0, the attribute is not written to the manifest.

parameters.dash.trickMode - The trickMode configuration parameter determines whether or not to include DASH trick mode AdaptationSets in the manifest. The default value is true.

parameters.dash.thumbnail - Toggle on/off whether or not to include DASH thumbnail AdaptationSet to the MPD. The default value is false. Only effective if upstream supports thumbnail generation.

parameters.dash.UTCTiming - List of schemeIdUri and value pairs that are set in a <UTCTiming/> element in the DASH manifest. These values are used to signal to clients how to synchronize time.

parameters.dash.separateRepresentation - Toggle on/off to whether or not to allow each Representation in a separated AdaptationSet. The default value is false.

parameters.dash.subtitleFormat - Dash subtitle format, either wvtt or stpp. The default value is stpp.

parameters.dash.singleSubtitleSegmentVod - Applies only to VOD assets. Serve the complete subtitle track as a single segment, like what always happens on DASH OnDemand. The default value is false.

parameters.dash.compact - Toggle on/off inserting indentation to output MPD. The indentation makes output MPD more human-friendly while, without it, MPD has significantly smaller payload. The default value is false.

parameters.dash.targetLatency - involved in specifying Latency in MPD (see DASH manifest details and [15]). Only effective if low latency is enabled in upstream. The default value is 3.5 seconds. It is also recommended to set UTCTiming, according to section 9.X.4.2, Part 4 of DASH IOP v5.

10.2.11.3.1 Ad marker parameters

Ad markers, carried as SCTE-35 messages in the input signal of the channel source, can be propagated to the manifests produced by the SW Repackager by configuring the following presentation parameters.

parameters.dash.adMarkers - In a DASH media presentation, ad markers are inserted either as multiple events in one single period or as separate periods for each event.

Set adMarkers to SinglePeriod to get one period with multiple events, or to MultiPeriod to get a separate period for each event.

If set to Disabled, no ad markers will be added to the DASH media presentation. This is the default behavior.

The value of dash.adMarkers in combination with the output profile's dashContent setting determines when a new Period will be created in a DASH manifest. New Periods can be created either at ad period boundaries or when there are gaps in the segment sequence. Gaps may be caused by interrupted network traffic, or by configuration changes, on the ingest side. The table below illustrates when new periods are created based on the configured DASH manifest type and ad marker setting:

In addition to this, new periods will also be created at DRM key boundaries if a key rotation enabled output profile is used. See Encryption and Digital Rights Management (DRM) for details.

parameters.hls.adMarkers - In HLS media playlists ad markers can be inserted as EXT-X-SCTE35 tags, as specified in SCTE-35, as EXT-OATCLS-SCTE35 tags, as specified in SCTE-35 Enhanced, or be embedded in EXT-X-DATERANGE tags, as suggested in Apple's HTTP Live Streaming specification. Note that EXT-X-SCTE35 and EXT-OATCLS-SCTE35 are not recognized by Apple parsers.

Set adMarkers to SCTE35 to use EXT-X-SCTE35 tags, to OATCLS to use EXT-OATCLS-SCTE35, or to HLS to use the EXT-X-DATERANGE format.

If set to Disabled, no ad markers will be added to the HLS playlists. This is the default behavior. It is also the only mode works with muxedTS segment format due to incompatiblity.

parameters.hls.adMarkerDaterangeID - Format of ID attribute in DATERANGE tag. This configuration is applied when parameters.hls.adMarkers = HLS. The options are extended, short and work as follows:

  • extended - The ID attribute includes the event id and the timestamp (default option).
  • short - The ID attribute does only include the event id.

In some cases, a recording contains a partial ad event, the ad marker timestamp is updated to fit inside the recording. Ad event's ID should not include timestamp. This configuration should set to short.

10.2.11.3.2 Additional HLS playlist parameters

parameters.hls.audioGroupingRelativeBandwidth - Audio variants are grouped by codec and bitrate. The audioGroupingRelativeBandwidth specifies how different bitrates are grouped together. The value 0 means that all audio variants in a group will have exactly the same bitrate, the value 10 means that the lowest bitrate will not differ by more than 10% from the highest bitrate in a group. The value 100 means that all bitrates are grouped together.

parameters.hls.singleWebVTTSegmentVod - Applies only to VOD assets. Serve the complete subtitle track as a single WebVTT segment, for each variant respectively, of all segmentFormat, except the muxedTS does not support subtitles. The default behaviour is to use subtitle segments with identical intervals as the video segments, and to split subtitles that cross segment boundaries. Some HLS clients, notably from Apple, have issues with such split cues. This option merges the cues, but also has the benefit of a single segment download instead of many. The default value is false.

parameters.hls.iframePlaylist - The iframePlaylist configuration parameter determines whether or not to include links to I-frame playlists in HLS master playlists. The default value is true, but it must be set to false when segmentFormat is muxedTS due to incompatibility.

parameters.hls.iframeTsMapTag - The iframeTsMapTag parameter decides if and how EXT-X-MAP tags are inserted in I-frame playlists when TS segments are used. The options are Disabled, ByteRange and FullIFrame and work as follows:

  • Disabled - No map tags are added to the playlist
  • ByteRange - Map tags with byte ranges inside full I-frame segments
  • FullIFrame - Map tags point to full I-frame segments

The default value is Disabled.

parameters.hls.denserIframes - The denserIframes configuration parameter controls whether or not the generated I-frame playlists can contain more than 1 I-frame per "normal" video segment. If set to true, the I-frame playlists will contain 1 I-frame per GOP (instead of 1 I-frame per segment). The default value is false.

parameters.hls.thumbnail - Whether or not to include link to image media playlist in HLS master playlist. The default value is false. Only effective if upstream supports thumbnail generation. Must be set to false when segmentFormat is muxedTS due to software limitation.

parameters.hls.segmentFormat - The segmentFormat configuration parameter determines the file format used for producing HLS segments in this presentation. The parameter can be set to either TS, fMP4, fMP4WebVTT or muxedTS with TS being the default value.

In general the TS and muxedTS setting produces MPEG-2 Transport Stream segments, whereas the fMP4 and fMP4WebVTT setting produces CMAF fMP4 segments, but there are some exceptions. Based on the value of segmentFormat, the output file format for each codec and media type is listed in the table below.

The muxedTS setting will produce a single stream of both audio and video segments.

Segment typeTSfMP4fMP4WebVTTmuxedTS
AAC / HE-AACMPEG-2 TSCMAF fMP4CMAF fMP4MPEG-2 TS
AC-3 / EC-3Packed Audio formatCMAF fMP4CMAF fMP4N/A
h.264 segmentMPEG-2 TSCMAF fMP4CMAF fMP4MPEG-2 TS
HEVC segmentMPEG-2 TS (*)CMAF fMP4CMAF fMP4N/A
h.264 I-frameMPEG-2 TSCMAF fMP4CMAF fMP4N/A
HEVC I-frameMPEG-2 TS (*)CMAF fMP4CMAF fMP4N/A
SubtitlesWebVTTCMAF fMP4WebVTTN/A

(*) Not supported by HLS authoring specification for Apple devices.

parameters.hls.sessionKey - The sessionKey configuration parameter determines whether or not to include an EXT-X-SESSION-KEY tag with DRM information in HLS master playlists. The default value is false.

parameters.hls.keyPerChunk - The keyPerChunk determines whether to include EXT-X-KEY with DRM information to each chunk in HLS media playlist, or only include after previous key expired.

parameters.hls.maxInitialGAPLength - The maxInitialGAPLength configuration parameter determines the maximum total duration of EXT-X-GAP segments to include at the beginning of the media playlist. A playlist may start with very many EXT-X-GAP segments if e.g. the live channel has recently started and does not have segments to fill the liveWindow. The default value is 0.

parameters.hls.liveTargetDuration - A positive liveTargetDuration value overrides the HLS EXT-X-TARGETDURATION value for live and catchup HLS playlist. This can be used to trigger more frequent playlist requests in HLS players. If the default value 0 is used, no modification is done and the value is derived from the maximum segment duration reported upstream.

10.2.12 Integration

In addition, the integration.convoy.events node is also honored by the SW Repackager. This node denotes the Convoy instance to send statistics and alarms to. Note that only the first entry in integration.convoy.events.servers is used.

[root@esb3002 ~]# confcli integration.convoy.events.enable true
[root@esb3002 ~]# confcli integration.convoy.events.servers.
[root@esb3002 ~]$ confcli integration.convoy.events.servers. -w
Running wizard for resource 'Kafka Servers'
<List of kafka servers that events will be sent to>

Kafka Servers <List of kafka servers that events will be sent to>: [
  Kafka Server (default: ): 1.2.3.4
    Add another 'server' element to array 'servers'? [y/N]: N
Generated config:
{
  "servers": [
    "10.11.12.13"
  ]
}
Merge and apply the config? [y/n]: y

integration.counters are counters that report running metrics to an internal module which aggregates data for monitor GUI. integration.counters.http reports HTTP response status codes.

10.2.13 Advanced

Parameters that you normally do not change.

hlsTsPcrOffsetMs Configure PCR offset in HLS output, to avoid issues reported by players. This should ideally be 0. Some players, notably VLC 3.1.1 seem to have a bug that reports an error that DTS is smaller than PCR when they are the same, and force a change of timing that results in bad lip sync. We have found that a small value of this parameter like -45 can remedy that. A better way for VLC, is to run VLC with the parameter --no-ts-pcr-offsetfix.

11 Performance Tuning

11.1 CacheFS

Normally the SW Repackager only caches meta data (see Cache) in RAM while the actual media data is never cached and it often becomes the bottleneck when SW Repackager serves content from an NFS server. In addition, when scaling out the number of SW Repackagers it yields more load on the NFS server which results in even slower reads. AgileTV therefore recommends the use of CacheFS since it both improves the read performance over NFS and also reduce load on the NFS server.

11.1.1 Install CacheFS

Install cachefilesd

dnf install cachefilesd

The default location of the cache is /var/cache/fscache but it can be changed in the configuration file /etc/cachefilesd.conf. See /usr/share/doc/cachefilesd-0.10.9/README which is available after installation for more details about configuration.

Start cachefilesd as follows:

systemctl start cachefilesd

Enable cachefilesd to automatically start after reboot

systemctl enable cachefilesd

11.1.2 Mount NFS volume using CacheFS

Add the fsc option when mounting the NFS volume. For example:

mount -t nfs -o fsc nas:/export/vod/ /mnt/vod

11.1.3 Test CacheFS

The easiest way of verifying that CacheFS is enabled it to measure the time it takes to copy a asset from the NFS Server. For example:

time cp /mnt/vod/big_asset.mp4 /tmp/first

real    0m7.288s
user    0m0.003s
sys 0m1.353s

Then copy the same file again:

time cp /mnt/vod/big_asset.mp4 /tmp/second

real    0m0.885s
user    0m0.000s
sys 0m0.885s

The first copy took ~7 seconds to complete while the second took less than 1 second.

12 Troubleshooting

12.1 General troubleshooting tips

Presented here are a few general tips on what to do when a problem occurs. They all deal with gathering information, which is often the biggest part of troubleshooting.

The log files located under /var/log/edgeware/ew-repackager/ do often contain valuable information about problems related to the repackaging service. Make it a habit to check these logs when investigating a problem.

12.1.1 Collecting logs and information

There is a script called ew-tech-support which is used to collect all relevant logs and information about the server into a zip archive. The script needs to be run as super user, for example:

The default output directory is /root. It is possible to specify the output directory using the -o or --output-directory option. The bzip2 archive edgeware-tech-support-repackager-2017-10-25T19-23.tar.bz2 can then be sent to AgileTV for further troubleshooting.

13 Tools

13.1 Monitor services

It is possible to request statistics counters from the ESB3002. These counters include HTTP status codes and counters for DRM requests. The primary purpose of the services is to provide data for the ESB3011 Web GUI. But any other client could also consume the data.

13.1.1 Operation

Enable counters and configure monitor interval:

# confcli integration.counters.http.enable true
# confcli integration.counters.http.timerInterval 10

Action on the services:

Start, auto-start on boot or check service status as follows

[root@esb3002 ~]# systemctl start ew-repackager-monitord
[root@esb3002 ~]# systemctl enable ew-repackager-monitord monitord
[root@esb3002 ~]# systemctl status ew-repackager-monitord monitord

Details about the services:

The monitord service listens for HTTP requests on port 12345 and responds with statistics counters in JSON format.

The ew-repackager-monitord service logs to the folder /var/log/edgeware/ew-repackager-monitord.

The monitord service logs to the folder /var/log/edgeware/monitord/.

You can get the JSON schema with:

# curl localhost:12345/services/Repackager/repackager_status?schema

You can get the actual counters with:

# curl localhost:12345/services/Repackager/repackager_status

Sample response:

{
    "repackager_status": {
        "accounts": [
            {
                "drm_requests": {
                    "value": 42
                },
                "name": "default",
                "status_codes": [
                    {
                        "name": 200,
                        "value": 101
                    },
                    {
                        "name": 404,
                        "value": 2
                    }
                ]
            }
        ]
    }
}

13.2 Health check service

ESB3002 includes a separate service for performing health checks of the SW Repackager. The service can be started, stopped or auto-started on system boot as follows:

[root@esb3002 ~]# systemctl start ew-repackager-health
[root@esb3002 ~]# systemctl stop ew-repackager-health
[root@esb3002 ~]# systemctl enable ew-repackager-health

The health check service listens for HTTP requests on port 2000 and responds with "200 OK" if the repackaging service is considered healthy. If a problem that could cause the repackager to malfunction is detected the status "503 Service Unavailable" is returned.

The health check service logs to /var/log/edgeware/ew-repackager-health/repackager-health.log.

The log level of the service can be set with confcli:

[root@esb3002 ~]# confcli services.repackaging.healthCheck.logLevel info

The available log levels are "debug", "info", "warning", "error", and "fatal". The default log level is "info".

13.3 Repackager Tool

The ew-repackager-tool that is installed along with the SW Repackager is a utility tool that allows the user to test parts of the functionality inside the SW Repackager from the command line.

Usage: ew-repackager-tool [--version] [--help] <command> [<args>]
Available commands:
 request     Make a Just-In-Time Packaging request for an asset
 vod         Validate VOD assets for Just-In-Time Packaging
For further information about a command, see 'ew-repackager-tool <command> --help'

13.3.1 Make a JITP request for a managed content (ESF) using ew-repackager-tool

The following example shows how to request the master playlist (index.m3u8) from a managed (ESF) content called asset.

[root@esb3002 ~]# ew-repackager-tool request /media/asset/ index.m3u8
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="sub_chi_1",...
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="sub_eng_2",...
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="sub_chs_0",...
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",LANGUAGE="und",NAME="audio_und_0",...
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=4000000,CODECS="avc1.640029,...
video_0/index.m3u8

In the same way it is also possible to request a media playlist or segment, for example:

[root@esb3002 ~]# ew-repackager-tool request /media/asset/ video_0/index.m3u8
[root@esb3002 ~]# ew-repackager-tool request /media/asset/ video_0/1.ts

13.3.2 Test SW-Repackager configuration using ew-repackager-tool

By using the --config switch the ew-repackager-tool can be instructed to use the same configuration as the SW Repackager service. This comes very handy when trying out new configuration, e.g. presentations. (/run/edgeware/ew-repackager-confd/ew-repackager.json). For example:

[root@esb3002 ~]# ew-repackager-tool request --config /run/edgeware/ew-repackager-confd/ew-repackager.json /mnt/esf/asset/ index.m3u8
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="zho",DEFAULT=YES,..."
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",LANGUAGE="und",NAME="und",..."
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1500000,CODECS="avc1.640029,..."
000001152792_1/index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1000000,CODECS="avc1.640029,..."
000001152791_1/index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=848000,CODECS="avc1.4d401f,..."
000001152790_1/index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=448000,CODECS="avc1.42c01e,..."
000001152789_1/index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=248000,CODECS="avc1.42c01e,..."
000001152788_1/index.m3u8

14 Alarms

These events are sent to Convoy and can be found under the "Events" tab in the Convoy GUI. See Integration for details on how to specify the event receiver.

Severity ranges from Info, Minor, Major to Critical.

TitleSeverityDescription
Internal Server ErrorMajorClient request could not be
fulfilled due to an internal error.

15 Appendix A: Used files and ports

This is an overview of resources used by the esb3002 and related services. It can be useful for security audits.

15.1 Files

15.1.1 Written during install/upgrade

These files do not change at runtime.

Files/directoriesPurpose
/etc/edgeware/*Configuration
/etc/ew-repackager/*Configuration etc.
/etc/ew-repackager-health/*Configuration etc.
/usr/bin/ew-*Executables
/usr/lib/systemd/system/ew-*.servicesystemd unit files
/usr/lib/python3.11/site-packages/ew*Libraries
/usr/libexec/ew-tech-support/*Executable
/var/lib/edgewareEmpty (used by other products)
/usr/share/edgewareEmpty (used by other products)

15.1.2 Written at runtime when you reconfigure

Files/directoriesPurpose
/etc/logrotate.d/ew-*Log rotation configuration
/etc/ew-repackager/ew-repackager*nginx and repackager configuration

15.1.3 Written during runtime

Files/directoresPurpose
/var/log/edgeware/*Logging
/run/redis_*.pidRedis pidfile (written at startup)

Note: several logfiles could hypothecially be reconfigured to other paths, but this is unadvisable. Configuration path: services.repackaging.logging

15.2 Ports

15.2.1 Server (HTTP listen)

Configuration path (file & json)DefaultPurpose
/etc/ew-repackager/nginx.conf
http{ server{ listen ...80The repackaging service HTTP
/etc/ew-repackager/nginx.conf
https{ server{ listen ...disabledThe repackaging service HTTPS
/etc/ew-repackager/nginx.conf
http{ server{ listen ... location = /error-log4999error log fetching
fixed2000Repackager health check
fixed12345Monitord

15.2.2 Client

Configuration path (confd)DefaultPurpose
services.repackaging.locations.ingestServers8090CBM upstreams
services.repackaging.locations.azureContainersanyOther media upstreams
services.repackaging.locations.httpServersanyOther media upstreams
services.repackaging.locations.s3BucketsanyOther media upstreams
[...]outputProfiles.*.drm.keyServeranyDRM upstream (typically 4443)

15.2.3 Local unix sockets

Socket pathPurpose
/run/edgeware/*Communication
/run/redis/cache-interface.sockRedis, DRM cache

15.3 Monitord

The monitoring service monitord, common to several products, uses the following resources:

15.3.1 Files

These files do not change during runtime.

Files/directories, may change during installation/upgradePurpose
/usr/lib/systemd/system/monitord.serviceService file
/usr/bin/monitordExecutable
/usr/lib/python3.11/site-packages/monitord*Library
/etc/edgeware/monitord/*Configurations

These change when you reconfigure.

Files/directoresPurpose
/var/log/edgeware/monitord/*Logging
Local unix socketPurpose
/run/edgeware/monitord/service-interface.socketCommunicating with collector

15.3.2 Ports

PortPurpose
12345HTTP listen (monitord server)

15.4 Confd/confcli

The configuration service confd, common to several products, uses the following resources:

15.4.1 Files

These files do not change during runtime.

Files/directories, may change during installation/upgradePurpose
/etc/bash_completion.d/confclibash completion
/etc/edgeware/ew-confd/cert/ew-confd.crtHTTPS certificate
/etc/edgeware/ew-confd/private/ew-confd.keyHTTPS private key
/etc/confd/*Configuration schemas
/etc/sysconfig/confdConfiguration schemas
/usr/lib/systemd/system/confd.serviceService file
/usr/bin/confcliExecutable
/usr/bin/confdExecutable
/usr/lib64/confd/*Executables

These change when you reconfigure.

Files/directoresPurpose
/var/confd/*Current configuration
/var/log/confd/*Logging
Local unix socketPurpose
/var/confd/service-interface.socketNotifications to subscribers

15.4.2 Ports

PortPurpose
5000HTTP listen (confd server)
5443HTTPS listen (confd server)

1.2 -

Query String Variant Selection with TV Repackager

Query String Variant Selection with TV Repackager

1 Introduction

1.1 Confidentiality Notice

This document is confidential and may not be reproduced, distributed or used for any purpose other than by the recipient for the assessment, evaluation and use of AgileTV products, unless written permission is given in advance by AgileTV.

1.2 About this Document

This document describes how to set up filtering based on query strings in order to select what variants to include in multi-bitrate manifest served by the SW Repackager.

This method of filtering variants can be used in addition to the rule-based presentations of the SW Repackager that can filter variants based on variant properties such as bitrate, codec or language.

1.3 References

[1] EDGS-187 - Software Live Ingest User Guide

[2] EDGS-176 - SW Repackager User Guide

1.4 History

VersionDateChanges
A12019-11-01Initial version
A22022-02-22Drop unmanaged VOD support

2 Query string variant selection

2.1 Limitations

Variant selection based on HTTP query strings can only be used to include or exclude variants from the manifest created by the SW Repackager, it cannot be used to change the order of the variants or enforce rules based on e.g. the bitrate or the codecs used. Please see the Presentations section of the SW Repackager User Guide for details on how to perform this type of variant filtering.

The use of query strings for variant selection is limited to sources of type channel or managed VOD content that is recorded from channel source. Ingested managed VoD content, e.g from SMIL + MP4, cannot be filtered using this method.

2.2 Overview

The query string filtering of variants is based on combining two bitfields. The first bitfield comes from the query string parameter p= in the incoming request to the SW Repackager. This is called the variant mask. Below are two example requests using variant mask query strings, one for a DASH manifest and one for an HLS playlist:

http://example.com/__cl/cg:live/__c/channel1/__op/drm/__f/manifest.mpd?p=98

http://example.com/__cl/cg:live/__c/sports/__op/drm/__f/index.m3u8?p=610

The second bitfield comes from the variant's track configuration in Live Ingest. These bits are called the variant flags. The image below shows a client requesting a channel manifest while including the variant mask p=18 in the request (1).

The repackager then fetches the channel definition from the ingest node including the list of variants (2 and 3).

For each variant the repackager compares the variantFlags value with the variant mask provided by the client in a bitwise AND operation. If any bit is equal in the two bitfields the variant is included in the resulting manifest, otherwise it is excluded (4).

Finally the remaining variants are used to generate the manifest and stream it to the client (5).

Variant selection overview
Variant selection overview

After the filtering based on the variant mask has been performed the rules of the current presentation filters are applied.

2.3 Bitfield construction

2.3.1 Variant flags

The meaning of each bit in the variant flags is use-case specific and depends on the reasons for including or excluding a variant. A reason could be device compatibility such as codec support, or the ability to play HD content.

For example to filter variants based on the following properties:

  • SD vs HD video
  • Stereo vs surround audio
  • HEVC decoder support

SD can be defined as bit 1 (least significant bit) of the variant flags, HD as bit 2, and so on. With this definition in place, variantFlags can be set on all tracks in the channel based on the track's properties.

For instance, an HEVC video variant should have the bits for HEVC and HD set to 1, so it is given a variantFlags value of 18.

variantFlags construction
variantFlags construction

2.3.2 Configuration

Variant flags are configured as a track property named variantFlags in the channel configuration in the Live Ingest server. For example, to set the variant flags of the track v1 in the first input source of the channel ch1 using confcli:

confcli services.liveIngest.channels.ch1.inputSources.0.tracks.v1.variantFlags 28

If the variantFlags parameter is missing in the configuration of a track, or if it is set to the special value -1, then the variant will match any non-zero p= mask sent by the client.

The variantFlags parameter is a 32-bit integer number, so up to 32 different properties can be filtered using variant flags.

2.3.3 Variant mask

The variant masks to include in the manifest requests are calculated in the same way as the variant flags. For instance, to get a manifest with only SD video and stereo audio, bit 1 and 3 should be set, so providing the query string p=5 will give the desired result:

SD + Stereo variant mask example
SD + Stereo variant mask example

Similarly, to get a manifest with only HEVC content and 5.1 audio, bit 4 and 5 of the variant mask should be set, resulting in p=24.

HEVC + 5.1 variant mask example
HEVC + 5.1 variant mask example

If no p= query string is provided in the manifest request, all variants will be included. However, additional variant filtering is still applied based on the repackager's presentation settings.

1.3 -

ESB3002 Software Repackager Licensing User Guide

ESB3002 Software Repackager Licensing User Guide

1 Confidentiality notice

This document is confidential and may not be reproduced, distributed or used for any purpose other than by the recipient for the assessment, evaluation and use of AgileTV products, unless written permission is given in advance by AgileTV.

2 About this document

This document covers an overview of the SW Repackager license model support. No prior knowledge about the system is assumed. Intended audiences include system administrators who install the system, operators who use it, and anyone who is interested in learning more about the product.

3 How to use this document

This document aims to be used as a foundation to build an understanding around the product. The document is to be used a guideline when working with the product. This document does not define any specific information on feature development in specific releases, please refer to “Release Notes”. Neither does this document define any applications relying on the specific product, please refer to “Application Notes”.

4 History

VersionDateChanges
A12021-04-12Initial version
A22022-01-11More details about each license variants
A32022-10-05Update license error behaviour
A42023-05-10Unify license package variants
A52024-02-21Unify installer variants
A62024-10-23Introduce sb-license type

5 Basic license support

5.1 General information

The SW Repackager can run with three different kinds of licenses

  1. ScientaMedia: Requires an internet connection
  2. Convoy: Requires a Convoy installation, but no external internet
  3. Standalone: Requires neither internet nor Convoy

The actual license, must be acquired from Agile Content TAC, and the license type depends on the agreement with Agile Content.

5.2 Service configuration

For all license types the license file is: /etc/ew-repackager/license.json

After updating the file, the services must be restarted:

[root@esb3002 ~]#  systemctl restart ew-repackager-license ew-repackager

5.2.1 ScientaMedia and Convoy licenses

You may receive either a complete file (or a license_ref string). The license file must be replaced (or edited) accordingly.

For example:

validation_type must be online for ScientaMedia, and offline for Convoy licenses.

5.2.2 Standalone license

In this case you will receive a complete file in a different format. Here the entire license file must be replaced without any editing.

5.2.3 Variant specific configuration

For Convoy licenses, the convoy-1 and IP to the Convoy nod must be added to /etc/hosts, manually.

5.3 License statuses

The table below briefly sums up the possible license statuses returned by the license server. Currently only an expired license will cause the SW Repackager to stop processing requests.

StatusDescriptionImpact on running instancesPossible action
ValidLicense is valid.None.None.
Concurrency LimitThe concurrency limitDiscard requests.Contact TAC support.
of the running instancesHTTP 509 error will be returned
was exceeded.
ExpiredThe acquired license hasDiscard requests.Contact TAC support.
expired (reached itsHTTP 509 error will be returned
lifetime or was
invalidated).
ErrorAn unexpected errorNone. If the SW RepackagerRestart the service.
occured. 3rd partyservice detects this kindIf the problem
service islicense status it ignorespersists contact
inaccessibility or anit and lets the serviceTAC Support.
internal error occured.work as intended.

5.4 Troubleshooting

For more information please try the following:

  • The ew-repackager-license service log which can be viewed with journalctl.
[root@esb3002 ~]#  journalctl -fu ew-repackager-license
  • Additional details can be found in the repackaging.log.
[root@esb3002 ~]#  tail -f /var/log/edgeware/ew-repackager/repackaging.log

2 - Live-ingest (esb3003)

Ingest live transport streams for further distribution and recording

Live-ingest - User Guide

Live-ingest - Catchup

Live-ingest - Auto Configuration User Guide

3 -

4 - VoD to Linear (esb3019)

Make repackagable linear channels with ads and ad markers from VoD and file assets

4.1 - General

General description of ESB3019 - the ew-vod2cbm service

The core of the ESB3019 product is ew-vod2cbm. The ew-vod2cbm service provides linear video or audio channels via the Edgeware CBM HTTP interface from playlists of VoD assets.

The benefit of using the CBM interface is that the EW repackager sees the source as an ordinary live channel as a normal Edgeware live channel as would originate from the Catchup Buffer Manager (CBM) and can thereby encrypt and package content in all its usual output formats.

The HTTP interface also allows for running the ew-vod2cbm service on a different machine than the EW repackager ESB3002.

Main concepts

To get an efficient and versatile service, it is essential to prepare content in a stream-lined way so that playlists and other metadata content can be minimal and stitching of content can be done on GoP boundaries with no alignment issues.

The main concepts for such a solution are:

  1. Prepare content in a homogeneous way.
  2. Ingest content using ESB3005 into CMAF/ESF format or use DASH OnDemand assets
  3. Start up the server with or without assets and channels configured
  4. Use CBM HTTP interface for repackager integration
  5. Update the assets, channels, and schedules of the channels dynamically via the REST API.

Step 1 and 2 may be fulfilled by a recording of a live channel. Such a recording can be made using the ew-recorder tool of ESB3005 as described in the ESB3005 user guide.

You can also start with VoD assets. If the VoD asset is already in DASH OnDemand format it may work as it is, but otherwise it needs to be converted to ESF format using the ESB3005 ew-recorder component. If the asset consists of SMIL + mp4 + subtitle files, it can also be ingested using the new ESB3021 ew-vodingest tool. That tool can also ingest a directory containing mp4 and subtitle files without referring to a SMIL file.

Supported codecs and formats

The VoD assets must be in DASH OnDemand or Edgeware’s ESF format. In both cases, the audio and video should be in CMAF track files. For subtitles, the DASH OnDemand ingest uses one complete non-segmented side-car file per language, while ESF uses a CMAF track with wvtt segments

The supported codecs are

  • video: AVC/H.264 and HEVC/H.265
  • audio: AAC-LC, HE-AACv1, HE-AACv2
  • DASH OnDemand subtitles: TTML, WebVTT, SRT, STL
  • ESF subtitles: wvtt

4.2 - Details

More details on how the ew-vod2cbm service works

1. Prepare content

All content must be reasonably similar in order to be stitched into a continuous channel. For each channel a content template is used to define how the output linear channel will look when it comes to signaled tracks, codecs, languages, bitrate, variant names etc. The content template format is described in the Content Templates section.

For flexible content handling, the restrictions are rather loose and should be fulfilled by much content out there

  1. Constant video GoP duration, such as 1.92s, 2s, or 2.002s
  2. Constant sample duration (frame rate) in all input MP4 files
  3. Compatible tracks in all ingested content that should go into one channel. The track matching is described in the Asset Track Matching section

These requirements are quite relaxed compared to the early restrictions (v0.6.x) that required that audio and video had exactly the same segment duration, and segments were built by combining these.

2. Store content as ESF VoD assets

To get content in ESF/CMAF format, one can either use a recording or ingest video using the Edgeware ESB3005 tool CMAF/ESF. One can also ingest using the new ESB3021 ew-vodingest tool.

However, it is beneficial that all VoD assets are very similar when it comes to resolutions, bit rates, SPS/PPS etc., so using a fixed encoding recipe is recommended.

To make it possible to combine sources with somewhat different video parameter sets, the parameter sets are extracted for each asset and signaled in band. This makes it possible for most players to handle possible changes in encoding parameters. Signaling-wise, this means that our output is compatible with inband parameter codec configurations corresponding to avc3 and hev1, respectively.

Alternatively, DASH OnDemand assets may be used.

3. Create channels as schedule playlists with ad periods

The live channels are defined by some fixed parameters and a schedule that may be dynamically updated via a REST API.

All entries in the schedule are specified in units of GoPs. The playlist supports arbitrary GoP intervals of an asset and will wrap if going beyond end of asset. One can also specify the full asset by giving length=0, or specify to start with the n last GoPs by specifying the negative offset -n.

A slate or filler asset of duration 1 GoP, may be set to length N and thereby repeat N times.

An important part is to be able to split and rebuild output segments from input GoPs. For example, one may have 4s segments with 2s GoPs as input and desire 6s segments as output. This is achieved by splitting the input segments into GoPs and build new segments from these GoPs. This is specified by the parameters for a channel: gopDurMS=2000 and nrGopsPerSegment=3. At an ad boundary, the actual duration of a segment will be changed so that an ad period always start and end at a combined segment boundary. For this to work, each ad asset and asset between ads must consist of at least nrGopsPerSegment GoPs.

An ad in the schedule is indicated by a non-zero scteEventID value. If two “programs” in a row have the same scteEventID, they are considered to be one ad “pod”, with a CUE-OUT at the start of the pod, and a CUE-IN at the end of the pod. When updating the schedule to remove ads, it is important that full pods are removed. If scteEventID is set to -1, a unique event ID corresponding to the GoP number where the ad break starts will be inserted in the output.

The assets referred to in the schedule need to be located and fetched. This done by creating a map that maps assetIDs to assetPaths. An initial mapping can be provided in config file, but more importantly, the asset paths can be updated using a REST API. The assetPaths supports can be mounted file systems, HTTP URLs, and S3 URLs. The metadata of the assets is loaded in an LRU cache as part of the scanning of the schedule of a schedule. Asset paths can be removed from the asset cache by sending a DELETE command via the REST API, but only if the assets are not included in any schedule.

4. CBM HTTP interface for repackager integration

The EW repackager gets upstream live channels via an HTTP interface towards CBM. The HTTP interface provides list of channels, content_info.json, segment_times.json and actual “live” segments. Since ew-vod2cbm provides the same interface as the CBM, no change is needed in the repackager to support ew-vod2cbm.

The CBM segment_times.json data should be enough for signaling ads. The emsg boxes in segments should not be needed and are not added to the segments.

5. Repackager configuration

An ingestServer needs to be configured in order for the repackager to know where to fetch the vod2live channel. That configuration is described in Configuration Repackager.

Finally, content should now be available from the repackager as

 https://<server>/__cl/cg:vod2live/__c/<channel>/__op/default/__f/index.m3u8

where the cg:vod2live is the channel group for the vod2live channel.

6. Schedule update of a channel

Once a channel is created, its top level parameters cannot be changed. However, it is possible to change the schedule of a channel, but replacing it. The replacement must be done in a careful way to achieve a manifest which are consistently changed over time. There are more details on how to do this in the Dynamic Channels How-To guide.

4.3 - Installation

Installation and service operation

The vod2cbm service is distributed as a CentOS/Red Hat RPM and is available as ew-vod2cbm.service when installed. It works both on RH 7 and 8 and compatible versions.

To install version x.y.z, the rpm command can be used as follows:

yum install ./ew-vod2cbm-x.y.z-1.el8.x86_64.rpm

The service can be controlled with the standard systemctl commands:

systemctl start ew-vod2cbm
systemctl stop ew-vod2cbm
systemctl status ew-vod2cbm

Logs from the service can be seen using journalctl -u ew-vod2cbm.

The unit file is available in /usr/lib/systemd/system/ew-vod2cbm.service and starts ew-vod2cbm, serving port 8090 by default.

When run as a service, ew-vod2cbm reads its initial configuration from /etc/edgeware/ew-vod2cbm/config.json. The configuration may contain a schedule for looping channels. Non-looping channels must be created over the Channel REST API. For details on scheduling please refer to the API Reference

To uninstall the service, do:

yum remove ew-vod2cbm

When uninstalling or upgrading it is recommended to first stop the service.

4.3.1 - Upgrades

Upgrade of ew-vod2cbm

Upgrade to v1.2.x from v1.0.x

There is a new parameter padLastGop in the REST API, as well as the local JSON configuration for a channel/schedule. If that is not set, a last shorter GoP will be truncated from an asset. Set it if you want the new padding functionality to be applied.

Upgrade to v1.0.x from v0.10.x

The main new thing is the online license file that must be available in order to run the service fully.

Upgrade to v0.10.x from v.0.8.x

The command-line parameter -gopdurms is no longer needed or supported. The config file is also no longer mandatory.

The command-line parameter -s3 has changed name to -s3file.

Upgrade to v0.8.x from v.0.6.x

The segmentation and splicing is now based on GoPs instead of segments. There is a new mandatory parameter, defaultGopDurMS that must be provided in the configuration file, or provided as a command line option -gopdurms.

The config file has changed to be based on GoPs instead of segments. Therefore, there are a few new parameters for each channel:

        "segDurMS"  -> "gopDurMS"
        "combineNrSegs" -> "nrGopsPerSegment":

Here, the gopDurMS must be the GoP duration for all input video variants of all input content. The actual segment duration of the content is not relevant. The end GoP may be shorter, but is then dropped.

The input segment duration is not fixed, as long each video segment consists of an integral number of GoP. The output segments are generated by combining nrGopsPerSegment GoPs, with a possible adjustment where ads start and stop.

Another update of the channel configuration is inside “schedule” where

 "Programs" -> "Entries"

For dynamics schedules, it is recommended to use the REST API to handle channels.

4.4 - Configuration and command-line arguments

Configuration and command-line

The ew-vod2cbm global service parameters can be specified in the following ways:

  1. On the command-line
  2. As environment variables
  3. In the configuration file (when specified by the command-line)
  4. Default values

This also shows the order of precedence from top to bottom, where values on the command-line will override all other values.

The global service parameters cannot change during execution, except for logging.

An example configuration file is available in Example Configuration.

Note that the typical way of creating and configuring channels and assets is over the REST API. It is also possible to configure assets and channels in the configuration file. This can be handy mostly for testing. A channel parameter, when present, will override the corresponding global parameter. For example the global parameter defaultMaxliveWin would be overridden by the channel parameter maxLiveWindowS.

The command-line

All command line parameters and environment variables can be seen by running:

ew-vod2cbm -h
Usage of ew-vod2cbm:

ew-vod2cbm produces linear video channels from VoD assets
with the same interface as the ESB3003 catchup buffer mgr (CBM).

Run ew-vod2cbm with options:

  -cachedcfg string
        Location of cached channel/assetpath configuration file
  -cfg string
        Config file
  -defaultMaxBitratePercentAbove int
        Global fallback percentage value for max higher allowed bitrate compared to a matching master track
  -defaultMaxBitratePercentBelow int
        Global fallback percentage value for max lower allowed bitrate compared to a matching master track
  -defaultMaxliveWin int
        Max live window [seconds] (default 14400)
  -licenseFile string
        Location of ew-vod2cbm license file (default "/etc/edgeware/ew-vod2cbm/license.json")
  -logformat string
        Format and type of log: [consolejson consolepretty journald discard] (default "consolejson")
  -loglevel string
        Initial log level (default "info")
  -port int
        Server TCP port (default 8090)
  -routes
        Generate a markdown file with HTTP routes
  -s3file string
        S3 credentials file
  -timeout int
        Maximum time in seconds before HTTP requests fail. Set to 0 to disable (default 60)
  -timesubs
        Generate time subtitles
  -version
        Get version, date, and possible expiration date

The corresponding environment variables are:
EW_ESB3019_PORT     EW_ESB3019_DEFAULT_MAX_LIVE_WIN               EW_ESB3019_TIMEOUT     EW_ESB3019_LICENSE_PATH
EW_ESB3019_CFG      EW_ESB3019_DEFAULT_MAX_BITRATE_PERCENT_ABOVE  EW_ESB3019_LOG_FORMAT  EW_ESB3019_CACHED_CFG_PATH
EW_ESB3019_S3_FILE  EW_ESB3019_DEFAULT_MAX_BITRATE_PERCENT_BELOW  EW_ESB3019_LOG_LEVEL

Command-line parameters will always override envirionment variables and configured values.

4.4.1 - Startup Configuration

Startup configuration for configuring ew-vod2cbm

When starting the ew-vod2cbm service, a configuration file may be provided. This file enables starting ew-vod2cbm with predefined assets, channels and schedules. These items can also be added and updated via the REST API when the service is running.

If a path to a cached configuration is set, any change of the configuration via the REST API results in that the complete configuration of asset paths, channels and their schedules are written to a file at that path. On restart, an existing file at this path is used to restore the last dynamic configuration, while any static configuration of these settings is skipped.

However, if a path to a cached configuration is set, either via a command line parameter -cachedcfg or the corresponding environment variable, such a file will be used to restore the last dynamic configuration of asset paths and channels. The static configuration of these entities will then be ignored, unless the parsing of the cache configuration fails.

JSON Schema for configuration file

The JSON snippet below provides a description of the schema and the parameters that applies to configuration file for ew-vod2cbm.

The masterAssetID will be deprecated in a future release.

{
    "defaultMaxBitratePercentAbove": {
        "description": "When matching a variant, this sets the maximum upper boundary in percent for the bitrate",
        "type": "integer",
        "minimum": 0,
    },
    "defaultMaxBitratePercentBelow": {
        "description": "When matching a variant, this sets the maximum lower boundary in percent for the bitrate",
        "type": "integer",
        "minimum": 0,
        "maximum": 100,
    },
    "defaultMaxLiveWindowS": {
        "description": "The maximum length of the live window in seconds",
        "type": "integer",
        "minimum": 10,
        "maximum": 36000,
    },
    "assets": {
        "description": "list of assets",
        "type": "array",
        "items": {
            "type": "object",
            "required": [
                "id",
                "path"
            ],
            "properties": {
                "id": {
                    "type": "string"
                },
                "path": {
                    "type": "string"
                }
            }
        }
    },
    "channels": {
        "description": "Channels for ew-vod2cbm at startup",
        "type": "array",
        "items": {
            "type": "object",
            "required": [
                "gopDurMS",
                "name",
                "nrGopsPerSegment",
                "schedule"
            ],
            "properties": {
                "doLoop": {
                    "description": "Loop schedule or not",
                    "type": "boolean"
                },
                "gopDurMS": {
                    "description": "Exact millisecond duration of all video GoPs in all assets",
                    "type": "integer",
                    "minimum": 320,
                    "example": 2000
                }
                "contentTemplatePath": {
                    "description": "Path to the content template file. If this is used, masterAssetID should not be specified.",
                     "type": "string"
                 },
                 "masterAssetID": {
                     "description": "ID of the asset to use as a content template. If this is used, contentTemplatePath should not be specified.",
                    "type": "string"
                },
                "maxBitratePercentAbove": {
                    "description": "Percent diff above for when matching a track from the content template",
                    "type": "integer"
                },
                "maxBitratePercentBelow": {
                    "description": "Percent diff below for when matching a track from the content template",
                    "type": "integer"
                },
                "name": {
                    "description": "Unique name",
                    "type": "string",
                    "minLength": 2,
                    "example": "Channel 1"
                },
                "nrGopsPerSegment": {
                    "description": "How many GoPs to include in an average output segment",
                    "type": "integer",
                    "minimum": 1,
                    "example": 3
                },
                "schedule": {
                    "description": "The current scedule of the channel",
                    "type": "object",
                    "required": [
                        "entries"
                    ],
                    "properties": {
                        "entries": {
                            "description": "list of programs or other entries",
                            "type": "array",
                            "items": {
                                "type": "object",
                                "required": [
                                    "assetID",
                                    "length",
                                    "name"
                                ],
                                "properties": {
                                    "assetID": {
                                        "description": "Asset identifier",
                                        "type": "string",
                                        "minLength": 2,
                                        "example": "asset1234568-22"
                                    },
                                    "length": {
                                        "description": "How many GoPs to play in asset. 0 is until end of asset. Beyond end results in wrap to start",
                                        "type": "integer",
                                        "example": 2400
                                    },
                                    "name": {
                                        "description": "Name to include in EPG",
                                        "type": "string",
                                        "minLength": 2,
                                        "example": "The Shark"
                                    },
                                    "offset": {
                                        "description": "Zero-based GoP nr to start in asset. Negative value means from end",
                                        "type": "integer"
                                    },
                                    "scteEventID": {
                                        "description": "SCTE-35 Event ID in SCTE message. A non-zero value signals an ad. If scteEventID is set to -1, a unique event ID corresponding to the GoP number where the ad break starts will be inserted in the output.",
                                        "type": "integer",
                                        "minimum": -1
                                    }
                                }
                            }
                        },
                        "gopNrAfterLastAd": {
                            "type": "integer"
                        },
                        "gopNrAtScheduleStart": {
                            "type": "integer"
                        }
                    }
                },
                "startTimeS": {
                    "description": "Start time relative epoch (1970-01-01) in seconds",
                    "type": "integer",
                    "minimum": 0
                }
            }
        }
    }
}

Example configuration

An example configuration file for two channels where all assets have relative paths may look like:

{
    "defaultMaxBitratePercentAbove": 5,
    "defaultMaxBitratePercentBelow": 20,
    "assets": [
        {"id": "bbb", "path": "app/testdata/assets/bbb"},
        {"id": "slates/slate_pre_ad", "path": "app/testdata/assets/slates/slate_pre_ad"},
        {"id": "slates/slate_post_ad", "path": "app/testdata/assets/slates/slate_post_ad"},
        {"id": "slates/slate_black", "path": "app/testdata/assets/slates/slate_black"},
        {"id": "whistler", "path": "app/testdata/assets/whistler"},
        {"id": "ed", "path": "app/testdata/assets/ed"}
    ],
    "channels": [
        {
            "name": "quick",
            "gopDurMS": 1920,
            "nrGopsPerSegment": 2,
            "contentTemplatePath": "location/of/content_template.json"
            "startTimeS": 0,
            "doLoop": true,
            "maxBitratePercentAbove": 10,
            "maxBitratePercentBelow": 30,
            "schedule": {
                "GopNrAtScheduleStart": 0,
                "GopNrAfterLastAd": 0,
                "Entries": [
                    {
                        "name": "Big Buck Bunny",
                        "assetID": "bbb",
                        "offset": -3,
                        "length": 3
                    },
                    {
                        "name": "Ad upcoming",
                        "assetID": "slates/slate_pre_ad",
                        "offset": 0,
                        "length": 1,
                        "scteEventID": 123
                    },
                    {
                        "name": "Whistler ad",
                        "assetID": "whistler",
                        "offset": 0,
                        "length": 4,
                        "scteEventID": 123
                    },
                    {
                        "name": "Ad finished",
                        "assetID": "slates/slate_post_ad",
                        "offset": 0,
                        "length": 1,
                        "scteEventID": 123
                    },
                    {
                        "name": "Elephants dream",
                        "assetID": "ed",
                        "offset": 3,
                        "length": 4
                    }
                ]
            }
        },
        {
            "name": "test",
            "gopDurMS": 1920,
            "nrGopsPerSegment": 3,
            "contentTemplatePath": "location/of/content_template.json"
            "startTimeS": 0,
            "doLoop": true,
            "schedule": {
                "GopNrAtScheduleStart": 0,
                "GopNrAfterLastAd": 0,
                "Entries": [
                    {
                        "name": "Big Buck Bunny",
                        "assetID": "bbb",
                        "length": 0
                    },
                    {
                        "name": "Black 10s",
                        "assetID": "slates/slate_black",
                        "offset": 0,
                        "length": 5
                    },
                    {
                        "name": "Whistler ad",
                        "assetID": "whistler",
                        "length": 0,
                        "scteEventID": 123
                    },
                    {
                        "name": "Elephants dream",
                        "assetID": "ed",
                        "offset": 0,
                        "length": 0
                    }
                ]
            }
        }
    ]
}

4.4.2 - Content Templates

The role of content templates in ew-vod2cbm

Contents templates are used in ew-vod2cbm to specify the output segmentation and tracks of a channel, but also serve as measures to check if asset entries in a schedule are compatible with the channel. They are further used to generate the manifest and playlist media data properties as well as the media init segments. Therefore, bitrate, resolution, frame rate, video parameter sets, number audio channels are included in the template. The assets do not need to have exactly the same parameter values, but are allowed to vary as described later.

The generally preferred way of creating content templates, is to use ew-content-template-tool, described below.

JSON Schema for Content Template

The JSON schema of the content template contains core parameters of the content_info.json schema, and some additional parameters for bitrate matching.

It can contain variants of video, audio, and subtitles as signaled in the media_type field. The variant array can contain multiple variants of each type. The table below the schema shows the required parameters for each media type.

{
    "type": "object",
    "properties": {
        "version": {
            "type": "string"
        },
        "constant_gop_duration_ms": {
            "type": "integer"
        },
        "variants": {
            "type": "array",
            "items": [
                {
                    "type": "object",
                    "properties": {
                        "media_type": {
                            "type": "string"
                        },
                        "subtype": {
                            "type": "string"
                        },
                        "name": {
                            "type": "string"
                        },
                        "bitrate": {
                            "type": "integer"
                        },
                        "width": {
                            "type": "integer"
                        },
                        "height": {
                            "type": "integer"
                        },
                        "sample_aspect_ratio": {
                            "type": "string"
                        },
                        "picture_aspect_ratio": {
                            "type": "string"
                        },
                        "scan_type": {
                            "type": "string"
                        },
                        "sps": {
                            "type": "string"
                        },
                        "pps": {
                            "type": "string"
                        },
                        "codec": {
                            "type": "string"
                        },
                        "frame_rate_fraction": {
                            "type": "array",
                            "items": [
                                {
                                    "type": "integer"
                                },
                                {
                                    "type": "integer"
                                }
                            ]
                        },
                        "num_channels": {
                            "type": "integer"
                        },
                        "samplerate": {
                            "type": "integer"
                        },
                        "decoder_config": {
                            "type": "string"
                        },
                        "lang": {
                            "type": "string"
                        },
                        "max_bitrate": {
                            "type": "integer"
                        },
                        "min_bitrate": {
                            "type": "integer"
                        }
                    },
                    "required": [
                        "media_type",
                        "name",
                        "bitrate",
                        "codec"
                    ]
                }
            ]
        }
    }
}

Depending on the media type, there are required fields for a variant. The table below lists all the required fields depending on media type.

Media typeRequired fields
Videomedia_type
subtype
name
bitrate
width
height
sample_aspect_ratio
picture_aspect_ratio
scan_type
sps
pps
codec
frame_rate_fraction
Audiomedia_type
subtype
name
bitrate
codec
num_channels
samplerate
decoder_config
lang
Subtitlesmedia_type
name
bitrate
lang
codec

The fields max_bitrate and min_bitrate are optional for all media types.

Example content template

{
    "version": "1.0",
    "constant_gop_duration_ms": 1920,
    "variants": [
        {
            "media_type": "video",
            "subtype": "h264",
            "name": "V1000",
            "bitrate": 1000000,
            "width": 640,
            "height": 360,
            "sample_aspect_ratio": "1:1",
            "picture_aspect_ratio": "16:9",
            "scan_type": "progressive",
            "sps": "6764001eacb201405ff2a0",
            "pps": "68ebccb22c",
            "codec": "avc1.64001E",
            "frame_rate_fraction": [
                25,
                1
            ],
            "max_bitrate": 1500000,
            "min_bitrate": 900000
        },
        {
            "media_type": "video",
            "subtype": "h264",
            "name": "V1500",
            "bitrate": 1500000,
            "width": 768,
            "height": 432,
            "sample_aspect_ratio": "1:1",
            "picture_aspect_ratio": "16:9",
            "scan_type": "progressive",
            "sps": "6764001eacb201806f20",
            "pps": "68ebccb22c",
            "codec": "avc1.64001E",
            "frame_rate_fraction": [
                25,
                1
            ],
            "max_bitrate": 1600000,
            "min_bitrate": 1400000
        },
        {
            "media_type": "audio",
            "subtype": "aac",
            "name": "A128",
            "bitrate": 128000,
            "codec": "mp4a.40.2",
            "num_channels": 2,
            "samplerate": 48000,
            "decoder_config": "1190",
            "lang": "eng"
        },
        {
            "media_type": "subtitles",
            "name": "eng_1",
            "bitrate": 1000,
            "lang": "eng",
            "codec": "wvtt"
        }
    ]
}

Creating a Content Template: ew-content-template-tool

A content template does not need to created by hand. It can be created from an ingested asset with:

$ ew-content-template-tool

Usage: bin/ew-content-template-tool [OPTIONS] <content info path> <content_template_path> ...
Options:
-gop-dur-ms int
        GOP Duration for template
-version
        Get version and build date

For example:

$ ew-content-template-tool  -gop-dur-ms 1920 content_info.json content_template.json

Note: The tool makes no verification that the media files actually fulfill the specified GOP duration.

Verifying Assets Before Scheduling: ew-verify-asset

Before attempting to schedule an asset, it can be verified that it matches a specific content template, with:

$ ew-verify-asset

Usage: ew-verify-asset [options]

-i, --input string      Asset path
-t, --template string   Content template file for the asset(s)

For example:

$ ew-verify-content -i media/matrix-revolutions/ -t content-templates/template_4sGOP_hevc.json

This tool will verify that the asset with regards to video-tracks, codecs etc. Missing subtitle tracks, and (secondary) audio tracks are allowed, and yield warnings.

Non-constant GOP lengths are detected, and rejected, for assets ingested with ew-vodingest. Such irregularities are not detected for assets ingested with the older ew-recorder.

4.4.3 - Assets

Assets (content_info.json) in ew-vod2cbm

The video content of a ew-vod2cbm consists of VoD video assets. Assets are added to the server and then added to the schedule of a channel (this is done either using the Schedule API or the Config) to the schedule of a channel. The way an asset is specified for vod2cbm, is using a file path or URL to either a directory that contains a content_info.json file or directly to a DASH OnDemand manifest (must end with file extension .mpd). The content_info or manifest file of the asset contains the necessary metadata to start processing it.

Asset requirements

The media tracks must be in one of the supported codecs and formats.

All assets of a channel must have a GoP duration that is “compatible” with the value specified in the channel configuration. Compatible here means that the channel GoP duration must be a multiple of the asset GoP duration. For example, an asset with 1s GoP duration is compatible with a channel with 2s GoP duration. That value is specified in the channel configuration as gopDurMS. As a schedule is updated, all included assets’ metadata as well as the first part of each video track is loaded in order to derive a GoP duration for that asset. The metadata is cached for future use, while the actual video and audio media data is not.

Another requirement is that all media samples in an mp4 files must have the same duration. This is normally no problem if the content has fixed frame rate and a timescale that is compatible with the frame rate and audio sample rate.

Padding the last asset GoP

It is not a requirement that the last GoP of an asset has the same duration as the others. It is natural that the last GoP is shorter. Using the boolean padLastGop parameter in the channel/schedule configuration it is possible to determine whether that last GoP will either be discarded or padded with silent audio and black video frames to become as long as the others. The GoP duration in this context is the channel’s GoP duration.

The padding influences the length of the asset. As an example, consider an asset that has 32.5s duration, and has an IDR-frame every 1s. If used in a channel with GoP duration 2s, the asset length is considered to be 32s if padLastGop is false, and 34s if padLastGopis true. In the latter case, the last 1.5s will be padded with silent audio and black video frames to achieve the full duration of an 2s GoP. The GoP duration of 1s of the actual asset, does not matter here, since all segments are built from GoPs of the duration specified in the channel’s configuration. If the channel entry for the asset specifies a length that wraps the asset to start from the beginning, the padding is included in the video so that a padded entry wraps later than a non-padded entry.

The padding content

The silent audio is built by repeating silent audio frames from the corresponding audio codec and setting the timing parameters appropriately.

The black video is built by taking frames from a 500frames long I-P-P-P- sequence of AVC or HEVC video. Since the content is just a black frame, the resolution does not influence the image quality, so a fixed resolution of 640x360 pixels is currently used. Since this content generally doesn’t match with the content of the variant being played, all video is sent using inband signaling parameter sets, that is avc3 for H.264/AVC hev1 for H.265/HEVC.

4.4.3.1 - Asset Track Matching

Matching of tracks in assets for ew-vod2cbm

Matching rules

For a schedule to be valid, all assets must be compatible with the content template of the channel.

The compatibility check is done by a set of matching rules when a channel is created or when its schedule is updated. If one of the assets is not matching the content template, the schedule is discarded and an error is reported.

The matching is done by comparing the asset tracks with the tracks of the content template.

The first condition is equal media type. A video track will, for example, never be matched to an audio track.

The second condition depends on the media type of the track. Some media type-specific properties of a track, must always be identical to a track found in the content template for them to match. The table below lists the properties that must be identical for the respective media types between a track in an asset and a track in the content template.

Media typeMedia properties that must match
VideoMedia type
subtype
AudioMedia type
subtype
Codec
Sample rate
SubtitlesMedia type
Language
Role

The third condition regards the bitrate range. By default, the bitrate of an asset track must be identical to the bitrate of the corresponding content template track. However, the max_bitrate and min_bitrate parameters in the content template allow for a range of matching bitrates on track level.

More generally, there are also percentage values that can be specified for bitrates in either a channel configuration, or as global parameters at the top level of the config file or as command line parameters.

The channel parameters are called maxBitratePercentAbove and maxBitratePercentBelow, while the global parameters are called defaultMaxBitratePercentAbove and defaultMaxBitratePercentBelow These are all optional with default value 0. The rules for bitrate matching are applied in the following priority order:

  1. Use the track specific bitrate range if it exists
  2. Use the channel specific bitrate percentage range if it exists
  3. Use the command-line bitrate percentage range if it exists
  4. Use the top-level JSON bitrate percentage range if it exists

Only one of the rules will be applied (the one with the highest priority that is valid for the scope of the track we are trying to match to).

Cases of non-direct match

There does not need to be a one-to-one match between tracks. An asset which deviate from the content template in the following way should be accepted:

  1. Extra tracks are allowed and will be silently discarded
  2. Subtitle tracks may be missing. This results in corresponding empty subtitle segments
  3. Audio languages may be missing. Such a track will be replaced by tracks of another language. An example would be a channel where some programs are in English and some in Spanish.

Matching algorithm

The matching occurs when a schedule is being updated for a channel. If no match is found for any variant in any asset in the new schedule, the schedule is considered invalid, and an error is returned. The matching algorithm begins by sorting the variants in the content template by their bitrate in descending order. The same is done for every asset. Finally, each variant in the sorted list of template variants, will be matched with a compatible asset variant considering media type and the compatibility values listed in the table above.

The search for a compatible variant in the asset is started from the top of the sorted variant list in the content template. This ensures that the most appropriate variant in each asset will be coupled with a corresponding variant in the content template.

4.4.4 - Repackager configuration

How to configure the repackager

The ESB3002 repackager needs to be configured with a new “ingestServer” corresponding to the ew-vod2cbm node.

First define a new ingestServer under ingestServers

 services.repackaging.locations.ingestServers

   "ingestServers": [
    {
      "name": "vod2cbm",
      "url": "http://127.0.0.1:8090"
     }
   ]

Then define a new group channelGroup for vod2live content:

 services.repackaging.content.channelGroups

 {
    "channelGroups": [{
            "locations": [
                "vod2cbm"
            ],
        "name": "vod2live"
        }
    ]
}

4.4.5 - Channels

Channel and schedule configuration

As described in the Startup Configuration section, one can start up the service with both assets and channels defined in the config file.

However, one can change this configuration by using the REST API. In this way one can

  1. Add asset paths
  2. Add channels
  3. Replace schedules of non-looping channels
  4. Delete channels
  5. Delete asset paths for assets which are not in any schedule

Schedule updates are further described in the Dynamic Channels section.

If a path to a cached configuration is set, any change of the configuration via the REST API results in that the complete configuration of asset paths, channels and their schedules are written to a file at that path. On restart, an existing file at this path is used to restore the last dynamic configuration, while any static configuration of these settings is skipped.

4.4.6 - Licensing

Licensing for ew-vod2cbm

ew-vod2cbm requires a valid license file to operate. The license file must be obtained from AgileTV, and copied to /etc/edgeware/ew-vod2cbm/license.json.

See further details here.

4.5 - Monitoring and Logging

Health, service logs and monitoring

Health check

You can check the health of the server by making a request to /healthz, which should return a 200 OK response.

Monitoring

For monitoring, ew-vod2cbm generates Prometheus data available at /metrics. There are different metrics for the response times for segments for different media types. All bucket and counter names start with ew_, or more precisely:

ew_audio_segment_request_duration_milliseconds_bucket
ew_audio_segment_requests_total
ew_subs_segment_request_duration_milliseconds_bucket
ew_subs_segment_requests_total
ew_video_segment_request_duration_milliseconds_bucket
ew_video_segment_requests_total

Logging

To provide context to each log message, structured logging is used. Thus instead of free text log messages without any specific format, the log data is to some extent divided into fields of name-value pairs, making the logs more coherent and more suitable for processing by external tools.

Log messages related to a specific HTTP request include the log field named request_id which can be used to filter out specific requests.

The log field named topic is always present and is used to separate different areas of logging. The current topics are access, messages and error, and are used to log HTTP access, debug messages and panic stack traces, respectively.

As a comparison, the topics are similar to having separate files for access logging, debug messages and errors in a conventional file-based logging system.

Log formats

When run from the command line ew-vod2cbm can log in one of the formats consolepretty, consolejson or journald depending on the value of the -logformat parameter. Logging can be disabled by using the value discard.

$ ew-vod2cbm -upstream http://127.0.0.1 -logformat consolejson

consolepretty logs to standard output (stdout) in a human-readable format. Each log line starts with the date and the log message followed by the context- dependent log fields:

2022-02-07T11:54:42Z INF Incoming request bytes_out=27592 latency_ms=6.18251 method=GET ...

consolejson logs to stdout using a JSON object for each message:

{"level":"info","topic":"access","time":"2022-02-07T12:06:07Z","bytes_out":27592, ...}

When run as a systemd service, ew-vod2cbm logs directly to journald using the logjournald configuration parameter. When stored in journald, field names are upper case whereas the values keep their format. Some examples:

To see entries with the topic access:

$ journalctl -u ew-vod2cbm TOPIC=access -o verbose

To see entries with a specific request ID:

$ journalctl -u ew-vod2cbm REQUEST_ID="host/B1Po0eYz1d-000006" -o verbose

To see the call stack in the event of a crash:

$ journalctl -u ew-vod2cbm TOPIC=error -o verbose

Using the verbose output includes all available name-value fields. Without this only the log message is printed. The field named JSON contains the original structured log message as sent by the service. To filter out only this field --output-fields=JSON can be used, however this requires a systemd version of at least 236.

$ journalctl -u ew-vod2cbm --output-fields=JSON TOPIC=access

To continuously monitor the service:

$ journalctl -fu ew-vod2cbm

Log levels

At startup the log level is set to info. The log level can be changed by posting a form-field named level to the loglevel endpoint on the ew-vod2cbm server:

$ curl -F level=debug ew-vod2cbm-server:8090/loglevel

The available log levels and how they relate to systemd priority values is listed below:

Log level  Systemd priority
trace      7
debug      7
info       6
warn       4
error      3
fatal      2
panic      0

To e.g. see all error and warning messages using journalctl:

$ journalctl -u ew-vod2cbm PRIORITY=3 PRIORITY=4

Use a GET request to see the current log level:

$ curl ew-vod2cbm-server:8090/loglevel

Messages with higher level than the configured one will not be logged.

4.6 - how-to

How To Guides for ESB3019 service

4.6.1 - Looping channels

How to setup a looping channel

The simplest channel to set up is a looping channel.

Such a channel has a fixed schedule and the programs of that channel are presented over and over again and will never stop.

A looping channel can be setup via the REST API, but it can also be setup using a configuration file as examplified in the Startup configuration. Such channels have the doLoop attribute set, and will run until they are stopped. One can set the startTimeS parameter to tell when the first media should be “generated”, but there is no end time.

The default value startTime == 0 means that the channel will have segments with a time relative to the start of the UNIX epoch 1970-01-01T00:00:00Z.

4.6.2 - Dynamic Channels

How to setup a linear channel with dynamic schedule and update it

A flexible FAST channel has a schedule that is not fixed and looped, but has a limited window in the past and future. This can for example, be two hours back in time and 10 hours into the future.

To achieve such a “sliding window” of programs, the schedule needs to be updated by adding new entries and removing old ones. At the same time, the timeline needs to be continuous, and the generated DASH and HLS manifests must be consistent over time when it comes to discontinuities and period times.

A schedule update is done by posting a complete new schedule via the REST API to “/api/v1/schedule/{channel}”.

Removing old assets from the schedule

When removing old assets, it is important to keep a long enough window of old assets so that the sliding window for players is still available. This may be the last two hours or something similar.

To keep a consistent state when removing assets from the schedule, use the following two parameters:

  • GopNrAtScheduleStart - the GoP number at which the schedule starts
  • GopNrAfterLastAd - the GoP number right after the last ad before the schedule start

These should be updated like follows when one or more entries are dropped from the start of a schedule:

  • GopNrAtSchedulStart should increase by the number of GoPs dropped
  • GoPNrAfterLastAd should increase if an ad has been dropped

The source code in the Github repo edgeware/v2l-example-scheduler provides a simple example service that updates the schedule by adding and removing random entries and ads.

4.6.3 - Test Output

Test HLS and DASH output without a repackager

The ew-vod2cbm service is targeted to provide a live stream to the ESB3002 repackager, but for testing purposes it is also possible to get media output that can be played directly with media players.

The supported output formats are HLS and DASH. The media segments are in CMAF/fMP4 format with subtitles in stpp/imsc1 format.

Direct HLS streams

A channel ch can be reached as an HLS live asset using the URL

/ch/index.m3u8

The HLS playlist have SCTE-35 markers at the start and end of ad periods.

Direct DASH playback (new in v0.8)

A channel ch can be reached as a DASH live asset using the URL

/ch/manifest.mpd

The DASH format is the simple SegmentTemplate with $Number$ format and does currently (v0.8) not include any SCTE-35 markers.

View as combined VoD

It is also possible to view a channel as an VoD asset by adding an extra vod=1 query string to the URLs. This provides an HLS VoD playlist or DASH static MPD. In both cases each subtitle track is provided as a single big WebVTT file including all the subtitle cues.

Subtitle time track

To investigate timing and stitching of segments, it is possible to enable an extra generated subtitle track for all channels. This is done using the command line option -timesubs.

4.7 - API Reference

REST API for assets, channels and schedules

4.7.1 - Channel REST API v1

Reference for the channel schedule API

The following is a rendering of the OpenAPI for the channels and schedules of ESB3019 using swagger. This page does not have a backend server, so it cannot be run interactively.

However, an interactive Swagger API page is available directly at the ew-vod2cbm server at <server>/swagger/.

All API calls are relative to the base URL /api/v1/.

A new addition in release 1.2.0 is padding of assets. This is controlled via the boolean padLastGop parameters on channel and entry level, where the latter takes precedence over the former.

For more information about how to use this API, see the howto section.

4.7.2 - Old API references

Previous REST API Versions

4.7.2.1 - REST API v1 - release 1.0

Reference for the channel schedule API release 1.0

The following is a rendering of the OpenAPI for the channels and schedules of ESB3019 using swagger. This page does not have a backend server, so it cannot be run interactively.

However, an interactive Swagger API page is available directly at the ew-vod2cbm server at <server>/swagger/.

All API calls are relative to the base URL /api/v1/.

For more information about how to use this API, see the howto section.

4.7.2.2 - REST API v1 - release 1.2.0

Reference for the channel schedule API release 1.0

The following is a rendering of the OpenAPI for the channels and schedules of ESB3019 using swagger. This page does not have a backend server, so it cannot be run interactively.

However, an interactive Swagger API page is available directly at the ew-vod2cbm server at <server>/swagger/.

All API calls are relative to the base URL /api/v1/.

For more information about how to use this API, see the howto section.

4.7.2.3 - REST API v1 - release 0.10

Reference for the channel schedule API release 0.10.0

The following is a rendering of the OpenAPI for the channels and schedules of ESB3019 using swagger. This page does not have a backend server, so it cannot be run interactively.

However, an interactive Swagger API page is available directly at the ew-vod2cbm server at <server>/swagger/.

All API calls are relative to the base URL /api/v1/.

For more information about how to use this API, see the howto section.

4.7.2.4 - REST API v1 - release 0.8

Reference for the channel schedule API release 0.8.0

The following is a rendering of the OpenAPI for the channels and schedules of ESB3019 using swagger. This page does not have a backend server, so it cannot be run interactively.

However, an interactive Swagger API page is available directly at the ew-vod2cbm server at <server>/swagger/.

All API calls are relative to the base URL /api/v1/.

For more information about how to use this API, see the howto section.

4.8 - Credits

Third party libraries used in ew-vod2cbm and their licenses

License List

The table below lists the third party libraries used by this software and their respective license types.

LibraryLicenseChecked At
github.com/prometheus/common/internal/bitbucket.org/ww/goautonegBSD-3-Clause2022-03-18
github.com/go-openapi/jsonreferenceApache-2.02022-03-18
github.com/swaggo/swagMIT2022-03-18
github.com/go-playground/universal-translatorMIT2022-03-18
github.com/edgeware/mp4ff/mp4MIT2022-03-18
github.com/go-playground/validatorMIT2022-03-18
github.com/leodido/go-urnMIT2022-03-18
github.com/prometheus/commonApache-2.02022-03-18
github.com/zencoder/go-dash/v3Apache-2.02022-03-18
github.com/go-openapi/specApache-2.02022-03-18
gopkg.in/yaml.v2Apache-2.02022-03-18
github.com/swaggo/http-swaggerMIT2022-03-18
github.com/edgeware/mp4ff/bitsMIT2022-03-18
github.com/PuerkitoBio/purellBSD-3-Clause2022-03-18
github.com/josharian/internMIT2022-03-18
golang.org/x/textBSD-3-Clause2022-03-18
github.com/aws/aws-sdk-go/internal/sync/singleflightBSD-3-Clause2022-03-18
github.com/asticode/go-astikitMIT2022-03-18
github.com/cespare/xxhash/v2MIT2022-03-18
github.com/prometheus/procfsApache-2.02022-03-18
google.golang.org/protobufBSD-3-Clause2022-03-18
github.com/prometheus/client_model/goApache-2.02022-03-18
golang.org/x/toolsBSD-3-Clause2022-03-18
github.com/jmespath/go-jmespathApache-2.02022-03-18
github.com/prometheus/client_golang/prometheusApache-2.02022-03-18
github.com/go-openapi/swagApache-2.02022-03-18
github.com/go-chi/chi/v5MIT2022-03-18
github.com/rs/zerologMIT2022-03-18
github.com/matttproud/golang_protobuf_extensions/pbutilApache-2.02022-03-18
github.com/go-chi/docgenMIT2022-03-18
github.com/asticode/go-astisubMIT2022-03-18
github.com/PuerkitoBio/urlescBSD-3-Clause2022-03-18
github.com/swaggo/filesMIT2022-03-18
github.com/aws/aws-sdk-goApache-2.02022-03-18
github.com/golang/protobufBSD-3-Clause2022-03-18
golang.org/x/sysBSD-3-Clause2022-03-18
github.com/go-playground/localesMIT2022-03-18
github.com/go-openapi/jsonpointerApache-2.02022-03-18
github.com/coreos/go-systemd/v22/journalApache-2.02022-03-18
github.com/beorn7/perks/quantileMIT2022-03-18
github.com/edgeware/mp4ffMIT2022-03-18
golang.org/x/netBSD-3-Clause2022-03-18
github.com/asticode/go-astitsMIT2022-03-18
github.com/mailru/easyjsonMIT2022-03-18
github.com/Comcast/gotsMIT2022-03-18
github.com/KyleBanks/depthMIT2022-03-18

License Details

This section includes all the licenses/notices for each dependency verbatim

github.com/prometheus/common

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Common libraries shared by Prometheus Go components. Copyright 2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

github.com/swaggo/swag

license

MIT License

Copyright (c) 2017 Eason Lin

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/Comcast/gots

LICENSE

/* MIT License

Copyright 2016 Comcast Cable Communications Management, LLC

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */

NOTICE

Go Transport Stream Library Copyright 2016 Comcast Cable Communications Management, LLC This product includes software developed at Comcast (http://www.comcast.com/).

github.com/KyleBanks/depth

LICENSE

MIT License

Copyright (c) 2017 Kyle Banks

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/PuerkitoBio/urlesc

LICENSE

Copyright (c) 2012 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/asticode/go-astikit

LICENSE

MIT License

Copyright (c) 2020 Quentin Renard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/beorn7/perks/quantile

LICENSE

Copyright (C) 2013 Blake Mizerany

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/matttproud/golang_protobuf_extensions/pbutil

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "{}"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright {yyyy} {name of copyright owner}

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Copyright 2012 Matt T. Proud (matt.proud@gmail.com)

github.com/go-chi/chi/v5

LICENSE

Copyright (c) 2015-present Peter Kieltyka (https://github.com/pkieltyka), Google Inc.

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-chi/docgen

LICENSE

Copyright (c) 2016-Present https://github.com/go-chi authors

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/josharian/intern

license

MIT License

Copyright (c) 2019 Josh Bleecher Snyder

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/prometheus/client_model/go

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Data model artifacts for Prometheus. Copyright 2012-2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

github.com/prometheus/procfs

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

procfs provides functions to retrieve system, kernel and process metrics from the pseudo-filesystem proc.

Copyright 2014-2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

gopkg.in/yaml.v2

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "{}"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright {yyyy} {name of copyright owner}

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Copyright 2011-2016 Canonical Ltd.

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/asticode/go-astits

LICENSE

MIT License

Copyright (c) 2017 Quentin Renard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-openapi/jsonreference

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-openapi/swag

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-playground/validator

LICENSE

The MIT License (MIT)

Copyright (c) 2015 Dean Karn

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/golang/protobuf

LICENSE

Copyright 2010 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright

notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/text

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/asticode/go-astisub

LICENSE

MIT License

Copyright (c) 2016 Quentin Renard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/cespare/xxhash/v2

LICENSE

Copyright (c) 2016 Caleb Spare

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/zencoder/go-dash/v3

LICENSE

Copyright Brightcove, Inc.

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

golang.org/x/tools

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/aws/aws-sdk-go

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

AWS SDK for Go Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. Copyright 2014-2015 Stripe, Inc.

github.com/coreos/go-systemd/v22/journal

LICENSE

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  1. Grant of Copyright License.

Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  1. Grant of Patent License.

Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  1. Redistribution.

You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

You must give any other recipients of the Work or Derivative Works a copy of this License; and You must cause any modified files to carry prominent notices stating that You changed the files; and You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  1. Submission of Contributions.

Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  1. Trademarks.

This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  1. Disclaimer of Warranty.

Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  1. Limitation of Liability.

In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  1. Accepting Warranty or Additional Liability.

While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets “[]” replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

CoreOS Project Copyright 2018 CoreOS, Inc

This product includes software developed at CoreOS, Inc. (http://www.coreos.com/).

github.com/mailru/easyjson

LICENSE

Copyright (c) 2016 Mail.Ru Group

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/rs/zerolog

LICENSE

MIT License

Copyright (c) 2017 Olivier Poitrey

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

google.golang.org/protobuf

LICENSE

Copyright (c) 2018 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/sys

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/PuerkitoBio/purell

LICENSE

Copyright (c) 2012, Martin Angers All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

  • Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/edgeware/mp4ff/bits

LICENSE

Copyright

Copyright (c) 2019-2020 Edgeware AB.

Some code in this directory comes from or is based on https://github.com/tcnksm/go-casper/tree/master/internal/bits Copyright (c) 2017 Taichi Nakashima.

All code has the same MIT License.

License

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-playground/universal-translator

LICENSE

The MIT License (MIT)

Copyright (c) 2016 Go Playground

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/leodido/go-urn

LICENSE

MIT License

Copyright (c) 2018 Leonardo Di Donato

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/prometheus/client_golang/prometheus

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Prometheus instrumentation library for Go applications Copyright 2012-2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

The following components are included in this product:

perks - a fork of https://github.com/bmizerany/perks https://github.com/beorn7/perks Copyright 2013-2015 Blake Mizerany, Björn Rabenstein See https://github.com/beorn7/perks/blob/master/README.md for license details.

Go support for Protocol Buffers - Google’s data interchange format http://github.com/golang/protobuf/ Copyright 2010 The Go Authors See source code for license details.

Support for streaming Protocol Buffer messages for the Go language (golang). https://github.com/matttproud/golang_protobuf_extensions Copyright 2013 Matt T. Proud Licensed under the Apache License, Version 2.0

github.com/swaggo/files

LICENSE

MIT License

Copyright (c) 2019 Swaggo

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/aws/aws-sdk-go/internal/sync/singleflight

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/edgeware/mp4ff

LICENSE

MIT License

Copyright (c) 2019-2020 Edgeware

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-openapi/jsonpointer

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/jmespath/go-jmespath

LICENSE

Copyright 2015 James Saryerwinnie

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/swaggo/http-swagger

LICENSE

MIT License

Copyright (c) 2018 Swaggo

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/edgeware/mp4ff/mp4

LICENSE

Copyright

Most code is Copyright (c) 2019-2020 Edgeware AB.

Some code in this directory comes from or is based on https://github.com/jfbus/mp4 which has Copyright (c) 2015 Jean-François Bustarret.

All code has the same MIT License.

License

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-openapi/spec

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-playground/locales

LICENSE

The MIT License (MIT)

Copyright (c) 2016 Go Playground

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg

README

PACKAGE

package goautoneg import “bitbucket.org/ww/goautoneg”

HTTP Content-Type Autonegotiation.

The functions in this package implement the behaviour specified in http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Copyright (c) 2011, Open Knowledge Foundation Ltd. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.

Neither the name of the Open Knowledge Foundation Ltd. nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior written
permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

FUNCTIONS

func Negotiate(header string, alternatives []string) (content_type string) Negotiate the most appropriate content_type given the accept header and a list of alternatives.

func ParseAccept(header string) (accept []Accept) Parse an Accept Header string returning a sorted list of clauses

TYPES

type Accept struct { Type, SubType string Q float32 Params map[string]string } Structure to represent a clause in an HTTP Accept Header

SUBDIRECTORIES

.hg

golang.org/x/net

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

4.9 - Releases

ESB3019 - ew-vod2cbm releases

4.9.1 - Release 1.6.0

Product release

Change log

  • NEW: API for refreshing updated assets [ESB3019-205]
  • NEW: Timestamp format is accepted in Double and Open Ended requests. dateformat YYYYmmddTHHMMSSZ now accepted as start and stoptime (similar to ESB3002) [ESB3019-214]
  • FIXED: Errors in ew-vod2cbm service when adding lots of assets. Fix of asset cache handling for case with many removed assets [ESB3019-170]
  • FIXED: HLS master playlist is empty for video only content [ESB3019-171]
  • FIXED: AVC subtype is not accepted. If content template has H264 as subtype for the same track, and vice versa [ESB3019-174]
  • FIXED: Open-Ended and Double-Ended requests don’t work as expected [ESB3019-175]
  • FIXED: ew-verify-asset is missing from ew-vod2cbm installer [ESB3019-179]
  • FIXED: –gop-dur-ms argument in ew-content-template-tool is mandatory while it shouldn’t be [ESB3019-184]
  • FIXED: Cannot access swagger for API specification [ESB3019-186]
  • FIXED: Starting point of channel is incorrect after removing assets [ESB3019-190]
  • FIXED: Incorrect SCTE35 signaling. Field out_of_network_indicator in CUE-IN is 1 while it should be 0 [ESB3019-193]
  • FIXED: Conflict error is always returned when updating schedule via PUT method [ESB3019-194]
  • FIXED: Invalid data is accepted to create channels [ESB3019-208]
  • FIXED: Some fields in DASH manifest are not compliant with ESB3002 [ESB3019-209]

Release information

  • Date: 2024-05-29
  • Type: Product improvements

4.9.2 - Release 1.4.0

Product release
  • Optional persistent cache of dynamic schedule and asset path configurations
  • Content verification tool, for checking asset compatibility against content templates
  • Improved handling of non-constant GoP duration

Release information

  • Date: 2023-04-06
  • Type: Product improvements

4.9.3 - Release 1.2.0

Product release
  • The last GoP of an asset can now be padded to same length as the others
  • Now supporting offline, as well as, online licensing
  • Improved error messages for online licensing
  • Support autofill of scteEventID [using Gop number] when configured to -1
  • Fixed timestamp wrap-around

Release information

  • Date: 2022-10-18
  • Type: Product improvements

4.9.4 - Release 1.0.0

Product release
  • New: Support for shorter compatible GoP durations

  • New: Added utility for creating content templates: ew-content-template-tool

  • New: The binary does not expire, it now requires a valid license to run

  • New: Support for AC-3/EC-3

  • New: Metrics for requested content

  • New: Improved GoP duration detection

  • New: Graceful service shutdown (handle outstanding requests)

  • Fix: EPG-offset for non-looping channels

  • Fix: Various scheduling bugs

Release information

  • Date: 2022-05-17
  • Type: First product release

4.9.5 - Release 0.10.0

New features
  • Track matching to allow for more flexibility when adding assets to a channel schedule.
  • New contentTemplatePath parameter in channel configuration for specifying compatible assets. This is intended to replace and improve on masterAssetID.
  • New parameters to fine tune track matching via bitrate:
    • max_bitrate and min_bitrate specified on a track level
    • maxBitratePercentAbove and maxBitratePercentBelow specified on channel level
    • max_bitrate and min_bitrate parameters in content template level and/or global level
    • global parameters for setting bitrate interval
  • Global parameters can be set either as command line parameters or as environment variables
  • New parameters to set maximal live window
  • Remove defaultGopDurMS parameter and auto-detect GoP duration instead
  • Automatic extraction of GoP duration from assets to allow for matching
  • Support for HEVC video
  • Support for DASH OnDemand assets without conversion to ESF format
  • New structured logging and better integration with journald
  • Assets with a missing subtitle track are allowed. An empty track will be generated automatically
  • Assets with mismatch in audio language are allowed. Another language audio track is used instead
  • Audio only support both via CBM interface and for direct HLS/DASH output

See Upgrade for information about how to upgrade

Release information

  • Date: 2022-03-17
  • Type: Beta for evaluation and testing

4.9.6 - Release 0.8.1

Bug fix release
  • Fix: handle assets where subtitle tracks have no cues (ESB3019-80)
  • Fix: report configuration errors with proper JSON names (SUPPORT-10099, ESB3019-81)

See Upgrade for information about how to upgrade.

Release information

  • Date: 2022-01-07
  • Type: Beta bug fix for testing

4.9.7 - Release 0.8.0

GoP-based stitching and REST API
  • Segmentation based on GoPs instead of full segments
  • REST API for dynamic change of channels and schedules
  • Prometheus and health monitoring
  • DASH output for testing
  • Special live-time subtitle output for demo

See Upgrade for information about how to upgrade

Release information

  • Date: 2021-12-22
  • Type: Beta for testing

4.9.8 - Release 0.6.1

Bug-fix release

Bug fix: too small duration in SCTE-35 marker

Release information

  • Date: 2021-06-01
  • Type: Alpha bugfix for testing

4.9.9 - Release 0.6.0

First release of ew-vod2cbm.

Early release for generating live test content with SCTE-35 markers from recordings or other sources with fixed segment durations.

Output segments are generated by combining N segments, with variations of +/-N at an ad boundary.

Release information

  • Date: 2021-05-30
  • Type: Alpha for testing

5 - Manifest Manipulation (esb3020)

Lightweight service for manipulating HLS and DASH manifests

5.1 - Introduction

Introduction to ew-manip

The service ew-manip is a stateless manifest/playlist manipulator for DASH and HLS. In the following, we use the term manifest to denote either a DASH manifest or an HLS playlist.

ew-manip is meant to be integrated with the nginx front of ew-repackager (ESB3002) and can change DASH and HLS manifests depending on query parameters in the URL.

The manipulations are triggered by a special query ewm=1 which must be at the start of the query string, and will then do different manipulations depending on options in the rest of the query.

The two modifications implemented this far are insertion of pre-roll assets in VoD manifests and change of HLS target duration for “live-like” HLS manifests coming from a live channel.

5.2 - Installation

Installation and service operation

The ew-manip service is distributed as a CentOS / Red Hat RPM and is available as ew-manip.service when installed. It works both on RH 7 and 8 and compatible distributions.

To install version x.y.z, the yum command can be used as follows:

yum install ./ew-manip-x.y.z-1.el8.x86_64.rpm

The service can be controlled with the standard systemctl commands:

systemctl start ew-manip.service
systemctl stop ew-manip.service
systemctl status ew-manip.service

To uninstall version x.y.z using the yum command, do:

yum remove ew-manip-x.y.z-1.el8.x86_64

When uninstalling or upgrading it is recommended to first stop the service.

5.2.1 - Upgrades

Upgrade of ew-manip

Upgrade to v0.10.x from v.0.8.x

The nginx configuration file ew-repackager-custom.conf should no longer contain the ew-manip specific location. In regards to ew-manip, it should rather only contain an include to a newly installed file /etc/edgeware/ew-manip/ew-manip-nginx.conf. A more detailed description regarding what should be in the /etc/ew-repackager/ew-repackager-custom.conf file can be found here. The reason for this change is so we can make ew-manip specific nginx changes in the future without having users modifying an nginx file.

5.3 - Configuration

Configuring ew-manip and the Repackager

Configuring ew-manip

The ew-manip global service parameters can be specified in the following ways:

  1. On the command line
  2. As environment variables
  3. Default values This also shows the order of precedence, where values on the command line, will override all other values.

The repackager is normally running as an HTTP server on port 80. The ew-manip service would typically run on the same host with the default port 8094. The port can be changed in the service file at: /usr/lib/systemd/system/ew-manip.service key: ExecStart

If the repackager is not running on port 80, or on a different host from ew-manip, then this should be specified on the same line in the service file by adding: -u <repackager-hostname:port>

In the resulting combined manifest, the pre-roll content URL will point to another asset, and its URL needs to be an absolute URL. This does not have to be configured since the full absolute URL must be sent in the query string.

Repackager configuration (nginx routing)

The nginx routing must be manually configured in the repackager. To do that, add the following include entry to the nginx config file at: /etc/ew-repackager/ew-repackager-custom.conf

include /etc/edgeware/ew-manip/ew-manip-nginx.conf;

This will make requests with URLs ending with .m3u8 or .mpd containing the string ewm= at the start of the query string to be forwarded to the ew-manip server at http://localhost:8094.

5.3.1 - Licensing

Licensing credentials for ew-manip

ew-manip requires a valid license to operate. Some endpoints are accessible without a valid license, but endpoints retrieving a manipulated playlist/manifest are protected.

Requirements

  • An internet connection on the machine running ew-manip
  • A valid license reference provided by AgileTV

Using the license reference

The license reference along with the product name must be stored in: /etc/edgeware/ew-manip/license.json. For example:

{
    "license_ref": "this_is_an_example_license_ref",
    "product_name": "ew-manip"
}

License validation

There will be an initial and then a periodic license check every 24 hours towards a license server once the service has started. The service will initiate a grace period if, and only if, the license server cannot be reached or the license server reports an internal error. The grace period will last for 2 hours if this is the license validation made during startup, and 7 days if this was a license validation that was made after a successful validation during startup (for internal license server errors, the grace period will always be 2 hours).

If an unsuccessful validation occurs, ew-manip will do the verification more often. This starts with one minute after the first fail, two minutes after the second, doubling every time it fails. It will do so until it reaches 1024 minutes (~17 hours), and then do the verification every 1024 minutes. If the license reference is successfully verified again, it will return to verifying the reference every 24 hours.

In case license.json is changed, the ew-manip service must be restarted in order to update server data.

License information

There are mainly two ways of finding information regarding the license status in the ew-manip service, the logging, and an HTTP endpoint.

Logging

All license related logging has the topic logging. Filtered logs with regard to topic is described in Monitoring & Logging.

HTTP

The /licensing endpoint of the ew-manip service provides some information regarding the licensing status. Currently, the information provided includes:

  • A timestamp for when the last license validity verification occurred
  • Timestamp for when the next license validity verification will occur
  • Whether the current license reference is considered valid or not. If this is false, and there is no active grace period, requests to the protected endpoints will fail
  • If the license is valid, this endpoint will also show the expiry date of the license
  • If currently in a grace period, or the grace period has ended, a timestamp of when the grace period end is provided

5.4 - Monitoring and Logging

Health, service logs and monitoring

Health check

You can check the health of the server by making a request to /healthz, which should return a 200 OK response.

Monitoring

For monitoring, ew-manip generates Prometheus data available at /metrics. There are different metrics for the response times for segments for different media types. All bucket and counter names start with ew_, or more precisely:

ew_hls_requests_total
ew_hls_request_duration_milliseconds
ew_dash_requests_total
ew_dash_request_duration_milliseconds

Logging

To provide context to each log message, structured logging is used. Thus instead of free text log messages without any specific format, the log data is to some extent divided into fields of name-value pairs, making the logs more coherent and more suitable for processing by external tools.

Log messages related to a specific HTTP request include the log field named request_id which can be used to filter out specific requests.

The log field named topic is always present and is used to separate different areas of logging. The current topics are access, messages and error, and are used to log HTTP access, debug messages and panic stack traces, respectively.

As a comparison, the topics are similar to having separate files for access logging, debug messages and errors in a conventional file-based logging system.

Log formats

When run from the command line ew-manip can log in one of the formats consolepretty, consolejson or journald depending on the value of the -logformat parameter. Logging can be disabled by using the value discard.

$ ew-manip -logformat consolejson

consolepretty logs to standard output (stdout) in a human-readable format. Each log line starts with the date and the log message followed by the context- dependent log fields:

2022-02-07T11:54:42Z INF Incoming request bytes_out=27592 latency_ms=6.18251 method=GET ...

consolejson logs to stdout using a JSON object for each message:

{"level":"info","topic":"access","time":"2022-02-07T12:06:07Z","bytes_out":27592, ...}

When run as a systemd service, ew-manip logs directly to journald using the logjournald configuration parameter. When stored in journald, field names are upper case whereas the values keep their format. Some examples:

To see entries with the topic access:

$ journalctl -u ew-manip TOPIC=access -o verbose

To see entries with a specific request ID:

$ journalctl -u ew-manip REQUEST_ID="host/B1Po0eYz1d-000006" -o verbose

To see the call stack in the event of a crash:

$ journalctl -u ew-manip TOPIC=error -o verbose

Using the verbose output includes all available name-value fields. Without this only the log message is printed. The field named JSON contains the original structured log message as sent by the service. To filter out only this field --output-fields=JSON can be used, however this requires a systemd version of at least 236.

$ journalctl -u ew-manip --output-fields=JSON TOPIC=access

To continuously monitor the service:

$ journalctl -fu ew-manip

Log levels

At startup the log level is set to info. The log level can be changed at run time by posting a form-field named level to the loglevel endpoint on the ew-manip server:

$ curl -F level=debug ew-manip-server:8094/loglevel

The available log levels and how they relate to systemd priority values is listed below:

Log level  Systemd priority
trace      7
debug      7
info       6
warn       4
error      3
fatal      2
panic      0

To e.g. see all error and warning messages using journalctl:

$ journalctl -u ew-manip PRIORITY=3 PRIORITY=4

Use a GET request to see the current log level:

$ curl ew-manip-server:8094/loglevel

Messages with higher level than the configured one will not be logged.

5.5 - How-to guides

This section describes the supported use-cases and functionality

5.5.1 - Pre-rolls

Inserting pre-roll assets

The specific query-string trigger is a general escape query part ewm=1 which will make nginx forward the request to the ew-manip server. Pre-rolls assets are then added in VoD with the query parameter pre=<URL>. The <URL> must be the absolute public URL that the client uses to fetch the preroll video, since this URL will be inserted in the combined manifest delivered to the client.

A complete request, to combine preroll-bumper with program could look like this:

http://repack-host/__cl/s:vod/__c/program/__op/default/__f/index.m3u8?ewm=1&pre=https://public-repack-host/__cl/s:vod/__c/preroll-bumper/__op/default/__f/index.m3u8

Multiple pre= query parts can be added to combine more than two manifests. The service will then fetch all the manifests from the repackager and combine them into the appropriate manifest with multiple periods for DASH or multiple parts separated by discontinuities for HLS.

DASH manifest URLs look similar but must have the file extension .mpd. HLS playlist must have the file extension .m3u8.

Limitations

DASH and HLS URLs cannot be combined with each other. For DASH, any assets can be combined, but for the best user experience it is reasonable to apply similar critera as for HLS. For HLS the following criteria must be met:

HLS Playlist Matching Criteria

In brief, the main and all the pre-roll master playlist(s) must match each other.

In detail, this means that:

  • For Renditions identified by #EXT-X-MEDIA: For each rendition in the main playlist, there must be exactly one corresponding rendition in each pre-roll playlist, and the following attributes (when present) must match exactly: TYPE, and LANGUAGE. Unmatched renditions in the pre-rolls will be discarded.

    • When matching renditions, in addition to the criteria mentioned above, ew-manip will match a rendition in the main playlist with the closest bitrate (without duplicate matching)
  • For Variant streams identified by #EXT-X-STREAM-INF: For each variant stream in the main playlist, there must be exactly one corresponding variant stream in each pre-roll playlist, and the following attributes (when present) must match exactly: RESOLUTION, FRAME-RATE, CODECS, AUDIO, VIDEO and SUBTITLES. Unmatched variant streams in the pre-rolls will be discarded.

  • For I-frame playlists identified by #EXT-X-I-FRAME-STREAM-INF: For each I-frame playlist in the main master playlist, there must be exactly one corresponding I-frame playlist in each pre-roll master playlist, and the following attributes (when present) must match exactly: RESOLUTION and CODECS. Unmatched I-frame playlists in the pre-rolls will be discarded.

Playlist requests where the main and pre-roll master playlists do not meet all of the above criteria, will fail with an HTTP 400 error.

HLS Stream and Playlist Matching by Bandwidth

Typically there will be several variant streams that meet these criteria and only differ in BANDWIDTH. Within such matching groups (for example streams with the same resolution) the main and pre-roll streams are paired together by being sorted by bandwidth in decreasing order. The same pairing method is used for I-frame playlists.

5.5.2 - HLS Target Duration

Set HLS live target duration

A common issue when playing live HLS is the value of target duration (EXT-X-TARGETDURATION). The target duration is an integral number of seconds that correspond to the longest segment in the stream. Depending on HLS version, this value must either be higher than the longest duration, or can be rounded to the closest integer, but many players desire a lower value in order to work best. This is due to that the target-duration value influences how often the client can ask for a playlist update.

Because live ingest node (ESB3003) generates segments with a precise average segment duration, adjusted segmentation boundaries due to SCTE-35 ad markers number may result in a single segment duration being 1.5 times the average duration. These singular values then effect the target-duration to become high.

To be able to fine-tune the target duration, the ew-manip service has an option to change the #EXT-X-TARGET-DURATON value by using the special query-string trigger target-duration= once ew-manip has been triggered with the general ewm=1 trigger.

An example of a request that includes the target-duration=5 query parameter to set #EXT-X-TARGET-DURATON to 5seconds could look like this:

http://repack-host/__cl/cg:live/__c/program/__op/default/__f/index.m3u8?ewm=1&target-duration=5

This will only apply to “live-like” playlists from the repackager. With “live-like” playlists, we mean playlists which come from a live channel including an interval in the past. Such playlists can be detected by searching for the part __cl/cg: in the URL that indicates that the URL is part of a live channel group. Media playlists with the stopTime in the past are technically VoD playlists, but since there is a transition from EVENT to VOD type of playlist as the stopTime is passed, they should be treated as live playlists.

For pure VoD assets, the target-duration can simply be calculated from the longest segment in the playlist, and there is in general no limit on how fast the segments can be requested, so there is no need for target duration modifications.

5.6 - Releases

ESB3020 - ew-manip releases

5.6.1 - Release 1.0.1

Product release of ew-manip

New:

  • Licensing now incorporates a grace period in case of certain error cases described in Licensing
  • The ew-manip service now gracefully exits when the service is stopped

Release information

  • Date: 2022-05-19
  • Type: Product release

5.6.2 - Release 1.0.0

First product release of ew-manip

Fixes:

  • Solved a problem where the output DASH manifest was invalid if any pre-roll had DRM while the main asset had no DRM

New:

  • Manipulating manifests/playlists requires a valid license
  • Product binary has no expiry date

Release information

  • Date: 2022-05-05
  • Type: Product release

5.6.3 - Release 0.10.0

Beta release of ew-manip

Fixes:

  • Setting the target duration via the master playlists was not working properly
  • HLS playlist matching has been fixed for certain subtitle use cases
  • The transition from an encrypted preroll to an unencrypted asset is now signaled correctly in the HLS output

New:

  • HLS alternative rendition’s GROUP-ID does not have to be identical for matching anymore
  • Changed the way the nginx configuration is handled. See Upgrades

Release information

  • Date: 2022-04-19
  • Type: Beta for testing

5.6.4 - Release 0.8.1

Alpha release of ew-manip

Fixes:

  • Failing HLS media playlist matching with different leaf pathnames has been fixed

Release information

  • Date: 2022-02-16
  • Type: Alpha for testing

5.6.5 - Release 0.8.0

Second alpha release of ew-manip

Features:

  • Improved DASH manifest handling
  • Logging backend has been changed. The logging is now structured and is logged to journald
  • Improved HLS variant stream and alternative rendition matching. The names of the variants and the alternatives do not have to be identical anymore.
  • Prometheus counters for keeping track of number of requests received for HLS and DASH respectively

Fixes:

  • File descriptor leak has been resolved
  • For the EXT-X-MEDIA tag, the CHANNELS attribute is now preserved

Release information

  • Date: 2022-02-14
  • Type: Alpha for testing

5.6.6 - Release 0.6.0

Initial alpha release of ew-manip

Features:

  • Add pre-roll videos to DASH and HLS assets
  • Change HLS target-duration for live manifests

Release information

  • Date: 2022-01-12
  • Type: Alpha for testing

5.7 - Credits

Third party libraries used in ew-manip and their licenses

License List

The table below lists the third party libraries used by this software and their respective license types.

LibraryLicenseChecked At
github.com/prometheus/procfsApache-2.02022-03-10
github.com/cespare/xxhash/v2MIT2022-03-10
github.com/matttproud/golang_protobuf_extensions/pbutilApache-2.02022-03-10
github.com/sirupsen/logrusMIT2022-03-10
github.com/prometheus/common/internal/bitbucket.org/ww/goautonegBSD-3-Clause2022-03-10
github.com/prometheus/commonApache-2.02022-03-10
github.com/prometheus/client_model/goApache-2.02022-03-10
github.com/edgeware/m3u8BSD-3-Clause2022-03-10
github.com/rs/zerologMIT2022-03-10
google.golang.org/protobufBSD-3-Clause2022-03-10
github.com/zencoder/go-dash/v3Apache-2.02022-03-10
github.com/coreos/go-systemd/v22/journalApache-2.02022-03-10
github.com/go-chi/chi/v5MIT2022-03-10
github.com/prometheus/client_golang/prometheusApache-2.02022-03-10
github.com/beorn7/perks/quantileMIT2022-03-10
github.com/golang/protobufBSD-3-Clause2022-03-10
golang.org/x/sysBSD-3-Clause2022-03-10

License Details

This section includes all the licenses/notices for each dependency verbatim

github.com/prometheus/client_golang/prometheus

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Prometheus instrumentation library for Go applications Copyright 2012-2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

The following components are included in this product:

perks - a fork of https://github.com/bmizerany/perks https://github.com/beorn7/perks Copyright 2013-2015 Blake Mizerany, Björn Rabenstein See https://github.com/beorn7/perks/blob/master/README.md for license details.

Go support for Protocol Buffers - Google’s data interchange format http://github.com/golang/protobuf/ Copyright 2010 The Go Authors See source code for license details.

Support for streaming Protocol Buffer messages for the Go language (golang). https://github.com/matttproud/golang_protobuf_extensions Copyright 2013 Matt T. Proud Licensed under the Apache License, Version 2.0

github.com/zencoder/go-dash/v3

LICENSE

Copyright Brightcove, Inc.

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/beorn7/perks/quantile

LICENSE

Copyright (C) 2013 Blake Mizerany

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/prometheus/common

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Common libraries shared by Prometheus Go components. Copyright 2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg

README

PACKAGE

package goautoneg import “bitbucket.org/ww/goautoneg”

HTTP Content-Type Autonegotiation.

The functions in this package implement the behaviour specified in http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Copyright (c) 2011, Open Knowledge Foundation Ltd. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.

Neither the name of the Open Knowledge Foundation Ltd. nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior written
permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

FUNCTIONS

func Negotiate(header string, alternatives []string) (content_type string) Negotiate the most appropriate content_type given the accept header and a list of alternatives.

func ParseAccept(header string) (accept []Accept) Parse an Accept Header string returning a sorted list of clauses

TYPES

type Accept struct { Type, SubType string Q float32 Params map[string]string } Structure to represent a clause in an HTTP Accept Header

SUBDIRECTORIES

.hg

google.golang.org/protobuf

LICENSE

Copyright (c) 2018 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/matttproud/golang_protobuf_extensions/pbutil

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "{}"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright {yyyy} {name of copyright owner}

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Copyright 2012 Matt T. Proud (matt.proud@gmail.com)

github.com/golang/protobuf

LICENSE

Copyright 2010 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright

notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/rs/zerolog

LICENSE

MIT License

Copyright (c) 2017 Olivier Poitrey

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

golang.org/x/sys

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/edgeware/m3u8

LICENSE

Copyright (c) 2013-2016 Alexander I.Grafov grafov@gmail.com Copyright (c) 2013-2016 The Project Developers.

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/coreos/go-systemd/v22/journal

LICENSE

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  1. Grant of Copyright License.

Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  1. Grant of Patent License.

Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  1. Redistribution.

You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

You must give any other recipients of the Work or Derivative Works a copy of this License; and You must cause any modified files to carry prominent notices stating that You changed the files; and You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  1. Submission of Contributions.

Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  1. Trademarks.

This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  1. Disclaimer of Warranty.

Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  1. Limitation of Liability.

In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  1. Accepting Warranty or Additional Liability.

While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets “[]” replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

CoreOS Project Copyright 2018 CoreOS, Inc

This product includes software developed at CoreOS, Inc. (http://www.coreos.com/).

github.com/go-chi/chi/v5

LICENSE

Copyright (c) 2015-present Peter Kieltyka (https://github.com/pkieltyka), Google Inc.

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/prometheus/client_model/go

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Data model artifacts for Prometheus. Copyright 2012-2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

github.com/prometheus/procfs

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

procfs provides functions to retrieve system, kernel and process metrics from the pseudo-filesystem proc.

Copyright 2014-2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

github.com/sirupsen/logrus

LICENSE

The MIT License (MIT)

Copyright (c) 2014 Simon Eskildsen

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/cespare/xxhash/v2

LICENSE

Copyright (c) 2016 Caleb Spare

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

6 - VoD Ingest (esb3021)

Ingest VoD assets into ESF and DASH OnDemand format

6.1 - Introduction

Introduction to ew-vodingest

The ew-vodingest command may be used to perform either VoD ingest or to perform live recordings from an ew-live-ingest (esb3003) circular buffer.

VoD ingest

ew-vodingest (ESB3021) reads and ingests an MP4/ts audio and video + subtitles asset defined by a SMIL file into an ESF (Edgeware Storage Format) asset in a way that is compatible with the DASH OnDemand profile. A corresponding DASH MPD file is generated. The SMIL-file syntax and usage is explained in the SMIL section.

It is also possible to specify a .ts-file, an .mp4-file or a directory-path as input.

For example:

ew-vodingest --input hitchcock/vertigo/index.smil --output esf/vertigo

Note: A main focus of this tool is to ingest VoD content that can be used to generate live content by combining VoD assets using ESB3019 ew-vod2cbm. There is therefore a restriction on the ingested content that it must be possible to discover a common constant GoP duration (sync-frame distance) for all video tracks, and that all sample durations are exactly the same in their respective timescales. The timescales may differ, but only by integer factors, for example 50 for 50Hz video and 25 for 25Hz video.

Codec and input format

Please refer to Supported codecs to get more information.

Input locations

This tables shows the possible combinations of input types and locations:

filesystemhttp/httpsS3FTP
directoryyesnoyesyes
SMILyesyesyesyes
MP4yesnonono
tsyesnonono
DASH On-Demandyesyesyesyes
HLSyesyesyesyes
Unencrypted ISM/MSSyesyesyesyes

For ingesting large assets (or for slow locations) the --maxtime command-line parameter can be used to increase the timeout threshold.

Output locations

Output locations can always be local filesystem, or network locations, as above. By default the content_id in content_info.json of the output asset will equal the output directory. This can be overridden by specifying any other ID with the --content-id command-line parameter.

Temporary storage

The temporary storage, specified by --local-storage, is used to store the input files from NAS (HTTP, FTP, S3, etc) VOD to reduce overhead, and output files of recording, VOD before uploading to reduce the stress on remote file system.

For those reasons, it is recommended to set it to local filesystem on SSD. The default value is /tmp, which is a RAM disk, best for speed, but has limited capacity.

Live recordings

The input for live recordings is an ew-live-ingest (esb3003) with a circular buffer available on the instance specified by --host and --port (default localhost:8090). The output locations are the same as for VoD ingest above.

The --cbm flag triggers a live recording (and cannot be combined with --i). The start/stop times are specified in epoch seconds, and must be in the past. The recording will consist of integral segments, matching the specified time range as closely as possible. The time-stamps in the resulting VoD will be shifted to start from zero. Any “holes” in the specified intervals will be removed, thus resulting in a recording shorter than the specified interval.

SCTE-35 markers are transferred from the CBM interval and stored in a separate file.

For example:

ew-vodingest --cbm --start-epoch 1678190071 --stop-epoch 1678190099 --channel tv1 -o tv1-mar-7-2023

Note: Recording from end-of-life VCP Origin is not supported by ew-vodingest.

Usage

ew-vodingest is a command-line tool that is run as:

ew-vodingest [options]
Run as ew-vodingest [options]

  -i, --input string               SMIL file, dir or file pattern defining the asset (mandatory). Can't be used with --cbm.
  -o, --output string              output directory (mandatory)
  -w, --minseg int                 minimum output segment duration (milliseconds) (default 4000)
  -y, --maxseg int                 maximum output segment duration (milliseconds) (default 12000)
      --cbm                        set to use esf export from cbm. Can't be used with --input.
      --start-epoch uint           recording start time given in epoch seconds. Only works with --cbm
      --stop-epoch uint            recording stop time given in epoch seconds. Only works with --cbm
      --channel string             channel name to record from. Only works with --cbm
      --drop-non-aligned-track     drop track with abnormal segment duration. Only works with --cbm
  -c, --content-id string          explicit content-id (instead of ingest path)
  -m, --maxtime int                maximal execution time to ingest asset (seconds) (default 1800)
      --hls                        output HLS playlists (experimental)
      --slim                       only output content_info and dat files
      --leavepartial               leave partial ingested content and collect errorneous input files (if any) on failure
      --s3file string              path to S3 credentials file
  -t, --template string            path to content template file, for asset comapatibility verification
      --licensefile string         license file path (default "/etc/edgeware/ew-vodingest/license.json")
  -l, --logfile string             log file [default stdout]. In case of recording failure, the relevant files are collected to same folder as log file.
      --log-file string            see above
      --logformat string           format and type of log: [consolejson consolepretty discard] (default "consolepretty")
      --loglevel string            initial log level (default "info")
  -v, --version                    print version and date
      --host string                cbm host to connect to. Only works with --cbm (default "localhost")
      --port uint16                cbm port to connect to. Only works with --cbm (default 8090)
      --source-rate-limit uint32   maximum read rate in Mbps from source. Only works with --cbm. Setting 0 will disable source rate limiting
      --local-storage string       Destination for storing input temporarily when ingesting from HTTP(s), S3 or FTP. Also store output temporarily when uploading to S3 or FTP. If empty, use '/tmp'. When being used with --cbm, it is used for storing the recorded content from CBM before uploading.
      --thumbnails                 enable thumbnail generating, requires command 'ffmpeg' to work
      --thumbnails-sizes string    comma separated list of thumbnail sizes width[xheight],...If only widths are provided, the height will be calculated to keep aspect ratio, nothing provided, auto generate a thumbnails with 240 as width
      --help                       extended tool help

The following options -i, -o, -w, -y, --cbm, --start-epoch, --stop-epoch, --channel, -l, --source-rate-limit are the same as for the ESB3005 ew-recorder.

To enable DASH thumbnails generation, add flag --thumbnails. About --thumbnails-sizes, it acts like --sizes in ew-thumbnails-generator tool, please refer to Tools for more information. These options are available from version 1.12.0.

6.2 - Installation

Installation

The command line tool ew-vodingest and the other tools can be installed on a Linux distribution compatible with RedHat Enterprise Linux 8 with:

$ sudo dnf install ew-vodingest-x.y.z-1.x86_64.rpm

To uninstall:

$ sudo dnf remove ew-vodingest.x86_64

6.3 - Tools

Tools bundled with ew-vodingest

The ew-vodingest rpm also contains number of tools that can be used to investigate and manipulate ESF format (CMAF + metadata) made by the VoD Ingest.

All utilities will print a usage help message if you specify the -h flag.

ew-check-variant-alignment

The tools lists the start and stop times of every variants of the output recording or managed VOD. In the strict check mode, it fails with non-zero exit code if there is unalignment found.

usage: ew-check-variant-alignment [-h] [-v] [-s] content_path

Check ESF variant alignment

positional arguments:
  content_path

optional arguments:
  -h    Show help message
  -s    Run in 'strict check mode'
  -v    Enable verbose output

ew-vod-modify-subtitles

This tool can modify subtitle and caption tracks of ingested assets.

It only works on ESF assets that are available as a mounted file directory. If the asset was ingested with ew-vodingest and has a DASH MPD file, it will also be updated. Other features from ew-vodingest like storing original subtitle files with a BaseURL link in content_info.json are also implemented.

The tool has commands like add, delete, modify, etc to allow changes to the asset. Each command has its own flags. To get help for a command, use the –help flag with the command, like $ ew-vod-modify-subtitles add --help or simply type ew-vod-modify-subtitles add.

Usage:
  ew-vod-modify-subtitles [command]

Available Commands:
  add         Add a new subtitle track to an asset
  completion  Generate the autocompletion script for the specified shell
  delete      Delete an existing subtitle track
  help        Help about any command
  list        Lists available subtitle tracks
  modify      Modify attributes of an existing subtitle track
  rename      Rename an existing subtitle track
  replace     Replace an existing subtitle track

Flags:
  -h, --help                help for ew-vod-modify-subtitles
      --log-file string     log to specified file instead of standard output
      --log-format string   format and type of log: [consolejson consolepretty discard] (default "consolepretty")
      --log-level string    log level (trace|debug|info|warn|error|fatal|panic) (default "info")
  -v, --version             version for ew-vod-modify-subtitles

ew-thumbnails-generator

This tools is only available from version 1.12.0 and used to generate DASH thumbnails tracks for existing ESF asset:

Basic usage of ew-thumbnails-generator:
  ew-thumbnails-generator -i /path/to/esf --sizes "width[xheight[,width[xheight]]]"


Generate thumbnails for video in the source directory. Requires command 'ffmpeg' to be available"

Run ew-thumbnails-generator with options:

  -i, --input string       source directory
  -l, --logfile string     log file [default stdout]
      --logformat string   format and type of log: [consolejson consolepretty discard] (default "consolepretty")
      --loglevel string    Initial logging level: debug, info, warn, error, fatal, panic (default "info")
  -r, --remove             remove existing thumbnails instead of generating (base on the sizes)
  -s, --sizes string       comma separated list of thumbnail sizes 'width[xheight],...'If only widths are provided, the heights will be calculated to keep aspect ratio. In case nothing provided, auto generate a thumbnails with 240 as width (default "240")
  -t, --tmpdir string      temporary working directory (default "/tmp")

How does it work?

The tool will execute ffmpeg for generating images by extracting first IDR frame of segments. The maximum number of thumbnails will be 500, that means, if there are more than 500 segment in the video, this tool will just only generate 500 thumbnails. This is for better performance and the fact that 500 images is a reasonable ammount of images to display on scrub bar. The tool will automatically pick the reasonable segments from which IDR frames will be extracted.

The thumbnails will be resized base on the --sizes argument. You can enter only width for size, or widthxheight or mixed, the sizes must be seperated by comma. Below are acceptable inputs:

--size "240,320"
--size "240x120,320x150"
--size "240x120,320"

In case only width known, the height will be calculated base on video resolution.

height = videoHeight * (width / videoWidth)

The number of generated thumbnails track will equal with the number of sizes.

The thumbnails will be combined into a single image and will be served as a tile in a SegmentNumber AdaptationSet by repackager to reduce the number of requests toward repackager.

Notes:

  • Because this tool base on ffmpeg, ffmpeg and its license should be installed and managed by user, the rpm package will not install it by default. And please make sure all necessary codec libraries are installed. For example, if the system is only using H264, only H264 codec libraries must be installed, H265 codec libraries can be skipped. Refer to Supported codecs for more information about current supported codecs of ew-vodingest.
  • Only jpeg is supported by now.
  • This tool only compatible with the output of ew-vodingest and ew-recorder. The output of old convoy-live-ingest is not supported.

6.4 - Convoy integration

Integration with Convoy

Currently Convoy, a product that managed the streamers and origins, is using the tool named ew-recorder for recording and uploading VoD. That tool was written in python and not so good in performance and resource usage. ew-vodingest tends to resolve these problems.

This document’s purpose is to make to integrating process between ew-vodingest and Convoy becomes clear.

For ew-vodingest-1.12.0 and older

How to install ew-vodingest in Convoy?

From Convoy version 2.30, it has already been installed along when installing Convoy.

Installing or upgrading ew-vodingest on Convoy by:

dnf install -y <path to ew-vodingest RPM>

Integrating for recording

For using ew-vodingest for recording on Convoy, ingest script for recorder must be changed to ew-vodingest

...
ccmi.webtv_recorders {
  liveingest1 {
    host = 1.2.3.4
    port = 8090
    live_buffer = 600
    storage = storage1
    ingest_script = /usr/bin/ew-vodingest
    channel_groups = { swlive }
  }
}
...

Then, recording will be handled by ew-vodingest.

DASH thumbnails for recordings

To generate DASH thumbnails, an option must be added when executing ew-vodingest. Unfortunately, this option cannot be added directly into ingest_script configuration above, so we should use this script:

#!/bin/bash
set -e
export PATH="$PATH:/usr/bin"
/usr/bin/ew-vodingest --thumbnails "$@"

The change in PATH variable above means to allow ew-vodingest to search for ffmpeg command. /usr/bin can be changed to wherever ffmpeg is placed.

Put this script into any bash script file, for example /usr/bin/ew-custom-recorder, and the configuration will look like this

...
ccmi.webtv_recorders {
  liveingest1 {
    host = 1.2.3.4
    port = 8090
    live_buffer = 600
    storage = storage1
    ingest_script = /usr/bin/ew-custom-recorder
    channel_groups = { swlive }
  }
}
...

Notes:: The above script is just a simple example and can be modified for more purposes.

Integrating for uploading

From Convoy 2.30, you can change the configuration of Convoy to change the uploading script:

upload.repackager_bin = /usr/bin/ew-vodingest

For older Convoy, you should change the symlink /usr/bin/recorder, and make it point to ew-vodingest.

ln -sf /usr/bin/ew-vodingest /usr/bin/recorder
DASH thumbnails for uploadings

Because ew-check-variant-aligment, a legacy tool of ew-recorder, are still being used for checking the asset before uploading it, a similar solution with recording above cannot be used since thumbnails tracks are not accepted by that tool.

Thus, thumbnails generating has to be executed after the checking step, and that can be achieved by using this script:

#!/bin/bash
set -e
/usr/lib64/ew-repackaging-recorder/bin/ew-check-variant-alignment "$@"
/usr/bin/ew-thumbnails-generator -i "$2"

Put above script into a file, for example /usr/bin/ew-custom-checker, and change the symlink:

ln -sf /usr/bin/ew-custom-checker /usr/bin/ew-check-variant-alignment

Notes::

  • The above script is just a simple example and can be modified for more purposes.

  • ew-check-variant-aligment are going to be replaced in the future.

For ew-vodingest-1.14.0 and newer

How to install ew-vodingest in Convoy?

Because from 1.14.0, ew-vodingest is intended to replace completely ew-recorder, some conflict errors will occur when installing ew-vodingest with bare yum or dnf, these command will help out:

dnf install -y --allowerasing <path to ew-vodingest RPM>

To rollback to ew-repackaging-recorder:

rpm -e --nodeps ew-vodingest
dnf install -y <path to ew-repackaging-recorder RPM>

IMPORTANT thing to add to Convoy upgrading and downgrading steps: Because the constrain in Convoy’s RPMs, conflict errors will occur when upgrading or downgrading the version older than Convoy-3.4.0 if ew-vodingest-1.14.0 or newer has been already installed on Convoy machines, so, please rollback to ew-repackaging-recorder before performing upgrading or downgrading, then you can reinstall ew-vodingest afterward.

After installing ew-vodingest, it can be upgraded or downgraded by:

yum install -y <path to ew-vodingest RPM>

Integrating for recording

DASH thumbnails for recordings

Change the ingest_script of each recorders to

...
ccmi.webtv_recorders {
  liveingest1 {
    host = 1.2.3.4
    port = 8090
    live_buffer = 600
    storage = storage1
    ingest_script = /usr/bin/ew-recorder-with-thumbnails
    channel_groups = { swlive }
  }
}
...

Notes:: The above script is just a simple sample and can be modified for more purposes.

Collecting input files on recording failure

When recording fails and --logfile is explicitly defined, which is the default call at Convoy, the relevant input files are collected in same folder as --logfile. For example, log file is at /tmp/XXX then collected files is at /tmp/XXX-input-files.

Those files are also collected to --output directory if --leavepartial is defined.

Integrating for uploading

From Convoy 2.30, you can change the configuration of Convoy to change the uploading script:

upload.repackager_bin = /usr/bin/ew-vodingest

For older Convoy, you should change the symlink /usr/bin/recorder, and make it point to ew-vodingest.

ln -sf /usr/bin/ew-vodingest /usr/bin/recorder
DASH thumbnails for uploadings

From Convoy 2.30, this configuration can be set:

upload.repackager_bin = /usr/bin/ew-recorder-with-thumbnails

With the older version:

ln -sf /usr/bin/ew-recorder-with-thumbnails /usr/bin/recorder

6.5 - Performance

VOD ingest performance

This is the performance report for the vodingest tool. The results are affected by i/o capacity of the system and the system load. The results are not absolute and should be used as a reference only since the input from customer can be vary in codec, combination of tracks and so on. All of this results are measured with the input data is on local file system, not mounted or from external backend like nfs, s3 or http since the throughput of the backend can affect the results.

The scenarios are now run with the following formats: MP4 progressive, TS and Fragmented MP4 (fMP4) as DASH On-Demand. All other formats like SMIL or HLS are just the manifest in text, the base containers are still MP4, TS or fMP4.

Manifest text and subtitles tracks are not included in the results since their cost to be processed is too small compare to the video and audio tracks.

The results are based on the average of the runs.

CPU information: Intel(R) Xeon(R) CPU E31220 @ 3.10GHz

MP4 progressive

CPU(%)Time(s)Max RAM usage(KB)Input operationsOutput operations
Size: 4GB
Dur: 2h 15m
Tracks:
Video:
. codec: h264
. resolution: 1920x1080
. bitrate: 3.74Mbps
Audio 1:
. codec: aac
. bitrate: 128Kbps
Audio 2:
. codec: aac
. bitrate: 128Kbps
1498.76140578997767630237
Size: 2.3GB
Dur: 2h 15m
Tracks:
Video:
. codec: h264
. bitrate: 2.28Mbps
. resolution: 1280x720
Audio 1:
. codec: aac
. bitrate: 96Kbps
Audio 2:
. codec: aac
. bitrate: 96Kbps
1547.86218141401014701477
Size: 1GB
Dur: 2h 15m
Tracks:
Video:
. codec: h264
. bitrate: 0.85Mbps
. resolution: 1024x576
Audio 1:
. codec: aac
. bitrate: 96Kbps
Audio 2:
. codec: aac
. bitrate: 96Kbps
45.366206012337061882600
Size: 4GB
Dur: 2h 15m
Tracks:
Video:
. codec: hevc
. bitrate: 3.78Mbps
. resolution: 1920x1080
Audio 1:
. codec: aac
. bitrate: 128Kbps
Audio 2:
. codec: aac
. bitrate: 128Kbps
1690.96327679874617710013
Size: 1.5GB
Dur: 2h 15m
Tracks:
Video:
. codec: hevc
. bitrate: 1.38Mbps
. resolution: 1024x576
Audio 1:
. codec: aac
. bitrate: 96Kbps
Audio 2:
. codec: aac
. bitrate: 96Kbps
1635.66313830473702917592

TS

CPU(%)Time(s)Max RAM usage(KB)Input operationsOutput operations
Size: 4GB
Dur: 2h 15m
Tracks:
Video:
. codec: h264
. resolution: 1920x1080
. bitrate: 3.74Mbps
Audio 1:
. codec: aac
. bitrate: 128Kbps
Audio 2:
. codec: aac
. bitrate: 128Kbps
28.368.33443088513707365648
Size: 2.3GB
Dur: 2h 15m
Tracks:
Video:
. codec: h264
. bitrate: 2.28Mbps
. resolution: 1280x720
Audio 1:
. codec: aac
. bitrate: 96Kbps
Audio 2:
. codec: aac
. bitrate: 96Kbps
38.729.93358457621704499920
Size: 1GB
Dur: 2h 15m
Tracks:
Video:
. codec: h264
. bitrate: 0.85Mbps
. resolution: 1024x576
Audio 1:
. codec: aac
. bitrate: 96Kbps
Audio 2:
. codec: aac
. bitrate: 96Kbps
4211.33236123725811681048
Size: 5.2GB
Dur: 2h 15m
Tracks:
Video:
. codec: hevc
. bitrate: 5.55Mbps
. resolution: 1920x1080
Audio 1:
. codec: aac
. bitrate: 128Kbps
Audio 2:
. codec: aac
. bitrate: 128Kbps
28935371898566269831136
Size: 2.03GB
Dur: 2h 15m
Tracks:
Video:
. codec: hevc
. bitrate: 2.16Mbps
. resolution: 1024x576
Audio 1:
. codec: aac
. bitrate: 96Kbps
Audio 2:
. codec: aac
. bitrate: 96Kbps
4222.65397340921813866560

DASH On-Demand (fMP4)

CPU(%)Time(s)Max RAM usage(KB)Input operationsOutput operations
Size: 3.73GB
Dur: 2h 15m
Tracks:
Video:
. codec: h264
. resolution: 1920x1080
. bitrate: 3.74Mbps
Audio:
. codec: aac
. bitrate: 128Kbps
13.71059368467133147630245
Size: 2.24GB
Dur: 2h 15m
Tracks:
Video:
. codec: h264
. bitrate: 2.28Mbps
. resolution: 1280x720
Audio:
. codec: aac
. bitrate: 96Kbps
13.757.18953340063254701474
Size: 0.92GB
Dur: 2h 15m
Tracks:
Video:
. codec: h264
. bitrate: 0.85Mbps
. resolution: 1024x576
Audio:
. codec: aac
. bitrate: 96Kbps
26.717.28938513562851882600
Size: 3.68GB
Dur: 2h 15m
Tracks:
Video:
. codec: hevc
. bitrate: 3.78Mbps
. resolution: 1920x1080
Audio:
. codec: aac
. bitrate: 128Kbps
15.3112.58965772431017710024
Size: 1.4GB
Dur: 2h 15m
Tracks:
Video:
. codec: hevc
. bitrate: 1.38Mbps
. resolution: 1024x576
Audio:
. codec: aac
. bitrate: 96Kbps
15.341.28525720450422917592

6.6 - SMIL manifest

Input specification using a SMIL file

Input SMIL syntax

SMIL is an XML format for multimedia presentation. It can be used instead of an HLS master playlist or DASH Media Presentation File to tell what media files should be combined into an asset and some associated metadata parameters. The level of detail, however, is much lower than in the other formats. ew-vodingest supports the import of MP4 files for video and audio, in connection to subtitle files.

Our usage of SMIL follows legacy format of Wowza, but we have added some parameters, such as displayName for HLS and role for subtitles.

Basic structure

SMIL files should specify all relevant media files in a switch block in the body:

<?xml version="1.0" encoding="UTF-8"?>
<smil>
    <body>
        <switch>
            <video src="movie1.mp4" ... />
            <video src="audio.mp4" ... />
            <textstream ... />
            <srt ... />
        </switch>
    </body>
</smil>

Stream types

The supported stream types are <video> which either means video, audio or both, <texstream> that is a subtitle file or <srt> which is a subtitle file in SRT format.

Video/Audio streams

Audio and video streams are identified by the video tag.

Minimal configuration

The simplest variant is to just give a src attribute:

<video src="videoAndAudio.mp4"/>

If this is the only information give, all video and audio tracks will be extracted and given names following the patterns

media typepatternexample
videovideo_<codec>_<bitrate>video_hevc_9000kbps
audioaudio_<codec>_<lang>_<bitrate>audio_aac_en_256kbps

depending on what tracks and codecs are available. The bitrate is calculated from the file size and duration and the language is extracted from the mp4 file if available in an elng, of in the mdhd box as a fallback.

If multiple files are specified in the SMIL file, tracks will be extracted from all of them, but if the resulting names (mediatype_codec_bitrate_language) coincide, only one copy will be kept. This makes it possible to import files which all include the same audio bitrate and language, but different video bitrates.

Specifying the bitrate

The system-bitrate attribute is used to specify the bitrate for the stream.

<video src="video.mp4" system-bitrate="2500000" />

Optionally it is possible to specify bitrates as <param> values as

<video src="videoAndAudio.mp4">
    <param name="videoBitrate" value="2500000"/>
    <param name="audioBitrate" value="128000"/>
</video>

Track selection and track-specific parameters - mp4

To achieve higher control over the extraction of tracks, and their parameters, it is possible to add extra parameters.

In particular, one can use the audioOnly and videoOnly keys to specify that only one type of media track should be extracted.

To extract audio and video in this way, one could use the following snippet:

<video src="videoAndAudio.mp4" system-bitrate="2500000">
    <param name="videoOnly" value="TRUE"/>
</video>
<video src="videoAndAudio.mp4" system-bitrate="128000">
    <param name="audioOnly" value="TRUE"/>
</video>

In addition, one can add an audioindex query index to extract a specific audio track. The audioindex value relates to the track ID inside an mp4 file, but is zero-based. The mapping is that ?audioindex=0 refers to the audio track with the lowest track ID, ?audioindex=1 to the second, and so on.

Here is an example that extracts the first two audio tracks, and gives them different parameters for language, bitrate, and displayName:

<video src="hev1_aac_mc.mp4?audioindex=0" system-language="dk" audio-bitrate="256000">
<param name="audioOnly" value="TRUE"/>
<param name="displayName" value="Danish 6ch"/>
</video>
<video src="hev1_aac_mc.mp4?audioindex=1" system-language="dk" audio-bitrate="192000">
<param name="audioOnly" value="TRUE"/>
<param name="displayName" value="Danish 2ch"/>
</video>

Track selection and track-specific parameters - ts

For multiplexed .ts-files the audio tracks are selected by specifying the trackID parameter corresponding to the PID, as follows:

      <video src="0.ts" audio-bitrate="94000" systemLanguage="spa">
        <param name="audioOnly" value="TRUE" />
        <param name="trackID" value="482"/>
        <param name="displayName" value="español"/>
      </video>

Audio Language

The language for an audio stream can be set using the system-language attribute:

<video src="mp4:video3.mp4?audioindex=0" system-language="eng">

For legacy reasons, one can alternatively use the attribute systemLanguage or language.

If the language is not specified, 3-letter language code in the mdhd box will be used. It will in turn be overridden by the optional elng box that can contain any language code.

Subtitle input

The supported input subtitle formats are TTML, WebVTT, STL, SRT. In all cases, a complete side-loaded file is expected. As part of the ESF format, the subtitles will be transformed into segmented wvtt. A complete WebVTT file will also be generated and referred to in the generated DASH manifest. The name of the output subtitle tracks are of the form

media typepatternexample
subtitlessubtitles_wvtt_<lang>_<role>subtitles_wvtt_se_caption

The role can be either caption or subtitle. If not specified, the role will be not be in the track name.

Subtitle streams in TTML, WebVTT, STL, or STT files are specified with the <textstream> or <srt> tags. The language can be specified with language attribute, or, for textstream, with the system-language attribute like:

<textstream src="subtitles.ttml" system-language="en" />
<srt src="swedish.srt" language="se"/>

The format is auto-detected from the file extension, which must be one of:

 .ttml, .webvtt, .vtt, .stl, .srt

The case of multiple languages in the same TTML file is not supported.

There is no bitrate specified for text streams. It will always be set to 1kbps.

Extracting language from subtitle file name

For the case where the SMIL-file is missing or there is no language attribute for the subtitle files, ew-vodingest will try to extract a language from the file name. The language extraction algorithm works like this:

  1. the file extension is removed
  2. split the name on “-” characters
  3. if the last part is at most three characters, use it as a language code

If a language is not found, the subtitle languages will be denoted “und”, “und1”, “und2” etc.

Example SMIL files

In the following, we give examples to show some possible variations of supported SMIL files.

Example 1 - video and audio from all files

This example has width and height for the video. That information will be discarded. There are only two distinct combinations of language and bitrate for audio, so only two variants audio_aac_eng_128kbps and audio_aac_eng_192kbps will be generated.

<?xml version="1.0" encoding="UTF-8"?>
<smil>
    <body>
    <switch>
        <video height="360" src="profile1.mp4" systemLanguage="eng" width="480">
        <param name="videoBitrate" value="500000"/>
        <param name="audioBitrate" value="128000"/>
        </video>
        <video height="480" src="profile2.mp4" systemLanguage="eng" width="720">
        <param name="videoBitrate" value="800000"/>
        <param name="audioBitrate" value="128000"/>
        </video>
        <video height="540" src="profile3.mp4" systemLanguage="eng" width="960">
        <param name="videoBitrate" value="1300000"/>
        <param name="audioBitrate" value="128000"/>
        </video>
        <video height="720" src="profile4.mp4" systemLanguage="eng" width="1280">
        <param name="videoBitrate" value="2300000"/>
        <param name="audioBitrate" value="192000"/>
        </video>
        <video height="1080" src="profile5.mp4" systemLanguage="eng" width="1920">
        <param name="videoBitrate" value="5000000"/>
        <param name="audioBitrate" value="192000"/>
        </video>
    </switch>
    </body>
</smil>

Example 2 - audioindex queries

This example shows extraction of audio tracks using the audioindex query parameter. The mp4: “scheme” is not needed, but supported for legacy reasons. The mp4:/// scheme is also supported for the same reason.

<?xml version="1.0"?>
<smil>
    <body>
    <switch>
        <video src="mp4:video1.mp4?audioindex=0" system-language="eng" audio-bitrate="96000">
        <param name="audioOnly" value="TRUE"/>
        </video>
        <video src="mp4:video1.mp4?audioindex=1" system-language="ger" audio-bitrate="96000">
        <param name="audioOnly" value="TRUE"/>
        </video>
        <video src="video2.mp4" system-bitrate="2000000">
        <param name="videoOnly" value="TRUE"/>
        </video>
        <video src="video1.mp4" system-bitrate="5000000">
        <param name="videoOnly" value="TRUE"/>
        </video>
        <textstream src="subtitles.ttml" system-language="eng">
        </textstream>
    </switch>
    </body>
</smil>

Notes: audioindex cannot be used when ingesting VOD over HTTP/FTP server.

Example 3 - displayName and role parameters

This example uses parameters for displayName for audio and subtitles, and role for subtitles.

<?xml version="1.0" encoding="utf-8"?>
<smil>
  <body>
    <switch>
      <video src="video800.mp4" system-bitrate="800000">
        <param name="videoOnly" value="TRUE"/>
      </video>
      <video src="video400.mp4" system-bitrate="400000">
        <param name="videoOnly" value="TRUE"/>
      </video>
      <video src="audio.mp4?audioindex=0" system-language="eng" audio-bitrate="256000">
        <param name="audioOnly" value="TRUE"/>
        <param name="displayName" value="English 6ch"/>
      </video>
      <video src="audio.mp4?audioindex=1" system-language="eng" audio-bitrate="192000">
        <param name="audioOnly" value="TRUE"/>
        <param name="displayName" value="English 2ch"/>
      </video>
      <srt src="swe.srt" language="swe">
        <param name="displayName" value="svenska"/>
        <param name="role" value="subtitle"/>
      </srt>
      <srt src="swe_cc.srt" language="swe">
        <param name="displayName" value="svenska (CC)"/>
        <param name="role" value="caption"/>
      </srt>
      <textstream src="eng.stl" system-language="eng">
        <param name="displayName" value="English"/>
        <param name="role" value="caption"/>
      </textstream>
    </switch>
  </body>
</smil>

Example 4 - The simplest possible - same as no SMIL

This example shows a SMIL file where all parameters are extracted automatically. In this case all video sources contain audio with language set to engin the mdhd box in the mp4 files, and the subtitle languages can be extracted from the file names.

<?xml version="1.0" encoding="UTF-8"?>
<smil>
  <body>
    <switch>
      <video src="0.mp4"/>
      <video src="1.mp4"/>
      <video src="2.mp4"/>
      <video src="3.mp4"/>
      <srt src="xyz-eng.srt"/>
      <srt src="xyz-spa.srt"/>
    </switch>
  </body>
</smil>

The generated tracks are:

  • 4 video tracks with different bitrates
  • 2 audio track with different bitrates, but the same language “eng”
  • 2 subtitle tracks with language codes “eng” and “spa”

In this particular case, the SMIL file just provides a list of files and no extra parameter. Therefore, it is also possible to specify the directory of this file as input to ew-vodingest and get exactly the same result.

6.7 - Supported codecs

Input supported codec

Progressive MP4

An MP4 file contains all video and audio tracks. All the tracks in that MP4 will be extracted except subtitle.

Video

H.264/AVC and H.265/HEVC with multiple bitrates.

For H.264/AVC, both avc1 and avc3 are accepted, but the result always be stored with avc1 type of video sample entry box.

For H.265/HEVC, both hev1 and hvc1 are accepted, but the result will always be stored with hvc1 type of video sample entry box.

In case a common GoP duration of all video tracks can be found, one or more common GoP will be combined to form a segment that has duration --minseg to --maxseg, if we have more than one segment durations that satisfy the range, the lowest one will be chosen. Then, all output video tracks will be segmented with the same segment duration.

On the other hand, if a common GoP duration among video tracks cannot be found, the segments will be formed base on the sync-frames distances of each video track. Segment will begin with a sync-frame, it can contain one or more sync-frames in it and will end right before a sync-frame (end sync-frame). The DTS diff between begin sync-frame and end sync-frame is segment duration and will be from --minseg to --maxseg. In this case, the segment duration can be vary, but the duration of corresponding segments within tracks will be the same.

Video track timescales, as defined in mdhd box, need to be the same among videos, or differ by an integer factor like 50 and 25 with factor is 2, or 60000 and 20000 with factor is 3.

Audio

AAC, HE-AACv1, HE-AACv2, AC3, Enhanced AC3, and MP4 with multiple bitrates and languages. Language will be gotten from mdhd box.

Subtitle

Embedded subtitle are not supported.

Note: you can add subtitle track later by this tools. Or you can use Directory input method by putting MP4 files and subtitle files into the same directory.

SMIL + progressive MP4

In this case, the assets have a SMIL file describing the Progressive MP4 video, audio and text stream.

Video

The same with Progressive MP4

Audio

The same with Progressive MP4

Subtitle

The SMIL-file syntax and usage is explained in the SMIL section. In that section, you can also find the subtitle specification at Subtitle input.

MPEG2-TS

A TS file contains all video and audio tracks, and them all will be extracted except subtitle track.

Video

H.264/AVC and H.265/HEVC with multiple bitrates.

In case a common GoP duration of all video tracks can be found, one or more common GoP will be combined to form a segment that has duration --minseg to --maxseg, if we have more than one segment durations that satisfy the range, the lowest one will be chosen. Then, all output video tracks will be segmented with the same segment duration.

On the other hand, if a common GoP duration among video tracks cannot be found, the segments will be formed base on the sync-frames distances of each video track. Segment will begin with a sync-frame, it can contain one or more sync-frames in it and will end right before a sync-frame (end sync-frame). The DTS diff between begin sync-frame and end sync-frame is segment duration and will be from --minseg to --maxseg. In this case, the segment duration can be vary, but the duration of corresponding segments within tracks will be the same.

The timescale in TS file must be standard, 90000.

Audio

AAC, HE-AACv1, HE-AACv2, AC3, and Enhanced AC3 with multiple bitrates and languages. Language will be gotten from stream descriptors in PMT.

Subtitle

Embedded subtitle are not supported.

Note: you can add subtitle track later by this tools. Or you can use Directory input method by putting TS files and subtitle files into the same directory.

Directory

A directory contains all the input TS, MP4 and subtitle files. ew-vodingest will scan and extract all the media tracks from the media files in that directory.

Video

The same with Progressive MP4 and MPEG2-TS sections, duplicated tracks are going to be dropped.

Audio

The same with Progressive MP4 and MPEG2-TS sections, duplicated tracks are going to be dropped.

Subtitle

Side-loaded subtitle text files are supported.

Supported formats: ttml, webvtt, srt, stl. Subtitle format will be detected by the file extension: .ttml for ttml format. .vtt and .webvtt for webvtt format. .srt for srt format. .stl for stl format.

MPEG DASH On-Demand Profile

A DASH On-Demand MPD file describes the asset.

Video

H.264/AVC and H.265/HEVC with multiple bitrates.

For H.264/AVC, both avc1 and avc3 are accepted, but the result always be stored with avc1 type of video sample entry box.

For H.265/HEVC, both hev1 and hvc1 are supported, but the result always be stored with hvc1 type of video sample entry box.

All video tracks need to have the same timescale as defined in mdhd box.

Audio

AAC, HE-AACv1, HE-AACv2, AC3 and Enchaned AC3 with multiple bitrates and languagues.

Subtitle

Side-loaded subtitle text files are supported under formats: ttml, webvtt, srt.

Side loaded subtitle fragmented mp4 files is supported under formats: stpp and fragmented webvtt.

CEA608 Closed Captions is preserved from MPD manifest file.

Apple HLS

A Master Playlist file describes the asset. Multiplexed and isolate video and audio tracks are both supported in individual segment files or a concatenated files.

Video

H.264/AVC in TS encapsulation.

H.264/AVC and H.265/HEVC are supported in fMP4 encapsulation.

Audio

AAC, HE-AACv1, HE-AACv2, AC3 and Enhanced AC3 in fMP4 and TS encapsulation.

Subtitle

HLS WebVTT as side loaded, complete or segmented text files.

HLS stpp as fragmented files.

CEA608 Closed Captions are preserved from master playlist (.m3u8 file).

Microsoft Smooth Streaming

The MSS manifest file is used to define the asset.

Video

H.264/AVC with multiple bitrates.

Although it is not standard, H.265/hevc with muiltiple bitrates is supported.

Audio

AAC and HE-AAC with multiple bitrates and languages.

Subtitle

TTML as side-loaded complete files.

IIS Smooth Streaming

The ISM manifest file is used to define the asset.

Video

H.264/AVC with multiple bitrates. The codec string of video tracks must be AVC1, even H264 is not supported.

Audio

AAC and HE-AAC with multiple bitrates and languages.

Subtitle

TTML as side-loaded complete files.

6.8 - HDR10 support

Description for HDR10 support

When ingesting TS streams, HDR10 is detected by parsing SPS. If the HDR10 info is included in the TS streams, the VUI part of SPS will contain colour_primaries with value 9, matrix_coeffs with value 9 and transfer_characteristics with value 16. If ew-vodingest detects exactly HDR10 info with these values, it will do following things:

  • Add new hdr field to video variant in content_info.json. This field currently supports only one value hdr10. The video variant info will look like this:
  "variants": [
    {
      "media_type": "video",
      "subtype": "hevc",
      "name": "video_hevc_886kbps",
....
      "hdr": "hdr10",
  • Add compatible brand “chd1” to ftyp box of video file .cfmv
[ftyp]
 - majorBrand: mp42
 - minorVersion: 512
 - compatibleBrand: chd1

Beside the VUI part of SPS, the following SEI NAL units may be present in the TS streams: Mastering display colour volume (SEI payload type 137) and Content light level information (SEI payload type 144). But this signal is optional, ew-vodingest doesn’t rely on them to detect HDR10. If these SEI NAL units are present, ew-vodingest will just add them to the hvcc box of video file .cfmv

For MP4 input, ew-vodingest does exactly the same behaviours, but the behaviour which add above SEI NAL units to hvcc box has not been tested.

6.9 - AWS S3 Cloud Usage

Using S3

To ingest to or from S3, the path is specified with s3://. For example:

ew-vodingest --input s3://mybucket/dir1 --output /home/myhome/esf1 --s3file /home/myhome/.aws/credentials.json

S3 credentials file

You must create a JSON file for the credentials. (The credentials file used by the AWS CLI is not used.) For example:

{
    "profile": "default",
    "region": "eu-north-1",
    "id": "AKIAQWERTYQWERTY",
    "key": "qwerty123+QWERTY123&qwerty"
}

The actual values must be obtained from the AWS administration console. Here id and key correspond to "Access key ID" and "Secret access key".

6.10 - Releases

ESB3021 - ew-vodingest releases

6.10.1 - Release 1.14.2

New bug fix

Change log

  • FIXED: Cannot upload to correct FTP destination [ESB3021-196]

Known limitations:

  • Does not preserve TTML subtitle styling
  • VoD ingest of SMIL over HTTP/FTP, does not work with query parameter audioIndex

Compatibility has been verified with the following products:

  • Sw Repackager: 1.52.1
  • Sw Live Ingest: 1.42.1
  • Convoy: 3.2.1
  • Sw Streamer: 2.0.0
  • Orbit TV Server: 3.6.2

Release information

  • Date: 2025-05-26
  • Type: Production release

6.10.2 - Release 1.14.1

New bug fix

Change log

  • FIXED: Cannot ingest from FTP source [ESB3021-195]

Known limitations:

  • Does not preserve TTML subtitle styling
  • VoD ingest of SMIL over HTTP/FTP, does not work with query parameter audioIndex

Compatibility has been verified with the following products:

  • Sw Repackager: 1.52.1
  • Sw Live Ingest: 1.42.1
  • Convoy: 3.2.1
  • Sw Streamer: 2.0.0
  • Orbit TV Server: 3.6.2

Release information

  • Date: 2025-05-19
  • Type: Production release

6.10.3 - Release 1.14.0

New features and bug fixes

Change log

  • NEW: Port ew-check-variant-aligment from esb3005 [ESB3021-178]
  • NEW: Script for generating DASH thumbnails when integrating with Convoy [ESB3021-189]
  • FIXED: Cannot process SMIL file when “src” attribute has “mp4:” or “mp4://” as prefix [ESB3021-179]
  • FIXED: Remote absolute path cannot be processed in SMIL [ESB3021-180]
  • FIXED: Recordings fails when minute file and udat mismatched [ESB3021-182]
  • FIXED: FTP input without explicit port number is not accepted [ESB3021-184]

Known limitations:

  • Does not preserve TTML subtitle styling
  • VoD ingest of SMIL over HTTP/FTP, does not work with query parameter audioIndex

Compatibility has been verified with the following products:

  • Sw Repackager: 1.52.1
  • Sw Live Ingest: 1.42.1
  • Convoy: 3.2.1
  • Sw Streamer: 2.0.0
  • Orbit TV Server: 3.6.2

Release information

  • Date: 2025-03-17
  • Type: Production release

6.10.4 - Release 1.12.0

New features, improvements and bug fixes

Change log

  • NEW: Generate DASH image-based thumbnails for recording and VoD [ESB3021-165]
  • NEW: Detect recording GoP duration for better integration with ew-vod2cbm [ESB3021-159]
  • NEW: Support recording for low-latency channels [ESB3021-161]
  • NEW: Support --local-storage option for recording, input and temporary output [ESB3021-171]
  • IMPROVED: Better --source-rate-limit handling. Improve accuracy in checking used bandwidth [ESB3021-96]
  • FIXED: Fail to get inband codec information for DASH On-Demand [ESB3021-168]
  • FIXED: All audios tracks extracted, even though audioindex is defined in SMIL [ESB3021-175]

Known limitations:

  • Does not preserve TTML subtitle styling
  • VoD ingest of SMIL over HTTP/FTP, does not work with query parameter audioIndex

Compatibility has been verified with the following products:

  • Sw Repackager: 1.50.3
  • Sw Live Ingest: 1.40.1
  • Convoy: 3.2.1
  • Sw Streamer: 1.34.0
  • Orbit TV Server: 3.4.1

Release information

  • Date: 2024-10-23
  • Type: Production release

6.10.5 - Release 1.10.0

New features, improvements and bug fixes

Change log

  • NEW: New subtitle format support. cmft for HLS/DASH and stpp for DASH [ESB3021-129]
  • NEW: Preserve SCTE35 information for HLS input [ESB3021-130]
  • NEW: Support FTP ingest [ESB3021-151]
  • NEW: Allow repackager to output VOD DASH SegmentNumber [ESB3021-160]
  • IMPROVED: Better command line help [ESB3021-131]
  • FIXED: Missing original subtitle after ingestion. Problem in 1.8.0 with lost subtitles [ESB3021-136]
  • FIXED: Broken AC3/E-AC3 sample data lead to broken audio data. Audio will be muted [ESB3021-137]
  • FIXED: Newline tag in ttml is not preserved [ESB3021-147]
  • FIXED: Missing space characters when preserving styling in webvtt [ESB3021-149]
  • FIXED: Crash on empty line of m3u8 files [ESB3021-153]
  • FIXED: Cannot download input from external servers. this happens when the manifest (includes MPD and M3U8) contains absolute URL for media segments/files [ESB3021-154]
  • FIXED: Multiple languages TTML subtitle is not supported [ESB3021-158]

Known limitations:

  • Does not preserve TTML subtitle styling
  • VoD ingest of SMIL over HTTP/FTP, does not work with query parameter audioIndex

Compatibility has been verified with the following products:

  • Sw Repackager: 1.48.2
  • Sw Live Ingest: 1.38.2
  • Convoy: 3.0.1
  • Sw Streamer: 1.34.0
  • Orbit TV Server: 3.2.1

Release information

  • Date: 2024-06-25
  • Type: Production release

6.10.6 - Release 1.8.0

Major new features

Features:

  • New: Support for HLS VOD input
  • New: Support for unencrypted ISM/MSS
  • New: Support for irregular sample duration VODs (TS and MP4)
  • New: Preserve WebVTT styling
  • New: Support Audio Descriptions in VOD ingestion
  • Fix: Missing CUE-IN for one segment ad break
  • Fix: Average segment duration appears in content_info.json when common GoP cannot be detected
  • Fix: Incorrect audio language
  • Fix: Incorrect audio codec
  • Fix: Duplicate track name for HEVC HDR and SDR tracks
  • Fix: Ingest stops due to unrecognized tag in smil
  • Fix: Missing role for subtitle track
  • Fix: Cannot parse PES packet containing more than one AAC frame, causing silent audio output
  • Fix: Incorrect maximum segment duration in content_info.json
  • Fix: Redundant HLS target duration in content_info.json

Known limitations:

  • Does not preserve TTML subtitle styling
  • VoD ingest of SMIL over HTTP, does not work with query parameter audioIndex

Compatibility has been verified with the following products:

  • Sw Repackager: 1.46.2
  • Sw Live Ingest: 1.38.0
  • DRM Gateway: 2.30.1
  • Convoy: 2.36.0

Release information

  • Date: 2023-11-29
  • Type: Production release

6.10.7 - Release 1.6.0

Major new features

Features:

  • New: Support for DASH On-Demand
  • New: Option to throttle the reading rate from local storage
  • Fix: Incorrect subtitles timing
  • Fix: Ingestion failed when missing some samples at the end of tracks
  • Fix: Cannot stream MSS throught ew-repackager
  • Fix: Lingering .dat file after ingestion failed
  • Fix: Missing field content_duration_ms for recordings
  • Fix: Language code is not extracted from subtiles filename when ingesting from SMIL (if language is not defined in SMIL)

Known limitations:

  • Does not preserve subtitle styling
  • VoD ingest of SMIL over HTTP, does not work with query parameter audioIndex

Release information

  • Date: 2023-09-18
  • Type: Production release

6.10.8 - Release 1.4.0

Major new features

Features:

  • New: Support for EC-3 audio in transport streams
  • New: ew-vodmod tool to modify subtitle tracks of ingested VoD assets
  • New: Option to drop incompatible media tracks
  • Fix: ew-vodingest did not escape special character for WVTT format
  • Fix: corrected VOD-asset duration in log
  • Fix: corrected dropping of too early audio samples in TS ingest (causing “Bad box size” error)

Known limitations:

  • Does not preserve subtitle styling
  • HDR10 has not been tested fully on MP4 file
  • VoD ingest of SMIL over HTTP, does not work with query parameter audioIndex
  • live-recording-asset duration is logged as zero

Release information

  • Date: 2023-06-08
  • Type: Production release

6.10.9 - Release 1.2.0

Major new features

Features:

  • New: Live recordings (with esb3003 CBM)
  • New: Command-line content-id (esb3005 style)
  • New: Content template verification, for esb3019 integration
  • New: Allow non-constant GoP-durations
  • New: Improved S3 and NFS failure handling
  • Fix: Superfluous audio-track generation
  • Fix: Confused output audio bandwidths
  • Fix: ADTS headers with 2-byte CRC

Known limitations:

  • Does not preserve subtitle styling
  • HDR10 has not been tested fully on MP4 file
  • VoD ingest of SMIL over HTTP, does not work with query parameter audioIndex

Release information

  • Date: 2023-03-08
  • Type: Production release

6.10.10 - Release 1.0.0

First production release of ew-vodingest

Features:

  • Ingest single file TS
  • Ingest single file MP4
  • Support for HDR10
  • S3 and HTTP support
  • Timeout handling
  • Improved logging
  • Offline licensing

Known limitations:

  • Require constant GoP duration and constant sample steps
  • Does not preserve subtitle styling
  • HDR10 has not been tested fully on MP4 file

Release information

  • Date: 2022-12-02
  • Type: First production release

6.10.11 - Release 0.6.2

Initial beta release of ew-vodingest

Features:

  • Ingest SMIL + mp4 + subtitle assets in combined ESF + DASH OnDemand format
  • Support AVC, HEVC video
  • Support AAC, AC-3 audio
  • Support TTML, WebVTT, SRT, STL subtitles
  • Support displayName parameter for audio and subtitles
  • Support role (caption or subtitle) parameter for subtitles

Known limitations:

  • Requires mounted file system for input and output
  • Require constant GoP duration and constant sample steps
  • Does not preserve subtitle styling
  • Logging is not nice

Release information

  • Date: 2022-03-28
  • Type: Beta for testing
  • Expiration Date: 2022-09-24

6.11 - Licensing

Licensing for ew-vodingest

ew-vodingest requires a valid license file to operate. The license file must be obtained from AgileTV, and copied to /etc/edgeware/ew-vodingest/license.json. Note: ew-vodingest only operates with offline licenses.

See further details here.

7 - CMAF Ingest (esb3034)

Ingest live channels using the DASH-IF CMAF Ingest format

7.1 - Introduction

Introduction to ESB3034 - the ew-cmaf-ingest service

Ingestion of Segmented Live ABR Content

The traditional way of ingesting live ABR content uses MPEG-2 TS streams, preferably in ATS format. The TS-packets are transported over plain UDP, over UDP with RTP headers and possible FEC, or using SRT for reliable transport. Such streams can be received by Agile TV’s live-ingest component ESB3003, which segments the content for further manipulation and distribution via AgileTV Origin’s other components.

However, given that the end-goal is to distribute a segmented stream, an alternative is that the segmentation is done already by the encoder, and that such segments are ingested to AgileTV Origin. For a long-time, the formats for this type of ingest have been under-specified, but with the DASH-IF CMAF Ingest specification, there is now a common ground for interoperability. The AgileTV Origin component ew-cmaf-ingest supports this format, and receives streams of segments. It buffers, reformats, and encrypts the content but leave the segmentation unchanged, except for alignment to CMAF’s internal numbering and timing, and adding additional metadata if configured.

Ingest format and URLs

The CMAF Ingest specification defines two interfaces. ew-cmaf-ingest currently only supports Interface-1, which is a stream of segments starting with an init segment for each variant. Interface-1 does not require a DASH manifest, but relies on metadata inside the segment tracks to find language, bitrate, role etc.

For cases where the embedded metadata is lacking or not correct, ew-cmaf-ingest allows for configuring the values. The configuration can also be used to override the incoming values.

The ew-cmaf-ingest services receives CMAF segments being pushed to it using either HTTP PUT or HTTP POST. To avoid un-authorized content to be ingested, the content should be pushed over HTTPS and use basic auth with preconfigured username and password for each channel.

The receiver parses the URLs of the pushed initialization and media segments. They should be in one of two forms, where the first form as the same URL for all segments of a specific channel and track:

/<prefix>/<channelName>/Streams(<trackName>.cmf?)
/<prefix>/<channelName>/<trackName>/<segmentID>.cmf?

Here,

  • <prefix> is a configured URL prefix for all channels
  • <channelName> is the name of the channel
  • <trackName> is the name of a specific track
  • .cmf? is a segment-type dependent file extension .cmfv, .cmfa, .cmft, .cmfm for video, audio, text, and metadata, respectively
  • segmentID is a name of a segment. This actual name is not used, since the receiver does generally not understand the name if a Manifest is not available

In addition, the source can send a DASH manifest to a URL like:

/<prefix>/<channelName>/<trackName>/<manifestName>.mpd

Manifests will not be parsed, but just stored as <storage>/asset/received.mpd.

HTTP DELETE requests are accepted, but not used, since there is a built in max buffer time resulting in a maximum number of segments stored and being available for further processing.

Fragmented segments and low-latency streaming

For efficiency, it is preferred that Content-Length headers are used in the HTTP POST and PUT requests for segments. This should be possible for all init segments, but not for chunked low-latency segments where the chunks are generated and pushed using Chunked Transfer Encoding before the full segment is finished.

ew-cmaf-ingest will keep the CMAF chunks of the incoming segments and propagate them to the rest of stream-builder as soon as all tracks have received the corresponding chunks. It is therefore important that all low-latency media tracks use the same chunk duration.

How to run

Installation

The ew-cmaf-ingest service is distributed as a CentOS/Red Hat RPM and is available as ew-cmaf-ingest.service when installed. It works on Red Hat 8 and compatible versions.

To install version x.y.z, the rpm command can be used as follows:

dnf install ./ew-cmaf-ingest-x.y.z-1.el8.x86_64.rpm

The service can be controlled with the standard systemctl commands:

systemctl start ew-cmaf-ingest
systemctl stop ew-cmaf-ingest
systemctl status ew-cmaf-ingest

Logs from the service can be seen using journalctl -u ew-cmaf-ingest.

The unit file is available in /usr/lib/systemd/system/ew-cmaf-ingest.service.

When run as a service, ew-cmaf-ingest reads its initial configuration from /etc/edgeware/ew-cmaf-ingest/config.json. To uninstall the service, do:

dnf remove ew-cmaf-ingest

When uninstalling it is recommended to first stop the service.

Configuration

For configuration, see the Configuration section.

Segment processing details

Segments are processed in parallel and adopted to align with AgileTV Origin’s mezzanine format ESF. That format is very well aligned with the recommendations in the CMAF Ingest specification:

  1. The reference time is set to 1970-01-01T00:00:00Z by shifting the time of the input segments with an appropriate amount. If the CreationTime in the [mvhd] is set to the start of a full year, that value is used to establish an exact relation between input and output timestamps.
  2. The media segments sequence numbers are parsed and used to define a fixed offset between input and output sequence numbers. The output sequence numbers (used in the rest of the AgileTV Origin) corresponds to startNumber=0 at 1970-01-01T00:00:00Z. It is possible to configure an initial offset for faster startup.
  3. Language code is extracted from the [mdhd] or [elng] boxes unless configured for the track
  4. Bandwidth is extracted from a [Btrt] box. If not present, it is estimated from the duration of the first segment. It can also be set in the configuration.
  5. Roles are extracted from [trak.udta.kind] boxes, but can also be configured.
  6. The output segment generation does not start until two consecutive video segments of the same track with identical durations have arrived. That duration is then used as the reference for the full channel and is not allowed to vary.
  7. Metadata tracks are received and SCTE-35 information is extracted. The information is currently not further used.

Supported Codecs

  • video: AVC/H.264, HEVC/H.265
  • audio: AAC-LC, HE-AACv1, HE-AACv2, AC-3, EC-3
  • subtitles: wvtt, stpp

Note that all stpp-subtitles will be transformed into wvtt subtitles for internal storage.

7.2 - Configuration and Command Line Options

Configuring and running the server.

The cmaf-ingest server has both auto-configured and manually configured channels.

The channels are automatically configured by the server when the server receives input streams and the channels name is not defined in the disabled channels list. If a channel is auto-configured, it will use the default user and password settings.

The ew-cmaf-ingest manual configuration parameters can be specified in the following ways:

  1. On the command-line
  2. In the configuration file (when specified by the command-line)
  3. Via REST API

They take precedence in the above order, i.e. a command-line value will override other values.

Command Line Options

All command line parameters and environment variables can be seen by running:

ew-cmaf-ingest -h

....

Run as: ew-cmaf-ingest options with options:

  -certpath string
        Path to TLS certificate file (for HTTPS). Use domains instead if possible
  -config string
        Config file with channel-specific settings
  -configport int
        Configuration port (default 5034)
  -domains string
        One or more DNS domains (comma-separated) for auto certificate from Let's Encrypt
  -fileserverpath string
        HTTP path for generated segments and manifests (for testing)
  -keypath string
        Path to TLS private key file (for HTTPS). Use domains instead if possible.
  -logformat string
        Format and type of log: [consolejson consolepretty journald discard] default=consolejson
  -loglevel string
        Initial logging level: debug, info, warn, error, fatal, panic (default "info")
  -port int
        HTTP receiver port (default 8080)
  -porthttps int
        CMAF HTTPS receiver port (default 443)
  -prefix string
        Prefix to remove from upload URLS (default "/upload")
  -recRawNr uint
        Default number of raw segments to receive and store (turns off all parsing)
  -storage string
        Storage root directory (default "./storage")
  -tsbd uint
        Default timeShiftBufferDepth in seconds (default 90)
  -version
        Get version

Integration with ew-cbm

ew-cmaf-ingest acts as the input source for ew-cbm (Catchup Buffer Manager, a part of SW Live Ingest), and ew-cbm, in its turn, will be the backend of sw-repackager, from which the channels are streamed to CDN, and then, to end user.

To make ew-cmaf-ingest channel visible with ew-cbm, -storage option in ew-cmaf-ingest configuration have to be the same with the location that ew-cbm gets the input from. The service file of ew-cbm can be referred to get that location (specified by argument --live-ingest-path), it is usually /mnt/ramdisk.

 cat /usr/lib/systemd/system/ew-cmaf-ingest.service
...
ExecStart=/usr/bin/ew-cmaf-ingest -config /etc/edgeware/ew-cmaf-ingest/config.json -port 8080 -storage /mnt/ramdisk/
...

The next step is configuring the channel for ew-cbm to work with ew-cmaf-ingest buffer. Note that in case of low latency streaming, it is recommended to adding channel configuration to ew-cbm after ew-cmaf-ingest channel has been fully up.

7.2.1 - CBM channel configuration

Setup channel configuration for ew-cbm

ew-cbm is a Catchup manager, copy segments from ramdisk to persistent storage and serve incoming HTTP requests from Software Repackager.

confcli services.liveIngest.channels. -w
Running wizard for resource 'Channels'
<A list of channels>

Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string

Running wizard for resource 'Channels'
<A list of channels>   
                                                   
Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string
                                                   
Channels <A list of channels>: [
  Channel <Configuration for a single channel>: {
    Channel Name (default: default): cmafingest-channel
    Channel State (default: enabled): cbm-only         
    Catchup Location (default: ): cb1
    Channel Name Alias (default: ): 
    Channel Template Name (default: default): 
    Config Id (default: 0): 
    Input Sources <A list of input sources>: [
      Input Source <Input source configuration>: {
        Backup IGMPv3 Source (default: ): 
        Error correction (default: off): 
        IGMPv3 Source (default: ): 
        Source (default: ):  
        Passphrase for SRT connection (default: ):  
        Tracks <A list of tracks from the channel template>: [
          Track <Configuration for a single track>: {
            Log Level (default: INHERIT): 
            Track Name (default: default): 
            Variant flags (default: -1): 
          }
          Add another 'track' element to array 'tracks'? [y/N]: 
        ]                          
        Use As SCTE-35 Source (default: False): 
      }                      
      Add another 'inputSource' element to array 'inputSources'? [y/N]: 
    ]
    Logging <Logging configuration>: {
      General Log Level (default: INHERIT): 
      Track Log Level (default: INHERIT): 
      Source Log Level (default: INHERIT): 
    }
    Nielsen Marker Tracking (default: off): 
    Segmentation Template Name (default: default):  
  }
  Add another 'channel' element to array 'channels'? [y/N]: 
]
Generated config:
{
  "channels": [
    {
      "name": "cmafingest-channel",
      "state": "cbm-only",
      "catchupLocation": "cb1",
      "alias": "",
      "channelTemplate": "default",
      "configId": 0,
      "inputSources": [
        {
          "backupIgmpV3Source": "",
          "errorCorrection": "off",
          "igmpV3Source": "",
          "source": "",
          "srtPassphrase": "",
          "tracks": [
            {
              "logLevel": "INHERIT",
              "name": "default",
              "variantFlags": -1
            }
          ],
          "useAsScte35Source": false
        }
      ],
      "logging": {
        "general": "INHERIT",
        "track": "INHERIT",
        "source": "INHERIT"
      },
      "nielsenMarkerTracking": "off",
      "segmentationTemplate": "default"
    }
  ]
}
Merge and apply the config? [y/n]:

Only three configurations should be cared about: Channel Name (name), Channel State (state), Catchup Location (catchupLocation), others are meaningful for ew-live-ingest, another part of SW Live Ingest, so they should be left as default:

  • Channel Name (name): have to be exactly the same with the channel name configured in ew-hlsingest, so that ew-cbm will know where to look for the input.
  • Channel State (state): cbm-only is a must.
  • Catchup Location (catchupLocation) (optional): is the location that ew-cbm will write the catch up buffer to, please refer to ew-cbm documentation to know how to configure it.

After done configuring, this command, ew-cb-media, can be used to check for the running channel. If the channel name appears in the output of that command and the duration of catchup buffer starts growing (repeat the command the see if the channel is growing, or just use watch ew-cb-media), then the live content can now be delivered through ew-cbm to repackager and beyond.

7.2.2 - Channel REST API v1

Reference for the channel schedule API

The following is a rendering of the OpenAPI for the channels and schedules of ESB3034 using swagger. This page does not have a backend server, so it cannot be run interactively.

However, an interactive Swagger API page is available directly at the ew-cmaf-ingest server at <server>:<port>/swagger/. If the -configport option is not specified, the default value 5034 is used.

7.2.3 - Configuration File

Startup configuration for configuring ew-cmaf-ingest

When starting the ew-cmaf-ingest service, a configuration file may be provided. This file enables starting ew-cmaf-ingest service with predefined general configuration and channels information. These items can also be added and updated via the manually configured REST API when the service is running.

If a path to a configuration is set, any change of the configuration, such as auto-configured channels or manual configuration changes, results in the complete configuration information being written to a file at that path. On the restart, an existing file at this path is used to restore the last dynamic configuration.

If a configuration file does not exist at the specified path, a new file with empty content will be created. If the file is empty, the current configuration will be written to it.

JSON Schema for configuration file

The JSON schema below provides a description of the schema and the parameters that applies to configuration file for ew-cmaf-ingest.

{
   "defaultUser": {
      "description": "Default username for all channels",
      "type": "string"
   },
   "defaultPassword": {
      "description": "Default password for all channels",
      "type": "string"
   },
   "autoConfig": {
      "description": "AutoConfig is a flag that enables or disables automatic configuration. Default is true",
      "type": "boolean"
   },
   "Channels": {
      "description": "Channels for ew-cmaf-ingest at startup",
      "type": "array",
      "items": {
         "type": "object",
         "required": [
               "name"
         ],
         "properties": {
            "name": {
               "description": "Unique channel name",
               "type": "string"
            },
            "startNr": {
               "description": "The start number for the first segment. Default is 0",
               "type": "integer"
            },
            "authUser": {
               "description": "The username for the channel to authenticate. If not set, the default username will be used",
               "type": "string"
            },
            "authPassword": {
               "description": "The password for the channel to authenticate. If not set, the default password will be used",
               "type": "string"
            },
            "timeShiftBufferDepthS": {
               "description": "The timeShiftBufferDepth in seconds for circularBuffer. Default is 90s",
               "type": "integer"
            },
            "receiveNrRawSegments": {
               "description": "The number of raw segments to receive before starting to process. Default is 0",
               "type": "integer"
            },
            "reps": {
               "description": "The Representations for the channel",
               "type": "array",
               "items": {
                  "type": "object",
                  "properties": {
                     "name": {
                        "description": "Unique representation name",
                        "type": "string"
                     },
                     "language": {
                        "description": "The language for the representation",
                        "type": "string"
                     },
                     "role": {
                        "description": "The role for the representation",
                        "type": "string"
                     },
                     "displayName": {
                        "description": "The display name for the representation",
                        "type": "string"
                     },
                     "bitrate": {
                        "description": "The bitrate for the representation",
                        "type": "integer"
                     },
                     "ignore": {
                        "description": "The Ignore means that the representation should be ignored",
                        "type": "boolean"
                     }
                  }
               }
            },
            "ignore": {
               "description": "The Ignore means that the channel should be ignored",
               "type": "boolean"
            }
         }
      }
   },
   "DisabledChannels" {
      "description": "DisabledChannels is a list of channel names that should be disabled or blocked",
      "type": "array"
   }
}

Example configuration

An example configuration file for two channels where all assets have relative paths may look like:

{
   "defaultUser": "admin",
   "defaultPassword": "password123",
   "autoConfig": true,
   "Channels": [
      {
         "name": "channel_test_1",
         "startNr": 0,
         "authUser": "admin",
         "authPassword": "password123",
         "timeShiftBufferDepthS": 90,
         "receiveNrRawSegments": 0,
         "reps": [
            {
               "name": "track1",
               "language": "en",
               "role": "main",
               "displayName": "track1",
               "bitrate": 1000000,
               "ignore": false
            },
            {
               "name": "track2",
               "language": "vie",
               "role": "alternative",
               "displayName": "track2",
               "bitrate": 16000000,
               "ignore": true
            }
         ],
         "ignore": false
      },
      {
         "name": "channel_test_2",
         "startNr": 1,
         "authUser": "admin",
         "authPassword": "password123",
         "timeShiftBufferDepthS": 90,
         "receiveNrRawSegments": 0,
         "reps": [
            {
               "name": "track1",
               "language": "swe",
               "role": "description",
               "displayName": "track1",
               "bitrate": 8000000,
               "ignore": false
            }
         ],
         "ignore": true
      }
   ]
   "DisabledChannels": [
      "channel_test_2",
      "channel_test_3"
   ]
}

7.3 - Credits

Third party libraries used in ew-cmaf-ingest and their licenses

License List

The table below lists the third party libraries used by this software and their respective license types.

LibraryLicenseChecked At
github.com/asticode/go-astikitMIT2025-02-26
github.com/asticode/go-astisubMIT2025-02-26
github.com/asticode/go-astitsMIT2025-02-26
github.com/aws/aws-sdk-go/internal/sync/singleflightBSD-3-Clause2025-02-26
github.com/aws/aws-sdk-goApache-2.02025-02-26
github.com/barkimedes/go-deepcopyMIT2025-02-26
github.com/caddyserver/certmagicApache-2.02025-02-26
github.com/caddyserver/zerosslMIT2025-02-26
github.com/Comcast/gotsMIT2025-02-26
github.com/coreos/go-systemd/v22/journalApache-2.02025-02-26
github.com/Dash-Industry-Forum/livesim2/pkgBSD-3-Clause2025-02-26
github.com/Eyevinn/dash-mpd/mpdMIT2025-02-26
github.com/Eyevinn/dash-mpd/xmlBSD-3-Clause2025-02-26
github.com/Eyevinn/mp4ff/bitsMIT2025-02-26
github.com/Eyevinn/mp4ff/mp4MIT2025-02-26
github.com/Eyevinn/mp4ffMIT2025-02-26
github.com/go-chi/chi/v5MIT2025-02-26
github.com/go-openapi/jsonpointerApache-2.02025-02-26
github.com/go-openapi/jsonreferenceApache-2.02025-02-26
github.com/go-openapi/specApache-2.02025-02-26
github.com/go-openapi/swagApache-2.02025-02-26
github.com/go-playground/localesMIT2025-02-26
github.com/go-playground/universal-translatorMIT2025-02-26
github.com/go-playground/validatorMIT2025-02-26
github.com/hashicorp/errwrapMPL-2.02025-02-26
github.com/hashicorp/go-multierrorMPL-2.02025-02-26
github.com/jlaffaye/ftpISC2025-02-26
github.com/jmespath/go-jmespathApache-2.02025-02-26
github.com/josharian/internMIT2025-02-26
github.com/klauspost/cpuid/v2MIT2025-02-26
github.com/KyleBanks/depthMIT2025-02-26
github.com/leodido/go-urnMIT2025-02-26
github.com/libdns/libdnsMIT2025-02-26
github.com/mailru/easyjsonMIT2025-02-26
github.com/mattn/go-colorableMIT2025-02-26
github.com/mattn/go-isattyMIT2025-02-26
github.com/mholt/acmez/v2Apache-2.02025-02-26
github.com/miekg/dnsBSD-3-Clause2025-02-26
github.com/rs/zerologMIT2025-02-26
github.com/swaggo/files/v2MIT2025-02-26
github.com/swaggo/http-swagger/v2MIT2025-02-26
github.com/swaggo/swagMIT2025-02-26
github.com/zeebo/blake3CC0-1.02025-02-26
go.uber.org/multierrMIT2025-02-26
go.uber.org/zapMIT2025-02-26
golang.org/x/cryptoBSD-3-Clause2025-02-26
golang.org/x/exp/constraintsBSD-3-Clause2025-02-26
golang.org/x/netBSD-3-Clause2025-02-26
golang.org/x/sys/unixBSD-3-Clause2025-02-26
golang.org/x/textBSD-3-Clause2025-02-26
golang.org/x/time/rateBSD-3-Clause2025-02-26
golang.org/x/toolsBSD-3-Clause2025-02-26
gopkg.in/yaml.v3MIT2025-02-26

License Details

This section includes all the licenses/notices for each dependency verbatim

github.com/asticode/go-astikit

LICENSE

MIT License

Copyright (c) 2020 Quentin Renard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/asticode/go-astisub

LICENSE

MIT License

Copyright (c) 2016 Quentin Renard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/asticode/go-astits

LICENSE

MIT License

Copyright (c) 2017 Quentin Renard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/aws/aws-sdk-go

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

AWS SDK for Go Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. Copyright 2014-2015 Stripe, Inc.

github.com/aws/aws-sdk-go/internal/sync/singleflight

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/barkimedes/go-deepcopy

LICENSE

MIT License

Copyright (c) 2020 Sabrina Williams

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/caddyserver/certmagic

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "{}"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright {yyyy} {name of copyright owner}

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/caddyserver/zerossl

LICENSE

MIT License

Copyright (c) 2024 Matthew Holt

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/Comcast/gots

LICENSE

/* MIT License

Copyright 2016 Comcast Cable Communications Management, LLC

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */

NOTICE

Go Transport Stream Library Copyright 2016 Comcast Cable Communications Management, LLC This product includes software developed at Comcast (http://www.comcast.com/).

github.com/coreos/go-systemd/v22/journal

LICENSE

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  1. Grant of Copyright License.

Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  1. Grant of Patent License.

Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  1. Redistribution.

You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

You must give any other recipients of the Work or Derivative Works a copy of this License; and You must cause any modified files to carry prominent notices stating that You changed the files; and You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  1. Submission of Contributions.

Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  1. Trademarks.

This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  1. Disclaimer of Warranty.

Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  1. Limitation of Liability.

In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  1. Accepting Warranty or Additional Liability.

While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets “[]” replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

CoreOS Project Copyright 2018 CoreOS, Inc

This product includes software developed at CoreOS, Inc. (http://www.coreos.com/).

github.com/Dash-Industry-Forum/livesim2/pkg

LICENSE

livesim2 BSD License Agreement

The copyright in this software is being made available under the BSD License, included below. This software may be subject to other third party and contributor rights, including patent rights, and no such rights are granted under this license.

Copyright (c) 2023, Dash Industry Forum. All rights reserved.

  • Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of the Dash Industry Forum nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/Eyevinn/dash-mpd/mpd

LICENSE

MIT License

Copyright (c) 2023 Eyevinn Technology AB.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/Eyevinn/dash-mpd/xml

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/Eyevinn/mp4ff

LICENSE

MIT License

Copyright (c) 2019-2022 Edgeware AB, 2023- Eyevinn Technology AB

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/Eyevinn/mp4ff/bits

LICENSE

Copyright

Copyright (c) 2019-2022 Edgeware AB, 2023- Eyevinn Technology AB.

Some code in this directory comes from or is based on https://github.com/tcnksm/go-casper/tree/master/internal/bits Copyright (c) 2017 Taichi Nakashima.

All code has the same MIT License.

License

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/Eyevinn/mp4ff/mp4

LICENSE

Copyright

Most code is Copyright (c) 2019-2022 Edgeware AB, 2023- Eyevinn Technology AB.

Some code in this directory comes from or is based on https://github.com/jfbus/mp4 which has Copyright (c) 2015 Jean-François Bustarret.

All code has the same MIT License.

License

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-chi/chi/v5

LICENSE

Copyright (c) 2015-present Peter Kieltyka (https://github.com/pkieltyka), Google Inc.

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-openapi/jsonpointer

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-openapi/jsonreference

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-openapi/spec

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-openapi/swag

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-playground/locales

LICENSE

The MIT License (MIT)

Copyright (c) 2016 Go Playground

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-playground/universal-translator

LICENSE

The MIT License (MIT)

Copyright (c) 2016 Go Playground

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-playground/validator

LICENSE

The MIT License (MIT)

Copyright (c) 2015 Dean Karn

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/hashicorp/errwrap

LICENSE

Mozilla Public License, version 2.0

  1. Definitions

1.1. “Contributor”

 means each individual or legal entity that creates, contributes to the
 creation of, or owns Covered Software.

1.2. “Contributor Version”

 means the combination of the Contributions of others (if any) used by a
 Contributor and that particular Contributor’s Contribution.

1.3. “Contribution”

 means Covered Software of a particular Contributor.

1.4. “Covered Software”

 means Source Code Form to which the initial Contributor has attached the
 notice in Exhibit A, the Executable Form of such Source Code Form, and
 Modifications of such Source Code Form, in each case including portions
 thereof.

1.5. “Incompatible With Secondary Licenses” means

 a. that the initial Contributor has attached the notice described in
    Exhibit B to the Covered Software; or

 b. that the Covered Software was made available under the terms of version
    1.1 or earlier of the License, but not also under the terms of a
    Secondary License.

1.6. “Executable Form”

 means any form of the work other than Source Code Form.

1.7. “Larger Work”

 means a work that combines Covered Software with other material, in a separate
 file or files, that is not Covered Software.

1.8. “License”

 means this document.

1.9. “Licensable”

 means having the right to grant, to the maximum extent possible, whether at the
 time of the initial grant or subsequently, any and all of the rights conveyed by
 this License.

1.10. “Modifications”

 means any of the following:

 a. any file in Source Code Form that results from an addition to, deletion
    from, or modification of the contents of Covered Software; or

 b. any new file in Source Code Form that contains any Covered Software.

1.11. “Patent Claims” of a Contributor

  means any patent claim(s), including without limitation, method, process,
  and apparatus claims, in any patent Licensable by such Contributor that
  would be infringed, but for the grant of the License, by the making,
  using, selling, offering for sale, having made, import, or transfer of
  either its Contributions or its Contributor Version.

1.12. “Secondary License”

  means either the GNU General Public License, Version 2.0, the GNU Lesser
  General Public License, Version 2.1, the GNU Affero General Public
  License, Version 3.0, or any later versions of those licenses.

1.13. “Source Code Form”

  means the form of the work preferred for making modifications.

1.14. “You” (or “Your”)

  means an individual or a legal entity exercising rights under this
  License. For legal entities, “You” includes any entity that controls, is
  controlled by, or is under common control with You. For purposes of this
  definition, “control” means (a) the power, direct or indirect, to cause
  the direction or management of such entity, whether by contract or
  otherwise, or (b) ownership of more than fifty percent (50%) of the
  outstanding shares or beneficial ownership of such entity.
  1. License Grants and Conditions

2.1. Grants

 Each Contributor hereby grants You a world-wide, royalty-free,
 non-exclusive license:

 a. under intellectual property rights (other than patent or trademark)
    Licensable by such Contributor to use, reproduce, make available,
    modify, display, perform, distribute, and otherwise exploit its
    Contributions, either on an unmodified basis, with Modifications, or as
    part of a Larger Work; and

 b. under Patent Claims of such Contributor to make, use, sell, offer for
    sale, have made, import, and otherwise transfer either its Contributions
    or its Contributor Version.

2.2. Effective Date

 The licenses granted in Section 2.1 with respect to any Contribution become
 effective for each Contribution on the date the Contributor first distributes
 such Contribution.

2.3. Limitations on Grant Scope

 The licenses granted in this Section 2 are the only rights granted under this
 License. No additional rights or licenses will be implied from the distribution
 or licensing of Covered Software under this License. Notwithstanding Section
 2.1(b) above, no patent license is granted by a Contributor:

 a. for any code that a Contributor has removed from Covered Software; or

 b. for infringements caused by: (i) Your and any other third party’s
    modifications of Covered Software, or (ii) the combination of its
    Contributions with other software (except as part of its Contributor
    Version); or

 c. under Patent Claims infringed by Covered Software in the absence of its
    Contributions.

 This License does not grant any rights in the trademarks, service marks, or
 logos of any Contributor (except as may be necessary to comply with the
 notice requirements in Section 3.4).

2.4. Subsequent Licenses

 No Contributor makes additional grants as a result of Your choice to
 distribute the Covered Software under a subsequent version of this License
 (see Section 10.2) or under the terms of a Secondary License (if permitted
 under the terms of Section 3.3).

2.5. Representation

 Each Contributor represents that the Contributor believes its Contributions
 are its original creation(s) or it has sufficient rights to grant the
 rights to its Contributions conveyed by this License.

2.6. Fair Use

 This License is not intended to limit any rights You have under applicable
 copyright doctrines of fair use, fair dealing, or other equivalents.

2.7. Conditions

 Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
 Section 2.1.
  1. Responsibilities

3.1. Distribution of Source Form

 All distribution of Covered Software in Source Code Form, including any
 Modifications that You create or to which You contribute, must be under the
 terms of this License. You must inform recipients that the Source Code Form
 of the Covered Software is governed by the terms of this License, and how
 they can obtain a copy of this License. You may not attempt to alter or
 restrict the recipients’ rights in the Source Code Form.

3.2. Distribution of Executable Form

 If You distribute Covered Software in Executable Form then:

 a. such Covered Software must also be made available in Source Code Form,
    as described in Section 3.1, and You must inform recipients of the
    Executable Form how they can obtain a copy of such Source Code Form by
    reasonable means in a timely manner, at a charge no more than the cost
    of distribution to the recipient; and

 b. You may distribute such Executable Form under the terms of this License,
    or sublicense it under different terms, provided that the license for
    the Executable Form does not attempt to limit or alter the recipients’
    rights in the Source Code Form under this License.

3.3. Distribution of a Larger Work

 You may create and distribute a Larger Work under terms of Your choice,
 provided that You also comply with the requirements of this License for the
 Covered Software. If the Larger Work is a combination of Covered Software
 with a work governed by one or more Secondary Licenses, and the Covered
 Software is not Incompatible With Secondary Licenses, this License permits
 You to additionally distribute such Covered Software under the terms of
 such Secondary License(s), so that the recipient of the Larger Work may, at
 their option, further distribute the Covered Software under the terms of
 either this License or such Secondary License(s).

3.4. Notices

 You may not remove or alter the substance of any license notices (including
 copyright notices, patent notices, disclaimers of warranty, or limitations
 of liability) contained within the Source Code Form of the Covered
 Software, except that You may alter any license notices to the extent
 required to remedy known factual inaccuracies.

3.5. Application of Additional Terms

 You may choose to offer, and to charge a fee for, warranty, support,
 indemnity or liability obligations to one or more recipients of Covered
 Software. However, You may do so only on Your own behalf, and not on behalf
 of any Contributor. You must make it absolutely clear that any such
 warranty, support, indemnity, or liability obligation is offered by You
 alone, and You hereby agree to indemnify every Contributor for any
 liability incurred by such Contributor as a result of warranty, support,
 indemnity or liability terms You offer. You may include additional
 disclaimers of warranty and limitations of liability specific to any
 jurisdiction.
  1. Inability to Comply Due to Statute or Regulation

    If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.

  2. Termination

5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice.

5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate.

5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination.

  1. Disclaimer of Warranty

    Covered Software is provided under this License on an “as is” basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer.

  2. Limitation of Liability

    Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party’s negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You.

  3. Litigation

    Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party’s ability to bring cross-claims or counter-claims.

  4. Miscellaneous

    This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor.

  5. Versions of the License

10.1. New Versions

  Mozilla Foundation is the license steward. Except as provided in Section
  10.3, no one other than the license steward has the right to modify or
  publish new versions of this License. Each version will be given a
  distinguishing version number.

10.2. Effect of New Versions

  You may distribute the Covered Software under the terms of the version of
  the License under which You originally received the Covered Software, or
  under the terms of any subsequent version published by the license
  steward.

10.3. Modified Versions

  If you create software not governed by this License, and you want to
  create a new license for such software, you may create and use a modified
  version of this License if you rename the license and remove any
  references to the name of the license steward (except to note that such
  modified license differs from this License).

10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached.

Exhibit A - Source Code Form License Notice

  This Source Code Form is subject to the
  terms of the Mozilla Public License, v.
  2.0. If a copy of the MPL was not
  distributed with this file, You can
  obtain one at
  http://mozilla.org/MPL/2.0/.

If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice.

You may add additional accurate notices of copyright ownership.

Exhibit B - “Incompatible With Secondary Licenses” Notice

  This Source Code Form is “Incompatible
  With Secondary Licenses”, as defined by
  the Mozilla Public License, v. 2.0.

README

errwrap

errwrap is a package for Go that formalizes the pattern of wrapping errors and checking if an error contains another error.

There is a common pattern in Go of taking a returned error value and then wrapping it (such as with fmt.Errorf) before returning it. The problem with this pattern is that you completely lose the original error structure.

Arguably the correct approach is that you should make a custom structure implementing the error interface, and have the original error as a field on that structure, such as this example. This is a good approach, but you have to know the entire chain of possible rewrapping that happens, when you might just care about one.

errwrap formalizes this pattern (it doesn’t matter what approach you use above) by giving a single interface for wrapping errors, checking if a specific error is wrapped, and extracting that error.

Installation and Docs

Install using go get github.com/hashicorp/errwrap.

Full documentation is available at http://godoc.org/github.com/hashicorp/errwrap

Usage

Basic Usage

Below is a very basic example of its usage:

// A function that always returns an error, but wraps it, like a real
// function might.
func tryOpen() error {
   _, err := os.Open("/i/dont/exist")
   if err != nil {
      return errwrap.Wrapf("Doesn't exist: {{err}}", err)
   }

   return nil
}

func main() {
   err := tryOpen()

   // We can use the Contains helpers to check if an error contains
   // another error. It is safe to do this with a nil error, or with
   // an error that doesn't even use the errwrap package.
   if errwrap.Contains(err, "does not exist") {
      // Do something
   }
   if errwrap.ContainsType(err, new(os.PathError)) {
      // Do something
   }

   // Or we can use the associated `Get` functions to just extract
   // a specific error. This would return nil if that specific error doesn't
   // exist.
   perr := errwrap.GetType(err, new(os.PathError))
}

Custom Types

If you’re already making custom types that properly wrap errors, then you can get all the functionality of errwraps.Contains and such by implementing the Wrapper interface with just one function. Example:

type AppError {
  Code ErrorCode
  Err  error
}

func (e *AppError) WrappedErrors() []error {
  return []error{e.Err}
}

Now this works:

err := &AppError{Err: fmt.Errorf("an error")}
if errwrap.ContainsType(err, fmt.Errorf("")) {
   // This will work!
}

errwrap

// Package errwrap implements methods to formalize error wrapping in Go. // // All of the top-level functions that take an error are built to be able // to take any error, not just wrapped errors. This allows you to use errwrap // without having to type-check and type-cast everywhere. package errwrap

import ( “errors” “reflect” “strings” )

// WalkFunc is the callback called for Walk. type WalkFunc func(error)

// Wrapper is an interface that can be implemented by custom types to // have all the Contains, Get, etc. functions in errwrap work. // // When Walk reaches a Wrapper, it will call the callback for every // wrapped error in addition to the wrapper itself. Since all the top-level // functions in errwrap use Walk, this means that all those functions work // with your custom type. type Wrapper interface { WrappedErrors() []error }

// Wrap defines that outer wraps inner, returning an error type that // can be cleanly used with the other methods in this package, such as // Contains, GetAll, etc. // // This function won’t modify the error message at all (the outer message // will be used). func Wrap(outer, inner error) error { return &wrappedError{ Outer: outer, Inner: inner, } }

// Wrapf wraps an error with a formatting message. This is similar to using // fmt.Errorf to wrap an error. If you’re using fmt.Errorf to wrap // errors, you should replace it with this. // // format is the format of the error message. The string ‘{{err}}’ will // be replaced with the original error message. // // Deprecated: Use fmt.Errorf() func Wrapf(format string, err error) error { outerMsg := “” if err != nil { outerMsg = err.Error() }

outer := errors.New(strings.Replace( format, “{{err}}”, outerMsg, -1))

return Wrap(outer, err) }

// Contains checks if the given error contains an error with the // message msg. If err is not a wrapped error, this will always return // false unless the error itself happens to match this msg. func Contains(err error, msg string) bool { return len(GetAll(err, msg)) > 0 }

// ContainsType checks if the given error contains an error with // the same concrete type as v. If err is not a wrapped error, this will // check the err itself. func ContainsType(err error, v interface{}) bool { return len(GetAllType(err, v)) > 0 }

// Get is the same as GetAll but returns the deepest matching error. func Get(err error, msg string) error { es := GetAll(err, msg) if len(es) > 0 { return es[len(es)-1] }

return nil }

// GetType is the same as GetAllType but returns the deepest matching error. func GetType(err error, v interface{}) error { es := GetAllType(err, v) if len(es) > 0 { return es[len(es)-1] }

return nil }

// GetAll gets all the errors that might be wrapped in err with the // given message. The order of the errors is such that the outermost // matching error (the most recent wrap) is index zero, and so on. func GetAll(err error, msg string) []error { var result []error

Walk(err, func(err error) { if err.Error() == msg { result = append(result, err) } })

return result }

// GetAllType gets all the errors that are the same type as v. // // The order of the return value is the same as described in GetAll. func GetAllType(err error, v interface{}) []error { var result []error

var search string if v != nil { search = reflect.TypeOf(v).String() } Walk(err, func(err error) { var needle string if err != nil { needle = reflect.TypeOf(err).String() }

  if needle == search {
     result = append(result, err)
  }

})

return result }

// Walk walks all the wrapped errors in err and calls the callback. If // err isn’t a wrapped error, this will be called once for err. If err // is a wrapped error, the callback will be called for both the wrapper // that implements error as well as the wrapped error itself. func Walk(err error, cb WalkFunc) { if err == nil { return }

switch e := err.(type) { case *wrappedError: cb(e.Outer) Walk(e.Inner, cb) case Wrapper: cb(err)

  for _, err := range e.WrappedErrors() {
     Walk(err, cb)
  }

case interface{ Unwrap() error }: cb(err) Walk(e.Unwrap(), cb) default: cb(err) } }

// wrappedError is an implementation of error that has both the // outer and inner errors. type wrappedError struct { Outer error Inner error }

func (w *wrappedError) Error() string { return w.Outer.Error() }

func (w *wrappedError) WrappedErrors() []error { return []error{w.Outer, w.Inner} }

func (w *wrappedError) Unwrap() error { return w.Inner }

errwrap_test

package errwrap

import ( “errors” “fmt” “testing” )

func TestWrappedError_impl(t *testing.T) { var _ error = new(wrappedError) }

func TestGetAll(t *testing.T) { cases := []struct { Err error Msg string Len int }{ {}, { fmt.Errorf(“foo”), “foo”, 1, }, { fmt.Errorf(“bar”), “foo”, 0, }, { Wrapf(“bar”, fmt.Errorf(“foo”)), “foo”, 1, }, { Wrapf("{{err}}", fmt.Errorf(“foo”)), “foo”, 2, }, { Wrapf(“bar”, Wrapf(“baz”, fmt.Errorf(“foo”))), “foo”, 1, }, { fmt.Errorf(“foo: %w”, fmt.Errorf(“bar”)), “foo: bar”, 1, }, { fmt.Errorf(“foo: %w”, fmt.Errorf(“bar”)), “bar”, 1, }, }

for i, tc := range cases { actual := GetAll(tc.Err, tc.Msg) if len(actual) != tc.Len { t.Fatalf("%d: bad: %#v", i, actual) } for _, v := range actual { if v.Error() != tc.Msg { t.Fatalf("%d: bad: %#v", i, actual) } } } }

func TestGetAllType(t *testing.T) { cases := []struct { Err error Type interface{} Len int }{ {}, { fmt.Errorf(“foo”), “foo”, 0, }, { fmt.Errorf(“bar”), fmt.Errorf(“foo”), 1, }, { Wrapf(“bar”, fmt.Errorf(“foo”)), fmt.Errorf(“baz”), 2, }, { Wrapf(“bar”, Wrapf(“baz”, fmt.Errorf(“foo”))), Wrapf("", nil), 0, }, { fmt.Errorf(“one: %w”, fmt.Errorf(“two: %w”, fmt.Errorf(“three”))), fmt.Errorf("%w", errors.New("")), 2, }, }

for i, tc := range cases { actual := GetAllType(tc.Err, tc.Type) if len(actual) != tc.Len { t.Fatalf("%d: bad: %#v", i, actual) } } }

func TestWrappedError_IsCompatibleWithErrorsUnwrap(t *testing.T) { inner := errors.New(“inner error”) err := Wrap(errors.New(“outer”), inner) actual := errors.Unwrap(err) if actual != inner { t.Fatal(“wrappedError did not unwrap to inner”) } }

go

module github.com/hashicorp/errwrap

github.com/hashicorp/go-multierror

LICENSE

Mozilla Public License, version 2.0

  1. Definitions

1.1. “Contributor”

 means each individual or legal entity that creates, contributes to the
 creation of, or owns Covered Software.

1.2. “Contributor Version”

 means the combination of the Contributions of others (if any) used by a
 Contributor and that particular Contributor’s Contribution.

1.3. “Contribution”

 means Covered Software of a particular Contributor.

1.4. “Covered Software”

 means Source Code Form to which the initial Contributor has attached the
 notice in Exhibit A, the Executable Form of such Source Code Form, and
 Modifications of such Source Code Form, in each case including portions
 thereof.

1.5. “Incompatible With Secondary Licenses” means

 a. that the initial Contributor has attached the notice described in
    Exhibit B to the Covered Software; or

 b. that the Covered Software was made available under the terms of version
    1.1 or earlier of the License, but not also under the terms of a
    Secondary License.

1.6. “Executable Form”

 means any form of the work other than Source Code Form.

1.7. “Larger Work”

 means a work that combines Covered Software with other material, in a separate
 file or files, that is not Covered Software.

1.8. “License”

 means this document.

1.9. “Licensable”

 means having the right to grant, to the maximum extent possible, whether at the
 time of the initial grant or subsequently, any and all of the rights conveyed by
 this License.

1.10. “Modifications”

 means any of the following:

 a. any file in Source Code Form that results from an addition to, deletion
    from, or modification of the contents of Covered Software; or

 b. any new file in Source Code Form that contains any Covered Software.

1.11. “Patent Claims” of a Contributor

  means any patent claim(s), including without limitation, method, process,
  and apparatus claims, in any patent Licensable by such Contributor that
  would be infringed, but for the grant of the License, by the making,
  using, selling, offering for sale, having made, import, or transfer of
  either its Contributions or its Contributor Version.

1.12. “Secondary License”

  means either the GNU General Public License, Version 2.0, the GNU Lesser
  General Public License, Version 2.1, the GNU Affero General Public
  License, Version 3.0, or any later versions of those licenses.

1.13. “Source Code Form”

  means the form of the work preferred for making modifications.

1.14. “You” (or “Your”)

  means an individual or a legal entity exercising rights under this
  License. For legal entities, “You” includes any entity that controls, is
  controlled by, or is under common control with You. For purposes of this
  definition, “control” means (a) the power, direct or indirect, to cause
  the direction or management of such entity, whether by contract or
  otherwise, or (b) ownership of more than fifty percent (50%) of the
  outstanding shares or beneficial ownership of such entity.
  1. License Grants and Conditions

2.1. Grants

 Each Contributor hereby grants You a world-wide, royalty-free,
 non-exclusive license:

 a. under intellectual property rights (other than patent or trademark)
    Licensable by such Contributor to use, reproduce, make available,
    modify, display, perform, distribute, and otherwise exploit its
    Contributions, either on an unmodified basis, with Modifications, or as
    part of a Larger Work; and

 b. under Patent Claims of such Contributor to make, use, sell, offer for
    sale, have made, import, and otherwise transfer either its Contributions
    or its Contributor Version.

2.2. Effective Date

 The licenses granted in Section 2.1 with respect to any Contribution become
 effective for each Contribution on the date the Contributor first distributes
 such Contribution.

2.3. Limitations on Grant Scope

 The licenses granted in this Section 2 are the only rights granted under this
 License. No additional rights or licenses will be implied from the distribution
 or licensing of Covered Software under this License. Notwithstanding Section
 2.1(b) above, no patent license is granted by a Contributor:

 a. for any code that a Contributor has removed from Covered Software; or

 b. for infringements caused by: (i) Your and any other third party’s
    modifications of Covered Software, or (ii) the combination of its
    Contributions with other software (except as part of its Contributor
    Version); or

 c. under Patent Claims infringed by Covered Software in the absence of its
    Contributions.

 This License does not grant any rights in the trademarks, service marks, or
 logos of any Contributor (except as may be necessary to comply with the
 notice requirements in Section 3.4).

2.4. Subsequent Licenses

 No Contributor makes additional grants as a result of Your choice to
 distribute the Covered Software under a subsequent version of this License
 (see Section 10.2) or under the terms of a Secondary License (if permitted
 under the terms of Section 3.3).

2.5. Representation

 Each Contributor represents that the Contributor believes its Contributions
 are its original creation(s) or it has sufficient rights to grant the
 rights to its Contributions conveyed by this License.

2.6. Fair Use

 This License is not intended to limit any rights You have under applicable
 copyright doctrines of fair use, fair dealing, or other equivalents.

2.7. Conditions

 Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
 Section 2.1.
  1. Responsibilities

3.1. Distribution of Source Form

 All distribution of Covered Software in Source Code Form, including any
 Modifications that You create or to which You contribute, must be under the
 terms of this License. You must inform recipients that the Source Code Form
 of the Covered Software is governed by the terms of this License, and how
 they can obtain a copy of this License. You may not attempt to alter or
 restrict the recipients’ rights in the Source Code Form.

3.2. Distribution of Executable Form

 If You distribute Covered Software in Executable Form then:

 a. such Covered Software must also be made available in Source Code Form,
    as described in Section 3.1, and You must inform recipients of the
    Executable Form how they can obtain a copy of such Source Code Form by
    reasonable means in a timely manner, at a charge no more than the cost
    of distribution to the recipient; and

 b. You may distribute such Executable Form under the terms of this License,
    or sublicense it under different terms, provided that the license for
    the Executable Form does not attempt to limit or alter the recipients’
    rights in the Source Code Form under this License.

3.3. Distribution of a Larger Work

 You may create and distribute a Larger Work under terms of Your choice,
 provided that You also comply with the requirements of this License for the
 Covered Software. If the Larger Work is a combination of Covered Software
 with a work governed by one or more Secondary Licenses, and the Covered
 Software is not Incompatible With Secondary Licenses, this License permits
 You to additionally distribute such Covered Software under the terms of
 such Secondary License(s), so that the recipient of the Larger Work may, at
 their option, further distribute the Covered Software under the terms of
 either this License or such Secondary License(s).

3.4. Notices

 You may not remove or alter the substance of any license notices (including
 copyright notices, patent notices, disclaimers of warranty, or limitations
 of liability) contained within the Source Code Form of the Covered
 Software, except that You may alter any license notices to the extent
 required to remedy known factual inaccuracies.

3.5. Application of Additional Terms

 You may choose to offer, and to charge a fee for, warranty, support,
 indemnity or liability obligations to one or more recipients of Covered
 Software. However, You may do so only on Your own behalf, and not on behalf
 of any Contributor. You must make it absolutely clear that any such
 warranty, support, indemnity, or liability obligation is offered by You
 alone, and You hereby agree to indemnify every Contributor for any
 liability incurred by such Contributor as a result of warranty, support,
 indemnity or liability terms You offer. You may include additional
 disclaimers of warranty and limitations of liability specific to any
 jurisdiction.
  1. Inability to Comply Due to Statute or Regulation

    If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.

  2. Termination

5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice.

5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate.

5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination.

  1. Disclaimer of Warranty

    Covered Software is provided under this License on an “as is” basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer.

  2. Limitation of Liability

    Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party’s negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You.

  3. Litigation

    Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party’s ability to bring cross-claims or counter-claims.

  4. Miscellaneous

    This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor.

  5. Versions of the License

10.1. New Versions

  Mozilla Foundation is the license steward. Except as provided in Section
  10.3, no one other than the license steward has the right to modify or
  publish new versions of this License. Each version will be given a
  distinguishing version number.

10.2. Effect of New Versions

  You may distribute the Covered Software under the terms of the version of
  the License under which You originally received the Covered Software, or
  under the terms of any subsequent version published by the license
  steward.

10.3. Modified Versions

  If you create software not governed by this License, and you want to
  create a new license for such software, you may create and use a modified
  version of this License if you rename the license and remove any
  references to the name of the license steward (except to note that such
  modified license differs from this License).

10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached.

Exhibit A - Source Code Form License Notice

  This Source Code Form is subject to the
  terms of the Mozilla Public License, v.
  2.0. If a copy of the MPL was not
  distributed with this file, You can
  obtain one at
  http://mozilla.org/MPL/2.0/.

If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice.

You may add additional accurate notices of copyright ownership.

Exhibit B - “Incompatible With Secondary Licenses” Notice

  This Source Code Form is “Incompatible
  With Secondary Licenses”, as defined by
  the Mozilla Public License, v. 2.0.

Makefile

TEST?=./…

default: test

test runs the test suite and vets the code.

test: generate @echo “==> Running tests…” @go list $(TEST)
| grep -v “/vendor/”
| xargs -n1 go test -timeout=60s -parallel=10 ${TESTARGS}

testrace runs the race checker

testrace: generate @echo “==> Running tests (race)…” @go list $(TEST)
| grep -v “/vendor/”
| xargs -n1 go test -timeout=60s -race ${TESTARGS}

updatedeps installs all the dependencies needed to run and build.

updatedeps: @sh -c “’${CURDIR}/scripts/deps.sh’ ‘${NAME}’”

generate runs go generate to build the dynamically generated source files.

generate: @echo “==> Generating…” @find . -type f -name ‘.DS_Store’ -delete @go list ./…
| grep -v “/vendor/”
| xargs -n1 go generate

.PHONY: default test testrace updatedeps generate

README

go-multierror

CircleCI Go Reference GitHub go.mod Go version

go-multierror is a package for Go that provides a mechanism for representing a list of error values as a single error.

This allows a function in Go to return an error that might actually be a list of errors. If the caller knows this, they can unwrap the list and access the errors. If the caller doesn’t know, the error formats to a nice human-readable format.

go-multierror is fully compatible with the Go standard library errors package, including the functions As, Is, and Unwrap. This provides a standardized approach for introspecting on error values.

Installation and Docs

Install using go get github.com/hashicorp/go-multierror.

Full documentation is available at https://pkg.go.dev/github.com/hashicorp/go-multierror

Requires go version 1.13 or newer

go-multierror requires go version 1.13 or newer. Go 1.13 introduced error wrapping, which this library takes advantage of.

If you need to use an earlier version of go, you can use the v1.0.0 tag, which doesn’t rely on features in go 1.13.

If you see compile errors that look like the below, it’s likely that you’re on an older version of go:

/go/src/github.com/hashicorp/go-multierror/multierror.go:112:9: undefined: errors.As
/go/src/github.com/hashicorp/go-multierror/multierror.go:117:9: undefined: errors.Is

Usage

go-multierror is easy to use and purposely built to be unobtrusive in existing Go applications/libraries that may not be aware of it.

Building a list of errors

The Append function is used to create a list of errors. This function behaves a lot like the Go built-in append function: it doesn’t matter if the first argument is nil, a multierror.Error, or any other error, the function behaves as you would expect.

var result error

if err := step1(); err != nil {
   result = multierror.Append(result, err)
}
if err := step2(); err != nil {
   result = multierror.Append(result, err)
}

return result

Customizing the formatting of the errors

By specifying a custom ErrorFormat, you can customize the format of the Error() string function:

var result *multierror.Error

// ... accumulate errors here, maybe using Append

if result != nil {
   result.ErrorFormat = func([]error) string {
      return "errors!"
   }
}

Accessing the list of errors

multierror.Error implements error so if the caller doesn’t know about multierror, it will work just fine. But if you’re aware a multierror might be returned, you can use type switches to access the list of errors:

if err := something(); err != nil {
   if merr, ok := err.(*multierror.Error); ok {
      // Use merr.Errors
   }
}

You can also use the standard errors.Unwrap function. This will continue to unwrap into subsequent errors until none exist.

Extracting an error

The standard library errors.As function can be used directly with a multierror to extract a specific error:

// Assume err is a multierror value
err := somefunc()

// We want to know if "err" has a "RichErrorType" in it and extract it.
var errRich RichErrorType
if errors.As(err, &errRich) {
   // It has it, and now errRich is populated.
}

Checking for an exact error value

Some errors are returned as exact errors such as the ErrNotExist error in the os package. You can check if this error is present by using the standard errors.Is function.

// Assume err is a multierror value
err := somefunc()
if errors.Is(err, os.ErrNotExist) {
   // err contains os.ErrNotExist
}

Returning a multierror only if there are errors

If you build a multierror.Error, you can use the ErrorOrNil function to return an error implementation only if there are errors to return:

var result *multierror.Error

// ... accumulate errors here

// Return the `error` only if errors were added to the multierror, otherwise
// return nil since there are no errors.
return result.ErrorOrNil()

append

package multierror

// Append is a helper function that will append more errors // onto an Error in order to create a larger multi-error. // // If err is not a multierror.Error, then it will be turned into // one. If any of the errs are multierr.Error, they will be flattened // one level into err. // Any nil errors within errs will be ignored. If err is nil, a new // *Error will be returned. func Append(err error, errs …error) *Error { switch err := err.(type) { case *Error: // Typed nils can reach here, so initialize if we are nil if err == nil { err = new(Error) }

  // Go through each error and flatten
  for _, e := range errs {
     switch e := e.(type) {
     case *Error:
        if e != nil {
           err.Errors = append(err.Errors, e.Errors...)
        }
     default:
        if e != nil {
           err.Errors = append(err.Errors, e)
        }
     }
  }

  return err

default: newErrs := make([]error, 0, len(errs)+1) if err != nil { newErrs = append(newErrs, err) } newErrs = append(newErrs, errs…)

  return Append(&Error{}, newErrs...)

} }

append_test

package multierror

import ( “errors” “testing” )

func TestAppend_Error(t *testing.T) { original := &Error{ Errors: []error{errors.New(“foo”)}, }

result := Append(original, errors.New(“bar”)) if len(result.Errors) != 2 { t.Fatalf(“wrong len: %d”, len(result.Errors)) }

original = &Error{} result = Append(original, errors.New(“bar”)) if len(result.Errors) != 1 { t.Fatalf(“wrong len: %d”, len(result.Errors)) }

// Test when a typed nil is passed var e *Error result = Append(e, errors.New(“baz”)) if len(result.Errors) != 1 { t.Fatalf(“wrong len: %d”, len(result.Errors)) }

// Test flattening original = &Error{ Errors: []error{errors.New(“foo”)}, }

result = Append(original, Append(nil, errors.New(“foo”), errors.New(“bar”))) if len(result.Errors) != 3 { t.Fatalf(“wrong len: %d”, len(result.Errors)) } }

func TestAppend_NilError(t *testing.T) { var err error result := Append(err, errors.New(“bar”)) if len(result.Errors) != 1 { t.Fatalf(“wrong len: %d”, len(result.Errors)) } }

func TestAppend_NilErrorArg(t *testing.T) { var err error var nilErr *Error result := Append(err, nilErr) if len(result.Errors) != 0 { t.Fatalf(“wrong len: %d”, len(result.Errors)) } }

func TestAppend_NilErrorIfaceArg(t *testing.T) { var err error var nilErr error result := Append(err, nilErr) if len(result.Errors) != 0 { t.Fatalf(“wrong len: %d”, len(result.Errors)) } }

func TestAppend_NonError(t *testing.T) { original := errors.New(“foo”) result := Append(original, errors.New(“bar”)) if len(result.Errors) != 2 { t.Fatalf(“wrong len: %d”, len(result.Errors)) } }

func TestAppend_NonError_Error(t *testing.T) { original := errors.New(“foo”) result := Append(original, Append(nil, errors.New(“bar”))) if len(result.Errors) != 2 { t.Fatalf(“wrong len: %d”, len(result.Errors)) } }

flatten

package multierror

// Flatten flattens the given error, merging any *Errors together into // a single *Error. func Flatten(err error) error { // If it isn’t an *Error, just return the error as-is if _, ok := err.(*Error); !ok { return err }

// Otherwise, make the result and flatten away! flatErr := new(Error) flatten(err, flatErr) return flatErr }

func flatten(err error, flatErr *Error) { switch err := err.(type) { case *Error: for _, e := range err.Errors { flatten(e, flatErr) } default: flatErr.Errors = append(flatErr.Errors, err) } }

flatten_test

package multierror

import ( “errors” “fmt” “reflect” “testing” )

func TestFlatten(t *testing.T) { original := &Error{ Errors: []error{ errors.New(“one”), &Error{ Errors: []error{ errors.New(“two”), &Error{ Errors: []error{ errors.New(“three”), }, }, }, }, }, }

expected := `3 errors occurred:

  • one
  • two
  • three

` actual := fmt.Sprintf("%s", Flatten(original))

if expected != actual { t.Fatalf(“expected: %s, got: %s”, expected, actual) } }

func TestFlatten_nonError(t *testing.T) { err := errors.New(“foo”) actual := Flatten(err) if !reflect.DeepEqual(actual, err) { t.Fatalf(“bad: %#v”, actual) } }

format

package multierror

import ( “fmt” “strings” )

// ErrorFormatFunc is a function callback that is called by Error to // turn the list of errors into a string. type ErrorFormatFunc func([]error) string

// ListFormatFunc is a basic formatter that outputs the number of errors // that occurred along with a bullet point list of the errors. func ListFormatFunc(es []error) string { if len(es) == 1 { return fmt.Sprintf(“1 error occurred:\n\t* %s\n\n”, es[0]) }

points := make([]string, len(es)) for i, err := range es { points[i] = fmt.Sprintf("* %s", err) }

return fmt.Sprintf( “%d errors occurred:\n\t%s\n\n”, len(es), strings.Join(points, “\n\t”)) }

format_test

package multierror

import ( “errors” “testing” )

func TestListFormatFuncSingle(t *testing.T) { expected := `1 error occurred:

  • foo

`

errors := []error{ errors.New(“foo”), }

actual := ListFormatFunc(errors) if actual != expected { t.Fatalf(“bad: %#v”, actual) } }

func TestListFormatFuncMultiple(t *testing.T) { expected := `2 errors occurred:

  • foo
  • bar

`

errors := []error{ errors.New(“foo”), errors.New(“bar”), }

actual := ListFormatFunc(errors) if actual != expected { t.Fatalf(“bad: %#v”, actual) } }

go

module github.com/hashicorp/go-multierror

go 1.13

require github.com/hashicorp/errwrap v1.0.0

go

github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=

group

package multierror

import “sync”

// Group is a collection of goroutines which return errors that need to be // coalesced. type Group struct { mutex sync.Mutex err *Error wg sync.WaitGroup }

// Go calls the given function in a new goroutine. // // If the function returns an error it is added to the group multierror which // is returned by Wait. func (g *Group) Go(f func() error) { g.wg.Add(1)

go func() { defer g.wg.Done()

  if err := f(); err != nil {
     g.mutex.Lock()
     g.err = Append(g.err, err)
     g.mutex.Unlock()
  }

}() }

// Wait blocks until all function calls from the Go method have returned, then // returns the multierror. func (g *Group) Wait() *Error { g.wg.Wait() g.mutex.Lock() defer g.mutex.Unlock() return g.err }

group_test

package multierror

import ( “errors” “strings” “testing” )

func TestGroup(t *testing.T) { err1 := errors.New(“group_test: 1”) err2 := errors.New(“group_test: 2”)

cases := []struct { errs []error nilResult bool }{ {errs: []error{}, nilResult: true}, {errs: []error{nil}, nilResult: true}, {errs: []error{err1}}, {errs: []error{err1, nil}}, {errs: []error{err1, nil, err2}}, }

for _, tc := range cases { var g Group

  for _, err := range tc.errs {
     err := err
     g.Go(func() error { return err })

  }

  gErr := g.Wait()
  if gErr != nil {
     for i := range tc.errs {
        if tc.errs[i] != nil && !strings.Contains(gErr.Error(), tc.errs[i].Error()) {
           t.Fatalf("expected error to contain %q, actual: %v", tc.errs[i].Error(), gErr)
        }
     }
  } else if !tc.nilResult {
     t.Fatalf("Group.Wait() should not have returned nil for errs: %v", tc.errs)
  }

} }

multierror

package multierror

import ( “errors” “fmt” )

// Error is an error type to track multiple errors. This is used to // accumulate errors in cases and return them as a single “error”. type Error struct { Errors []error ErrorFormat ErrorFormatFunc }

func (e *Error) Error() string { fn := e.ErrorFormat if fn == nil { fn = ListFormatFunc }

return fn(e.Errors) }

// ErrorOrNil returns an error interface if this Error represents // a list of errors, or returns nil if the list of errors is empty. This // function is useful at the end of accumulation to make sure that the value // returned represents the existence of errors. func (e *Error) ErrorOrNil() error { if e == nil { return nil } if len(e.Errors) == 0 { return nil }

return e }

func (e Error) GoString() string { return fmt.Sprintf("%#v", *e) }

// WrappedErrors returns the list of errors that this Error is wrapping. It is // an implementation of the errwrap.Wrapper interface so that multierror.Error // can be used with that library. // // This method is not safe to be called concurrently. Unlike accessing the // Errors field directly, this function also checks if the multierror is nil to // prevent a null-pointer panic. It satisfies the errwrap.Wrapper interface. func (e *Error) WrappedErrors() []error { if e == nil { return nil } return e.Errors }

// Unwrap returns an error from Error (or nil if there are no errors). // This error returned will further support Unwrap to get the next error, // etc. The order will match the order of Errors in the multierror.Error // at the time of calling. // // The resulting error supports errors.As/Is/Unwrap so you can continue // to use the stdlib errors package to introspect further. // // This will perform a shallow copy of the errors slice. Any errors appended // to this error after calling Unwrap will not be available until a new // Unwrap is called on the multierror.Error. func (e *Error) Unwrap() error { // If we have no errors then we do nothing if e == nil || len(e.Errors) == 0 { return nil }

// If we have exactly one error, we can just return that directly. if len(e.Errors) == 1 { return e.Errors[0] }

// Shallow copy the slice errs := make([]error, len(e.Errors)) copy(errs, e.Errors) return chain(errs) }

// chain implements the interfaces necessary for errors.Is/As/Unwrap to // work in a deterministic way with multierror. A chain tracks a list of // errors while accounting for the current represented error. This lets // Is/As be meaningful. // // Unwrap returns the next error. In the cleanest form, Unwrap would return // the wrapped error here but we can’t do that if we want to properly // get access to all the errors. Instead, users are recommended to use // Is/As to get the correct error type out. // // Precondition: []error is non-empty (len > 0) type chain []error

// Error implements the error interface func (e chain) Error() string { return e[0].Error() }

// Unwrap implements errors.Unwrap by returning the next error in the // chain or nil if there are no more errors. func (e chain) Unwrap() error { if len(e) == 1 { return nil }

return e[1:] }

// As implements errors.As by attempting to map to the current value. func (e chain) As(target interface{}) bool { return errors.As(e[0], target) }

// Is implements errors.Is by comparing the current value directly. func (e chain) Is(target error) bool { return errors.Is(e[0], target) }

multierror_test

package multierror

import ( “errors” “fmt” “reflect” “testing” )

func TestError_Impl(t *testing.T) { var _ error = new(Error) }

func TestErrorError_custom(t *testing.T) { errors := []error{ errors.New(“foo”), errors.New(“bar”), }

fn := func(es []error) string { return “foo” }

multi := &Error{Errors: errors, ErrorFormat: fn} if multi.Error() != “foo” { t.Fatalf(“bad: %s”, multi.Error()) } }

func TestErrorError_default(t *testing.T) { expected := `2 errors occurred:

  • foo
  • bar

`

errors := []error{ errors.New(“foo”), errors.New(“bar”), }

multi := &Error{Errors: errors} if multi.Error() != expected { t.Fatalf(“bad: %s”, multi.Error()) } }

func TestErrorErrorOrNil(t *testing.T) { err := new(Error) if err.ErrorOrNil() != nil { t.Fatalf(“bad: %#v”, err.ErrorOrNil()) }

err.Errors = []error{errors.New(“foo”)} if v := err.ErrorOrNil(); v == nil { t.Fatal(“should not be nil”) } else if !reflect.DeepEqual(v, err) { t.Fatalf(“bad: %#v”, v) } }

func TestErrorWrappedErrors(t *testing.T) { errors := []error{ errors.New(“foo”), errors.New(“bar”), }

multi := &Error{Errors: errors} if !reflect.DeepEqual(multi.Errors, multi.WrappedErrors()) { t.Fatalf(“bad: %s”, multi.WrappedErrors()) }

multi = nil if err := multi.WrappedErrors(); err != nil { t.Fatalf(“bad: %#v”, multi) } }

func TestErrorUnwrap(t *testing.T) { t.Run(“with errors”, func(t *testing.T) { err := &Error{Errors: []error{ errors.New(“foo”), errors.New(“bar”), errors.New(“baz”), }}

  var current error = err
  for i := 0; i < len(err.Errors); i++ {
     current = errors.Unwrap(current)
     if !errors.Is(current, err.Errors[i]) {
        t.Fatal("should be next value")
     }
  }

  if errors.Unwrap(current) != nil {
     t.Fatal("should be nil at the end")
  }

})

t.Run(“with no errors”, func(t *testing.T) { err := &Error{Errors: nil} if errors.Unwrap(err) != nil { t.Fatal(“should be nil”) } })

t.Run(“with nil multierror”, func(t *testing.T) { var err *Error if errors.Unwrap(err) != nil { t.Fatal(“should be nil”) } }) }

func TestErrorIs(t *testing.T) { errBar := errors.New(“bar”)

t.Run(“with errBar”, func(t *testing.T) { err := &Error{Errors: []error{ errors.New(“foo”), errBar, errors.New(“baz”), }}

  if !errors.Is(err, errBar) {
     t.Fatal("should be true")
  }

})

t.Run(“with errBar wrapped by fmt.Errorf”, func(t *testing.T) { err := &Error{Errors: []error{ errors.New(“foo”), fmt.Errorf(“errorf: %w”, errBar), errors.New(“baz”), }}

  if !errors.Is(err, errBar) {
     t.Fatal("should be true")
  }

})

t.Run(“without errBar”, func(t *testing.T) { err := &Error{Errors: []error{ errors.New(“foo”), errors.New(“baz”), }}

  if errors.Is(err, errBar) {
     t.Fatal("should be false")
  }

}) }

func TestErrorAs(t *testing.T) { match := &nestedError{}

t.Run(“with the value”, func(t *testing.T) { err := &Error{Errors: []error{ errors.New(“foo”), match, errors.New(“baz”), }}

  var target *nestedError
  if !errors.As(err, &target) {
     t.Fatal("should be true")
  }
  if target == nil {
     t.Fatal("target should not be nil")
  }

})

t.Run(“with the value wrapped by fmt.Errorf”, func(t *testing.T) { err := &Error{Errors: []error{ errors.New(“foo”), fmt.Errorf(“errorf: %w”, match), errors.New(“baz”), }}

  var target *nestedError
  if !errors.As(err, &target) {
     t.Fatal("should be true")
  }
  if target == nil {
     t.Fatal("target should not be nil")
  }

})

t.Run(“without the value”, func(t *testing.T) { err := &Error{Errors: []error{ errors.New(“foo”), errors.New(“baz”), }}

  var target *nestedError
  if errors.As(err, &target) {
     t.Fatal("should be false")
  }
  if target != nil {
     t.Fatal("target should be nil")
  }

}) }

// nestedError implements error and is used for tests. type nestedError struct{}

func (*nestedError) Error() string { return "" }

prefix

package multierror

import ( “fmt”

“github.com/hashicorp/errwrap” )

// Prefix is a helper function that will prefix some text // to the given error. If the error is a multierror.Error, then // it will be prefixed to each wrapped error. // // This is useful to use when appending multiple multierrors // together in order to give better scoping. func Prefix(err error, prefix string) error { if err == nil { return nil }

format := fmt.Sprintf("%s {{err}}", prefix) switch err := err.(type) { case *Error: // Typed nils can reach here, so initialize if we are nil if err == nil { err = new(Error) }

  // Wrap each of the errors
  for i, e := range err.Errors {
     err.Errors[i] = errwrap.Wrapf(format, e)
  }

  return err

default: return errwrap.Wrapf(format, err) } }

prefix_test

package multierror

import ( “errors” “testing” )

func TestPrefix_Error(t *testing.T) { original := &Error{ Errors: []error{errors.New(“foo”)}, }

result := Prefix(original, “bar”) if result.(*Error).Errors[0].Error() != “bar foo” { t.Fatalf(“bad: %s”, result) } }

func TestPrefix_NilError(t *testing.T) { var err error result := Prefix(err, “bar”) if result != nil { t.Fatalf(“bad: %#v”, result) } }

func TestPrefix_NonError(t *testing.T) { original := errors.New(“foo”) result := Prefix(original, “bar”) if result == nil { t.Fatal(“error result was nil”) } if result.Error() != “bar foo” { t.Fatalf(“bad: %s”, result) } }

sort

package multierror

// Len implements sort.Interface function for length func (err Error) Len() int { return len(err.Errors) }

// Swap implements sort.Interface function for swapping elements func (err Error) Swap(i, j int) { err.Errors[i], err.Errors[j] = err.Errors[j], err.Errors[i] }

// Less implements sort.Interface function for determining order func (err Error) Less(i, j int) bool { return err.Errors[i].Error() < err.Errors[j].Error() }

sort_test

package multierror

import ( “errors” “reflect” “sort” “testing” )

func TestSortSingle(t *testing.T) { errFoo := errors.New(“foo”)

expected := []error{ errFoo, }

err := &Error{ Errors: []error{ errFoo, }, }

sort.Sort(err) if !reflect.DeepEqual(err.Errors, expected) { t.Fatalf(“bad: %#v”, err) } }

func TestSortMultiple(t *testing.T) { errBar := errors.New(“bar”) errBaz := errors.New(“baz”) errFoo := errors.New(“foo”)

expected := []error{ errBar, errBaz, errFoo, }

err := &Error{ Errors: []error{ errFoo, errBar, errBaz, }, }

sort.Sort(err) if !reflect.DeepEqual(err.Errors, expected) { t.Fatalf(“bad: %#v”, err) } }

github.com/hashicorp/go-multierror/.circleci

config

version: 2.1

orbs: win: circleci/windows@2.2.0

references: environment: &ENVIRONMENT TEST_RESULTS_PATH: &TEST_RESULTS_PATH /tmp/test-results WIN_TEST_RESULTS: &WIN_TEST_RESULTS c:\Users\circleci\AppData\Local\Temp\test-results

commands: run-gotests: parameters: cmd: type: string platform: type: string steps: - run: name: “Run go tests” command: | PACKAGE_NAMES=$(go list ./… | circleci tests split –split-by=timings –timings-type=classname) echo “Running $(echo $PACKAGE_NAMES | wc -w) packages” echo $PACKAGE_NAMES « parameters.cmd » –format=short-verbose –junitfile $TEST_RESULTS_PATH/go-multierror/gotestsum-report.xml – -p 2 -cover -coverprofile=« parameters.platform »cov$CIRCLE_NODE_INDEX.part $PACKAGE_NAMES

jobs: linux-tests: docker: - image: docker.mirror.hashicorp.services/circleci/golang:« parameters.go-version » parameters: go-version: type: string environment: «: *ENVIRONMENT parallelism: 4 steps: - run: go version - checkout - attach_workspace: at: . - run: mkdir -p $TEST_RESULTS_PATH/go-multierror

  # Restore go module cache if there is one
  - restore_cache:
      keys:
        - linux-gomod-cache-v1-{{ checksum "go.mod" }}

  - run: go mod download

  # Save go module cache if the go.mod file has changed
  - save_cache:
      key: linux-gomod-cache-v1-{{ checksum "go.mod" }}
      paths:
        - "/go/pkg/mod"

  # Check go fmt output because it does not report non-zero when there are fmt changes
  - run:
      name: check go fmt
      command: |
        files=$(go fmt ./...)
        if [ -n "$files" ]; then
          echo "The following file(s) do not conform to go fmt:"
          echo "$files"
          exit 1
        fi
  # Run go tests with gotestsum
  - run-gotests:
      cmd: "gotestsum"
      platform: "linux"

  # Save coverage report parts
  - persist_to_workspace:
      root: .
      paths:
        - linux_cov_*.part

  - store_test_results:
      path: *TEST_RESULTS_PATH
  - store_artifacts:
      path: *TEST_RESULTS_PATH

windows-tests: executor: name: win/default shell: bash –login -eo pipefail environment: «: *ENVIRONMENT working_directory: c:\gopath\src\github.com\hashicorp\go-multierror parameters: go-version: type: string gotestsum-version: type: string steps: - run: git config –global core.autocrlf false - checkout - attach_workspace: at: . - run: name: Setup (remove pre-installed go) command: | rm -rf “c:\Go” mkdir -p $TEST_RESULTS_PATH/go-multierror - restore_cache: keys: - win-golang-« parameters.go-version »-cache-v1 - win-gomod-cache-{{ checksum “go.mod” }}-v1

  - run: 
      name: Install go version << parameters.go-version >>
      command: | 
        if [ ! -d "c:\go" ]; then
          echo "Cache not found, installing new version of go"
          curl --fail --location https://dl.google.com/go/go<< parameters.go-version >>.windows-amd64.zip --output go.zip
          unzip go.zip -d "/c"
        fi
  - run: 
      command: go mod download

  - save_cache:
      key: win-golang-<< parameters.go-version >>-cache-v1
      paths:
        - /go

  - save_cache:
      key: win-gomod-cache-{{ checksum "go.mod" }}-v1
      paths:
        - c:\Windows\system32\config\systemprofile\go\pkg\mod

  - run:
      name: Install gotestsum
      command: |
        curl --fail --location https://github.com/gotestyourself/gotestsum/releases/download/v<< parameters.gotestsum-version >>/gotestsum_<< parameters.gotestsum-version >>_windows_amd64.tar.gz --output gotestsum.tar.gz
        tar -xvzf gotestsum.tar.gz
  - run-gotests:
      cmd: "./gotestsum.exe"
      platform: "win"

  # Save coverage report parts
  - persist_to_workspace:
      root: .
      paths:
        - win_cov_*.part

  - store_test_results:
      path: *WIN_TEST_RESULTS
  - store_artifacts:
      path: *WIN_TEST_RESULTS

workflows: go-multierror: jobs: - linux-tests: matrix: parameters: go-version: [“1.13”, “1.14”, “1.15”] name: linux-test-go-« matrix.go-version » - windows-tests: matrix: parameters: go-version: [“1.13”, “1.14”, “1.15”] gotestsum-version: [“1.6.2”] name: win-test-go-« matrix.go-version »

github.com/jlaffaye/ftp

LICENSE

Copyright (c) 2011-2013, Julien Laffaye jlaffaye@FreeBSD.org

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

github.com/jmespath/go-jmespath

LICENSE

Copyright 2015 James Saryerwinnie

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/josharian/intern

license

MIT License

Copyright (c) 2019 Josh Bleecher Snyder

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/klauspost/cpuid/v2

LICENSE

The MIT License (MIT)

Copyright (c) 2015 Klaus Post

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/KyleBanks/depth

LICENSE

MIT License

Copyright (c) 2017 Kyle Banks

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/leodido/go-urn

LICENSE

MIT License

Copyright (c) 2018 Leonardo Di Donato

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/libdns/libdns

LICENSE

MIT License

Copyright (c) 2020 Matthew Holt

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/mailru/easyjson

LICENSE

Copyright (c) 2016 Mail.Ru Group

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/mattn/go-colorable

LICENSE

The MIT License (MIT)

Copyright (c) 2016 Yasuhiro Matsumoto

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/mattn/go-isatty

LICENSE

Copyright (c) Yasuhiro MATSUMOTO mattn.jp@gmail.com

MIT License (Expat)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/mholt/acmez/v2

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/miekg/dns

LICENSE

BSD 3-Clause License

Copyright (c) 2009, The Go Authors. Extensions copyright (c) 2011, Miek Gieben. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

  3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/rs/zerolog

LICENSE

MIT License

Copyright (c) 2017 Olivier Poitrey

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/swaggo/files/v2

LICENSE

MIT License

Copyright (c) 2019 Swaggo

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/swaggo/http-swagger/v2

LICENSE

MIT License

Copyright (c) 2018 Swaggo

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/swaggo/swag

license

MIT License

Copyright (c) 2017 Eason Lin

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/zeebo/blake3

LICENSE

This work is released into the public domain with CC0 1.0.


Creative Commons Legal Code

CC0 1.0 Universal

CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
HEREUNDER.

Statement of Purpose

The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an “owner”) of an original work of authorship and/or a database (each, a “Work”).

Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works (“Commons”) that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.

For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the “Affirmer”), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.

  1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights (“Copyright and Related Rights”). Copyright and Related Rights include, but are not limited to, the following:

i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; ii. moral rights retained by the original author(s) and/or performer(s); iii. publicity and privacy rights pertaining to a person’s image or likeness depicted in a Work; iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; v. rights protecting the extraction, dissemination, use and reuse of data in a Work; vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.

  1. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “Waiver”). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer’s heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer’s express Statement of Purpose.

  2. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer’s express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer’s Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “License”). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer’s express Statement of Purpose.

  3. Limitations and Disclaimers.

a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person’s Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.

go.uber.org/multierr

LICENSE

Copyright (c) 2017-2021 Uber Technologies, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

go.uber.org/zap

LICENSE

Copyright (c) 2016-2017 Uber Technologies, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

golang.org/x/crypto

LICENSE

Copyright 2009 The Go Authors.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/exp/constraints

LICENSE

Copyright 2009 The Go Authors.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/net

LICENSE

Copyright 2009 The Go Authors.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/sys/unix

LICENSE

Copyright 2009 The Go Authors.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/text

LICENSE

Copyright 2009 The Go Authors.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/time/rate

LICENSE

Copyright 2009 The Go Authors.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/tools

LICENSE

Copyright 2009 The Go Authors.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

gopkg.in/yaml.v3

LICENSE

This project is covered by two different licenses: MIT and Apache.

MIT License

The following files were ported to Go from C files of libyaml, and thus are still covered by their original MIT license, with the additional copyright staring in 2011 when the project was ported over:

apic.go emitterc.go parserc.go readerc.go scannerc.go
writerc.go yamlh.go yamlprivateh.go

Copyright (c) 2006-2010 Kirill Simonov Copyright (c) 2006-2011 Kirill Simonov

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Apache License

All the remaining project files are covered by the Apache license:

Copyright (c) 2011-2019 Canonical Ltd

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Copyright 2011-2016 Canonical Ltd.

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

7.4 - Releases

ESB3034 - ew-cmaf-ingest releases

7.4.1 - Release 1.0.0

First Product Release

New

  • Basic CMAF-Ingest support

Fixes

None

Known Limitations

  • There is no explicit synchronization between parallel ew-cmaf-ingest nodes
  • The segments must have a fixed average duration
  • Subtitle styling, positioning, and alignment is not preserved
  • SCTE-35 metadata information is currently not used
  • Pushed MPDs are not analyzed, but simply stored
  • DELETE requests are not processed

Compatibility has been verified with the following products:

  • Sw Repackager: 1.52.1
  • Sw Live Ingest: 1.42.1

Release information

  • Date: 2025-03-18
  • Type: Production release

7.5 - Logging

Logging for ew-cmaf-ingest

Logging

To provide context to each log message, structured logging is used. By dividing the log data into fields of name-value pairs, the logs become more coherent and are better suited for processing by external tools.

Log messages related to a specific channel include a log field named chName (channel name), which can be used to filter messages for specific channels.

Log formats

From the command line, by specifying -logformat parameters, ew-cmaf-ingest supports the following logging formats: consolepretty, consolejson, or journald. To disable logging, set it to discard. The default logging format is consolejson.

Format setup example:

$ ./ew-cmaf-ingest -logformat consolejson
  • consolepretty logs to standard output (stdout) in a human-readable format. Each log line starts with the date and the log message, followed by context-dependent log fields:

    2025-01-03T15:17:58+07:00 INF Wrote segment chName=testpic_2s name=867946138.cmfv nrBytes=37863 trName=V300

  • consolejson logs to stdout using a JSON object for each message:

    {“level”:“info”,“chName”:“testpic_2s”,“trName”:“A48”,“seqNr”:867946183,“oldestNr”:867946176,“latestNr”:867946183, …}

  • When switching the -logformat to journald, ew-cmaf-ingest will send logs to journald following the journald format, with field names in uppercase. Examples:

    To see entries with the channel name testpic_2s:

    $ journalctl -u ew-cmaf-ingest CHNAME=testpic_2s -o verbose
    

    To see entries with the stream name A48:

    $ journalctl -u ew-cmaf-ingest NAME=A48 -o verbose
    

Using the verbose output includes all available name-value fields. Without this option, only the log message is printed. The field named JSON contains the original structured log message as sent by the service. To filter out only thisfield, use --output-fields=JSON. Note that this requires a systemd version of at least 236.

$ journalctl -u ew-cmaf-ingest --output-fields=JSON CHNAME=testpic_2s

To continuously monitor the service:

$ journalctl -fu ew-cmaf-ingest

Log levels

At startup, default value is info. The log level can be changed by posting a form field named level to the loglevel endpoint on the ew-cmaf-ingest server: sh $ curl -F level=debug <ew-cmaf-ingest-server>:<server-port>/loglevel

The available log levels and their corresponding systemd priority values are listed below:

Log level  Systemd priority
trace      7
debug      7
info       6
warn       4
error      3
fatal      2
panic      0

To see all error and warning messages using journalctl, run:

$ journalctl -u ew-cmaf-ingest PRIORITY=3 PRIORITY=4

To see the current log level, use a GET request:

$ curl <ew-cmaf-ingest-server>:<server-port>/loglevel

Messages with a higher level than the configured one will not be logged.

8 - VoD to JIT (esb3022)

Make external VoD assets available for streaming on the fly

8.1 - Introduction

Introduction to ESB3022 - the ew-vodjit service

Managed Content

The Repackager (ESB3002) and the VoD-to-Linear (ESB3019) require VoD assets to be available in ESF format. Assets are normally ingested into ESF with ew-vodingest (ESB3021) or ew-recorder(ESB3005). The ESF format is an internal format for efficient streaming. Such ingested assets will be referred to as managed content.

However, in some cases, for example having a big catalogue of rarely watched content, it may be unsuitable to ingest and convert all content to ESF format, and it may be preferred to keep the content as “external content”.

ew-vodjit provides a solution by being able to read such “external content”, and convert it to ESF format on-the-fly. The ESF format is then not stored on disk, but only available via HTTP. For the repackager, the asset looks like a normal (managed) ESF asset, except that some operations like getting the first metadata may take longer time.

Supported Codecs

  • video: AVC/H.264, HEVC/H.265
  • audio: AAC-LC, HE-AACv1, HE-AACv2, AC-3, EC-3
  • subtitles: WebVTT, TTML, SRT, STL

Input Locations

Assets must be directly mounted on server’s file-system. Remote storage, such as S3, is not supported.

8.2 - Configuration and Command Line Options

Configuring and running the server.

The ew-vodjit configuration parameters can be specified in the following ways:

  1. On the command-line
  2. In the configuration file (when specified by the command-line)
  3. Default values

They take precedence in the above order, i.e. a command-line value will override other values.

Command Line Options

The -h option will give you all available command-line options.

$ ./ew-vodjit -h
Basic usage of ew-vodjit:
ew-vodjit -cfg <config file> -port <port>

Translates assets into ESF format on-the-fly and provides
the asset via an HTTP interface with byte ranges.
Command line options will override configuration file values.

Run ew-vodjit with options:

-basepath string
        Base path to content
-cfg string
        Full path to configuration file (default "/etc/edgeware/ew-vodjit/config.json")
-help
        Print help
-licensefile string
        License file path (default "/etc/edgeware/ew-vodjit/license.json")
-logformat string
        Format and type of log: [consolejson consolepretty journald discard] (default "consolejson")
-loglevel string
        Initial logging level: debug, info, warn, error, fatal, panic
-port int
        Server TCP port (default 8092)
-version
        Get version, date, and possible expiration date

Configuration File

Most of the above parameters can be specified in the configuration file:

{
    "basePath": "/media",
    "logFormat": "consolepretty",
    "logLevel": "info"
}

Note: the server port and license file cannot be specified in this file

Downstream URLs and Configuration

Repackager Configuration

In the Repackager the ew-vodjit service needs to be configured as an HTTP server. Please refer to the section “HTTP server content locations” in the esb3002 User Guide.

Note: Request URLs to ew-vodjit for assets must be prepended with jit/.

To request an asset at <basepath>/archive1/movie1 The request URL for the above asset should be something like: http://<repackager>/__cl/s:jit/__c/jit/archive1/movie1/__op/default/__f/index.m3u8

To avoid the jit/ in the URL, an additional location can be configured in the Repackager’s ew-repackager-server.conf.

VoD to Linear [ew-vod2cbm] Configuration

In the ew-vod2cbm service, each asset must be added using the rest API /assetpaths. Where the "path" field is the full HTTP URL to the asset in the ew-vodjit service.

An entry for the above asset should be be:

    "id": "...",
    "path": "jit/archive1/movie1"

Assets can also be added in the startup configuration file. This is of course less flexible but can be suitable for testing.

8.3 - Credits

Third party libraries used in ew-vodjit and their licenses

License List

The table below lists the third party libraries used by this software and their respective license types.

LibraryLicenseChecked At
github.com/asticode/go-astikitMIT2023-11-22
github.com/asticode/go-astisubMIT2023-11-22
github.com/asticode/go-astitsMIT2023-11-22
github.com/aws/aws-sdk-go/internal/sync/singleflightBSD-3-Clause2023-11-22
github.com/aws/aws-sdk-goApache-2.02023-11-22
github.com/barkimedes/go-deepcopyMIT2023-11-22
github.com/beorn7/perks/quantileMIT2023-11-22
github.com/cespare/xxhash/v2MIT2023-11-22
github.com/Comcast/gotsMIT2023-11-22
github.com/coreos/go-systemd/v22/journalApache-2.02023-11-22
github.com/Eyevinn/dash-mpd/mpdMIT2023-11-22
github.com/Eyevinn/dash-mpd/xmlBSD-3-Clause2023-11-22
github.com/Eyevinn/mp4ff/bitsMIT2023-11-22
github.com/Eyevinn/mp4ff/mp4MIT2023-11-22
github.com/Eyevinn/mp4ffMIT2023-11-22
github.com/go-chi/chi/v5MIT2023-11-22
github.com/go-chi/docgenMIT2023-11-22
github.com/go-openapi/jsonpointerApache-2.02023-11-22
github.com/go-openapi/jsonreferenceApache-2.02023-11-22
github.com/go-openapi/specApache-2.02023-11-22
github.com/go-openapi/swagApache-2.02023-11-22
github.com/go-playground/localesMIT2023-11-22
github.com/go-playground/universal-translatorMIT2023-11-22
github.com/go-playground/validatorMIT2023-11-22
github.com/golang/protobuf/protoBSD-3-Clause2023-11-22
github.com/google/go-cmp/cmpBSD-3-Clause2023-11-22
github.com/hashicorp/errwrapMPL-2.02023-11-22
github.com/hashicorp/go-multierrorMPL-2.02023-11-22
github.com/jlaffaye/ftpISC2023-11-22
github.com/jmespath/go-jmespathApache-2.02023-11-22
github.com/josharian/internMIT2023-11-22
github.com/KyleBanks/depthMIT2023-11-22
github.com/leodido/go-urnMIT2023-11-22
github.com/mailru/easyjsonMIT2023-11-22
github.com/mattn/go-colorableMIT2023-11-22
github.com/mattn/go-isattyMIT2023-11-22
github.com/matttproud/golang_protobuf_extensions/pbutilApache-2.02023-11-22
github.com/prometheus/client_golang/prometheusApache-2.02023-11-22
github.com/prometheus/client_model/goApache-2.02023-11-22
github.com/prometheus/common/internal/bitbucket.org/ww/goautonegBSD-3-Clause2023-11-22
github.com/prometheus/commonApache-2.02023-11-22
github.com/prometheus/procfsApache-2.02023-11-22
github.com/rs/zerologMIT2023-11-22
github.com/swaggo/files/v2MIT2023-11-22
github.com/swaggo/http-swagger/v2MIT2023-11-22
github.com/swaggo/swagMIT2023-11-22
golang.org/x/expBSD-3-Clause2023-11-22
golang.org/x/net/htmlBSD-3-Clause2023-11-22
golang.org/x/sysBSD-3-Clause2023-11-22
golang.org/x/textBSD-3-Clause2023-11-22
golang.org/x/toolsBSD-3-Clause2023-11-22
google.golang.org/protobufBSD-3-Clause2023-11-22
gopkg.in/yaml.v3MIT2023-11-22

License Details

This section includes all the licenses/notices for each dependency verbatim

github.com/asticode/go-astikit

LICENSE

MIT License

Copyright (c) 2020 Quentin Renard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/asticode/go-astisub

LICENSE

MIT License

Copyright (c) 2016 Quentin Renard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/asticode/go-astits

LICENSE

MIT License

Copyright (c) 2017 Quentin Renard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/aws/aws-sdk-go

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

AWS SDK for Go Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. Copyright 2014-2015 Stripe, Inc.

github.com/aws/aws-sdk-go/internal/sync/singleflight

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/barkimedes/go-deepcopy

LICENSE

MIT License

Copyright (c) 2020 Sabrina Williams

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/beorn7/perks/quantile

LICENSE

Copyright (C) 2013 Blake Mizerany

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/cespare/xxhash/v2

LICENSE

Copyright (c) 2016 Caleb Spare

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/Comcast/gots

LICENSE

/* MIT License

Copyright 2016 Comcast Cable Communications Management, LLC

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */

NOTICE

Go Transport Stream Library Copyright 2016 Comcast Cable Communications Management, LLC This product includes software developed at Comcast (http://www.comcast.com/).

github.com/coreos/go-systemd/v22/journal

LICENSE

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  1. Grant of Copyright License.

Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  1. Grant of Patent License.

Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  1. Redistribution.

You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

You must give any other recipients of the Work or Derivative Works a copy of this License; and You must cause any modified files to carry prominent notices stating that You changed the files; and You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  1. Submission of Contributions.

Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  1. Trademarks.

This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  1. Disclaimer of Warranty.

Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  1. Limitation of Liability.

In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  1. Accepting Warranty or Additional Liability.

While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets “[]” replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

CoreOS Project Copyright 2018 CoreOS, Inc

This product includes software developed at CoreOS, Inc. (http://www.coreos.com/).

github.com/Eyevinn/dash-mpd/mpd

LICENSE

MIT License

Copyright (c) 2023 Eyevinn Technology AB.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/Eyevinn/dash-mpd/xml

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/Eyevinn/mp4ff

LICENSE

MIT License

Copyright (c) 2019-2022 Edgeware AB, 2023- Eyevinn Technology AB

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/Eyevinn/mp4ff/bits

LICENSE

Copyright

Copyright (c) 2019-2022 Edgeware AB, 2023- Eyevinn Technology AB.

Some code in this directory comes from or is based on https://github.com/tcnksm/go-casper/tree/master/internal/bits Copyright (c) 2017 Taichi Nakashima.

All code has the same MIT License.

License

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/Eyevinn/mp4ff/mp4

LICENSE

Copyright

Most code is Copyright (c) 2019-2022 Edgeware AB, 2023- Eyevinn Technology AB.

Some code in this directory comes from or is based on https://github.com/jfbus/mp4 which has Copyright (c) 2015 Jean-François Bustarret.

All code has the same MIT License.

License

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-chi/chi/v5

LICENSE

Copyright (c) 2015-present Peter Kieltyka (https://github.com/pkieltyka), Google Inc.

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-chi/docgen

LICENSE

Copyright (c) 2016-Present https://github.com/go-chi authors

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-openapi/jsonpointer

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-openapi/jsonreference

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-openapi/spec

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-openapi/swag

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-playground/locales

LICENSE

The MIT License (MIT)

Copyright (c) 2016 Go Playground

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-playground/universal-translator

LICENSE

The MIT License (MIT)

Copyright (c) 2016 Go Playground

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-playground/validator

LICENSE

The MIT License (MIT)

Copyright (c) 2015 Dean Karn

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/golang/protobuf/proto

LICENSE

Copyright 2010 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright

notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/google/go-cmp/cmp

LICENSE

Copyright (c) 2017 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/hashicorp/errwrap

LICENSE

Mozilla Public License, version 2.0

  1. Definitions

1.1. “Contributor”

 means each individual or legal entity that creates, contributes to the
 creation of, or owns Covered Software.

1.2. “Contributor Version”

 means the combination of the Contributions of others (if any) used by a
 Contributor and that particular Contributor’s Contribution.

1.3. “Contribution”

 means Covered Software of a particular Contributor.

1.4. “Covered Software”

 means Source Code Form to which the initial Contributor has attached the
 notice in Exhibit A, the Executable Form of such Source Code Form, and
 Modifications of such Source Code Form, in each case including portions
 thereof.

1.5. “Incompatible With Secondary Licenses” means

 a. that the initial Contributor has attached the notice described in
    Exhibit B to the Covered Software; or

 b. that the Covered Software was made available under the terms of version
    1.1 or earlier of the License, but not also under the terms of a
    Secondary License.

1.6. “Executable Form”

 means any form of the work other than Source Code Form.

1.7. “Larger Work”

 means a work that combines Covered Software with other material, in a separate
 file or files, that is not Covered Software.

1.8. “License”

 means this document.

1.9. “Licensable”

 means having the right to grant, to the maximum extent possible, whether at the
 time of the initial grant or subsequently, any and all of the rights conveyed by
 this License.

1.10. “Modifications”

 means any of the following:

 a. any file in Source Code Form that results from an addition to, deletion
    from, or modification of the contents of Covered Software; or

 b. any new file in Source Code Form that contains any Covered Software.

1.11. “Patent Claims” of a Contributor

  means any patent claim(s), including without limitation, method, process,
  and apparatus claims, in any patent Licensable by such Contributor that
  would be infringed, but for the grant of the License, by the making,
  using, selling, offering for sale, having made, import, or transfer of
  either its Contributions or its Contributor Version.

1.12. “Secondary License”

  means either the GNU General Public License, Version 2.0, the GNU Lesser
  General Public License, Version 2.1, the GNU Affero General Public
  License, Version 3.0, or any later versions of those licenses.

1.13. “Source Code Form”

  means the form of the work preferred for making modifications.

1.14. “You” (or “Your”)

  means an individual or a legal entity exercising rights under this
  License. For legal entities, “You” includes any entity that controls, is
  controlled by, or is under common control with You. For purposes of this
  definition, “control” means (a) the power, direct or indirect, to cause
  the direction or management of such entity, whether by contract or
  otherwise, or (b) ownership of more than fifty percent (50%) of the
  outstanding shares or beneficial ownership of such entity.
  1. License Grants and Conditions

2.1. Grants

 Each Contributor hereby grants You a world-wide, royalty-free,
 non-exclusive license:

 a. under intellectual property rights (other than patent or trademark)
    Licensable by such Contributor to use, reproduce, make available,
    modify, display, perform, distribute, and otherwise exploit its
    Contributions, either on an unmodified basis, with Modifications, or as
    part of a Larger Work; and

 b. under Patent Claims of such Contributor to make, use, sell, offer for
    sale, have made, import, and otherwise transfer either its Contributions
    or its Contributor Version.

2.2. Effective Date

 The licenses granted in Section 2.1 with respect to any Contribution become
 effective for each Contribution on the date the Contributor first distributes
 such Contribution.

2.3. Limitations on Grant Scope

 The licenses granted in this Section 2 are the only rights granted under this
 License. No additional rights or licenses will be implied from the distribution
 or licensing of Covered Software under this License. Notwithstanding Section
 2.1(b) above, no patent license is granted by a Contributor:

 a. for any code that a Contributor has removed from Covered Software; or

 b. for infringements caused by: (i) Your and any other third party’s
    modifications of Covered Software, or (ii) the combination of its
    Contributions with other software (except as part of its Contributor
    Version); or

 c. under Patent Claims infringed by Covered Software in the absence of its
    Contributions.

 This License does not grant any rights in the trademarks, service marks, or
 logos of any Contributor (except as may be necessary to comply with the
 notice requirements in Section 3.4).

2.4. Subsequent Licenses

 No Contributor makes additional grants as a result of Your choice to
 distribute the Covered Software under a subsequent version of this License
 (see Section 10.2) or under the terms of a Secondary License (if permitted
 under the terms of Section 3.3).

2.5. Representation

 Each Contributor represents that the Contributor believes its Contributions
 are its original creation(s) or it has sufficient rights to grant the
 rights to its Contributions conveyed by this License.

2.6. Fair Use

 This License is not intended to limit any rights You have under applicable
 copyright doctrines of fair use, fair dealing, or other equivalents.

2.7. Conditions

 Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
 Section 2.1.
  1. Responsibilities

3.1. Distribution of Source Form

 All distribution of Covered Software in Source Code Form, including any
 Modifications that You create or to which You contribute, must be under the
 terms of this License. You must inform recipients that the Source Code Form
 of the Covered Software is governed by the terms of this License, and how
 they can obtain a copy of this License. You may not attempt to alter or
 restrict the recipients’ rights in the Source Code Form.

3.2. Distribution of Executable Form

 If You distribute Covered Software in Executable Form then:

 a. such Covered Software must also be made available in Source Code Form,
    as described in Section 3.1, and You must inform recipients of the
    Executable Form how they can obtain a copy of such Source Code Form by
    reasonable means in a timely manner, at a charge no more than the cost
    of distribution to the recipient; and

 b. You may distribute such Executable Form under the terms of this License,
    or sublicense it under different terms, provided that the license for
    the Executable Form does not attempt to limit or alter the recipients’
    rights in the Source Code Form under this License.

3.3. Distribution of a Larger Work

 You may create and distribute a Larger Work under terms of Your choice,
 provided that You also comply with the requirements of this License for the
 Covered Software. If the Larger Work is a combination of Covered Software
 with a work governed by one or more Secondary Licenses, and the Covered
 Software is not Incompatible With Secondary Licenses, this License permits
 You to additionally distribute such Covered Software under the terms of
 such Secondary License(s), so that the recipient of the Larger Work may, at
 their option, further distribute the Covered Software under the terms of
 either this License or such Secondary License(s).

3.4. Notices

 You may not remove or alter the substance of any license notices (including
 copyright notices, patent notices, disclaimers of warranty, or limitations
 of liability) contained within the Source Code Form of the Covered
 Software, except that You may alter any license notices to the extent
 required to remedy known factual inaccuracies.

3.5. Application of Additional Terms

 You may choose to offer, and to charge a fee for, warranty, support,
 indemnity or liability obligations to one or more recipients of Covered
 Software. However, You may do so only on Your own behalf, and not on behalf
 of any Contributor. You must make it absolutely clear that any such
 warranty, support, indemnity, or liability obligation is offered by You
 alone, and You hereby agree to indemnify every Contributor for any
 liability incurred by such Contributor as a result of warranty, support,
 indemnity or liability terms You offer. You may include additional
 disclaimers of warranty and limitations of liability specific to any
 jurisdiction.
  1. Inability to Comply Due to Statute or Regulation

    If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.

  2. Termination

5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice.

5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate.

5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination.

  1. Disclaimer of Warranty

    Covered Software is provided under this License on an “as is” basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer.

  2. Limitation of Liability

    Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party’s negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You.

  3. Litigation

    Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party’s ability to bring cross-claims or counter-claims.

  4. Miscellaneous

    This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor.

  5. Versions of the License

10.1. New Versions

  Mozilla Foundation is the license steward. Except as provided in Section
  10.3, no one other than the license steward has the right to modify or
  publish new versions of this License. Each version will be given a
  distinguishing version number.

10.2. Effect of New Versions

  You may distribute the Covered Software under the terms of the version of
  the License under which You originally received the Covered Software, or
  under the terms of any subsequent version published by the license
  steward.

10.3. Modified Versions

  If you create software not governed by this License, and you want to
  create a new license for such software, you may create and use a modified
  version of this License if you rename the license and remove any
  references to the name of the license steward (except to note that such
  modified license differs from this License).

10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached.

Exhibit A - Source Code Form License Notice

  This Source Code Form is subject to the
  terms of the Mozilla Public License, v.
  2.0. If a copy of the MPL was not
  distributed with this file, You can
  obtain one at
  http://mozilla.org/MPL/2.0/.

If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice.

You may add additional accurate notices of copyright ownership.

Exhibit B - “Incompatible With Secondary Licenses” Notice

  This Source Code Form is “Incompatible
  With Secondary Licenses”, as defined by
  the Mozilla Public License, v. 2.0.

README

errwrap

errwrap is a package for Go that formalizes the pattern of wrapping errors and checking if an error contains another error.

There is a common pattern in Go of taking a returned error value and then wrapping it (such as with fmt.Errorf) before returning it. The problem with this pattern is that you completely lose the original error structure.

Arguably the correct approach is that you should make a custom structure implementing the error interface, and have the original error as a field on that structure, such as this example. This is a good approach, but you have to know the entire chain of possible rewrapping that happens, when you might just care about one.

errwrap formalizes this pattern (it doesn’t matter what approach you use above) by giving a single interface for wrapping errors, checking if a specific error is wrapped, and extracting that error.

Installation and Docs

Install using go get github.com/hashicorp/errwrap.

Full documentation is available at http://godoc.org/github.com/hashicorp/errwrap

Usage

Basic Usage

Below is a very basic example of its usage:

// A function that always returns an error, but wraps it, like a real
// function might.
func tryOpen() error {
	_, err := os.Open("/i/dont/exist")
	if err != nil {
		return errwrap.Wrapf("Doesn't exist: {{err}}", err)
	}

	return nil
}

func main() {
	err := tryOpen()

	// We can use the Contains helpers to check if an error contains
	// another error. It is safe to do this with a nil error, or with
	// an error that doesn't even use the errwrap package.
	if errwrap.Contains(err, "does not exist") {
		// Do something
	}
	if errwrap.ContainsType(err, new(os.PathError)) {
		// Do something
	}

	// Or we can use the associated `Get` functions to just extract
	// a specific error. This would return nil if that specific error doesn't
	// exist.
	perr := errwrap.GetType(err, new(os.PathError))
}

Custom Types

If you’re already making custom types that properly wrap errors, then you can get all the functionality of errwraps.Contains and such by implementing the Wrapper interface with just one function. Example:

type AppError {
  Code ErrorCode
  Err  error
}

func (e *AppError) WrappedErrors() []error {
  return []error{e.Err}
}

Now this works:

err := &AppError{Err: fmt.Errorf("an error")}
if errwrap.ContainsType(err, fmt.Errorf("")) {
	// This will work!
}

errwrap

// Package errwrap implements methods to formalize error wrapping in Go. // // All of the top-level functions that take an error are built to be able // to take any error, not just wrapped errors. This allows you to use errwrap // without having to type-check and type-cast everywhere. package errwrap

import ( “errors” “reflect” “strings” )

// WalkFunc is the callback called for Walk. type WalkFunc func(error)

// Wrapper is an interface that can be implemented by custom types to // have all the Contains, Get, etc. functions in errwrap work. // // When Walk reaches a Wrapper, it will call the callback for every // wrapped error in addition to the wrapper itself. Since all the top-level // functions in errwrap use Walk, this means that all those functions work // with your custom type. type Wrapper interface { WrappedErrors() []error }

// Wrap defines that outer wraps inner, returning an error type that // can be cleanly used with the other methods in this package, such as // Contains, GetAll, etc. // // This function won’t modify the error message at all (the outer message // will be used). func Wrap(outer, inner error) error { return &wrappedError{ Outer: outer, Inner: inner, } }

// Wrapf wraps an error with a formatting message. This is similar to using // fmt.Errorf to wrap an error. If you’re using fmt.Errorf to wrap // errors, you should replace it with this. // // format is the format of the error message. The string ‘{{err}}’ will // be replaced with the original error message. // // Deprecated: Use fmt.Errorf() func Wrapf(format string, err error) error { outerMsg := “” if err != nil { outerMsg = err.Error() }

outer := errors.New(strings.Replace(
	format, "{{err}}", outerMsg, -1))

return Wrap(outer, err)

}

// Contains checks if the given error contains an error with the // message msg. If err is not a wrapped error, this will always return // false unless the error itself happens to match this msg. func Contains(err error, msg string) bool { return len(GetAll(err, msg)) > 0 }

// ContainsType checks if the given error contains an error with // the same concrete type as v. If err is not a wrapped error, this will // check the err itself. func ContainsType(err error, v interface{}) bool { return len(GetAllType(err, v)) > 0 }

// Get is the same as GetAll but returns the deepest matching error. func Get(err error, msg string) error { es := GetAll(err, msg) if len(es) > 0 { return es[len(es)-1] }

return nil

}

// GetType is the same as GetAllType but returns the deepest matching error. func GetType(err error, v interface{}) error { es := GetAllType(err, v) if len(es) > 0 { return es[len(es)-1] }

return nil

}

// GetAll gets all the errors that might be wrapped in err with the // given message. The order of the errors is such that the outermost // matching error (the most recent wrap) is index zero, and so on. func GetAll(err error, msg string) []error { var result []error

Walk(err, func(err error) {
	if err.Error() == msg {
		result = append(result, err)
	}
})

return result

}

// GetAllType gets all the errors that are the same type as v. // // The order of the return value is the same as described in GetAll. func GetAllType(err error, v interface{}) []error { var result []error

var search string
if v != nil {
	search = reflect.TypeOf(v).String()
}
Walk(err, func(err error) {
	var needle string
	if err != nil {
		needle = reflect.TypeOf(err).String()
	}

	if needle == search {
		result = append(result, err)
	}
})

return result

}

// Walk walks all the wrapped errors in err and calls the callback. If // err isn’t a wrapped error, this will be called once for err. If err // is a wrapped error, the callback will be called for both the wrapper // that implements error as well as the wrapped error itself. func Walk(err error, cb WalkFunc) { if err == nil { return }

switch e := err.(type) {
case *wrappedError:
	cb(e.Outer)
	Walk(e.Inner, cb)
case Wrapper:
	cb(err)

	for _, err := range e.WrappedErrors() {
		Walk(err, cb)
	}
case interface{ Unwrap() error }:
	cb(err)
	Walk(e.Unwrap(), cb)
default:
	cb(err)
}

}

// wrappedError is an implementation of error that has both the // outer and inner errors. type wrappedError struct { Outer error Inner error }

func (w *wrappedError) Error() string { return w.Outer.Error() }

func (w *wrappedError) WrappedErrors() []error { return []error{w.Outer, w.Inner} }

func (w *wrappedError) Unwrap() error { return w.Inner }

github.com/hashicorp/go-multierror

LICENSE

Mozilla Public License, version 2.0

  1. Definitions

1.1. “Contributor”

 means each individual or legal entity that creates, contributes to the
 creation of, or owns Covered Software.

1.2. “Contributor Version”

 means the combination of the Contributions of others (if any) used by a
 Contributor and that particular Contributor’s Contribution.

1.3. “Contribution”

 means Covered Software of a particular Contributor.

1.4. “Covered Software”

 means Source Code Form to which the initial Contributor has attached the
 notice in Exhibit A, the Executable Form of such Source Code Form, and
 Modifications of such Source Code Form, in each case including portions
 thereof.

1.5. “Incompatible With Secondary Licenses” means

 a. that the initial Contributor has attached the notice described in
    Exhibit B to the Covered Software; or

 b. that the Covered Software was made available under the terms of version
    1.1 or earlier of the License, but not also under the terms of a
    Secondary License.

1.6. “Executable Form”

 means any form of the work other than Source Code Form.

1.7. “Larger Work”

 means a work that combines Covered Software with other material, in a separate
 file or files, that is not Covered Software.

1.8. “License”

 means this document.

1.9. “Licensable”

 means having the right to grant, to the maximum extent possible, whether at the
 time of the initial grant or subsequently, any and all of the rights conveyed by
 this License.

1.10. “Modifications”

 means any of the following:

 a. any file in Source Code Form that results from an addition to, deletion
    from, or modification of the contents of Covered Software; or

 b. any new file in Source Code Form that contains any Covered Software.

1.11. “Patent Claims” of a Contributor

  means any patent claim(s), including without limitation, method, process,
  and apparatus claims, in any patent Licensable by such Contributor that
  would be infringed, but for the grant of the License, by the making,
  using, selling, offering for sale, having made, import, or transfer of
  either its Contributions or its Contributor Version.

1.12. “Secondary License”

  means either the GNU General Public License, Version 2.0, the GNU Lesser
  General Public License, Version 2.1, the GNU Affero General Public
  License, Version 3.0, or any later versions of those licenses.

1.13. “Source Code Form”

  means the form of the work preferred for making modifications.

1.14. “You” (or “Your”)

  means an individual or a legal entity exercising rights under this
  License. For legal entities, “You” includes any entity that controls, is
  controlled by, or is under common control with You. For purposes of this
  definition, “control” means (a) the power, direct or indirect, to cause
  the direction or management of such entity, whether by contract or
  otherwise, or (b) ownership of more than fifty percent (50%) of the
  outstanding shares or beneficial ownership of such entity.
  1. License Grants and Conditions

2.1. Grants

 Each Contributor hereby grants You a world-wide, royalty-free,
 non-exclusive license:

 a. under intellectual property rights (other than patent or trademark)
    Licensable by such Contributor to use, reproduce, make available,
    modify, display, perform, distribute, and otherwise exploit its
    Contributions, either on an unmodified basis, with Modifications, or as
    part of a Larger Work; and

 b. under Patent Claims of such Contributor to make, use, sell, offer for
    sale, have made, import, and otherwise transfer either its Contributions
    or its Contributor Version.

2.2. Effective Date

 The licenses granted in Section 2.1 with respect to any Contribution become
 effective for each Contribution on the date the Contributor first distributes
 such Contribution.

2.3. Limitations on Grant Scope

 The licenses granted in this Section 2 are the only rights granted under this
 License. No additional rights or licenses will be implied from the distribution
 or licensing of Covered Software under this License. Notwithstanding Section
 2.1(b) above, no patent license is granted by a Contributor:

 a. for any code that a Contributor has removed from Covered Software; or

 b. for infringements caused by: (i) Your and any other third party’s
    modifications of Covered Software, or (ii) the combination of its
    Contributions with other software (except as part of its Contributor
    Version); or

 c. under Patent Claims infringed by Covered Software in the absence of its
    Contributions.

 This License does not grant any rights in the trademarks, service marks, or
 logos of any Contributor (except as may be necessary to comply with the
 notice requirements in Section 3.4).

2.4. Subsequent Licenses

 No Contributor makes additional grants as a result of Your choice to
 distribute the Covered Software under a subsequent version of this License
 (see Section 10.2) or under the terms of a Secondary License (if permitted
 under the terms of Section 3.3).

2.5. Representation

 Each Contributor represents that the Contributor believes its Contributions
 are its original creation(s) or it has sufficient rights to grant the
 rights to its Contributions conveyed by this License.

2.6. Fair Use

 This License is not intended to limit any rights You have under applicable
 copyright doctrines of fair use, fair dealing, or other equivalents.

2.7. Conditions

 Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
 Section 2.1.
  1. Responsibilities

3.1. Distribution of Source Form

 All distribution of Covered Software in Source Code Form, including any
 Modifications that You create or to which You contribute, must be under the
 terms of this License. You must inform recipients that the Source Code Form
 of the Covered Software is governed by the terms of this License, and how
 they can obtain a copy of this License. You may not attempt to alter or
 restrict the recipients’ rights in the Source Code Form.

3.2. Distribution of Executable Form

 If You distribute Covered Software in Executable Form then:

 a. such Covered Software must also be made available in Source Code Form,
    as described in Section 3.1, and You must inform recipients of the
    Executable Form how they can obtain a copy of such Source Code Form by
    reasonable means in a timely manner, at a charge no more than the cost
    of distribution to the recipient; and

 b. You may distribute such Executable Form under the terms of this License,
    or sublicense it under different terms, provided that the license for
    the Executable Form does not attempt to limit or alter the recipients’
    rights in the Source Code Form under this License.

3.3. Distribution of a Larger Work

 You may create and distribute a Larger Work under terms of Your choice,
 provided that You also comply with the requirements of this License for the
 Covered Software. If the Larger Work is a combination of Covered Software
 with a work governed by one or more Secondary Licenses, and the Covered
 Software is not Incompatible With Secondary Licenses, this License permits
 You to additionally distribute such Covered Software under the terms of
 such Secondary License(s), so that the recipient of the Larger Work may, at
 their option, further distribute the Covered Software under the terms of
 either this License or such Secondary License(s).

3.4. Notices

 You may not remove or alter the substance of any license notices (including
 copyright notices, patent notices, disclaimers of warranty, or limitations
 of liability) contained within the Source Code Form of the Covered
 Software, except that You may alter any license notices to the extent
 required to remedy known factual inaccuracies.

3.5. Application of Additional Terms

 You may choose to offer, and to charge a fee for, warranty, support,
 indemnity or liability obligations to one or more recipients of Covered
 Software. However, You may do so only on Your own behalf, and not on behalf
 of any Contributor. You must make it absolutely clear that any such
 warranty, support, indemnity, or liability obligation is offered by You
 alone, and You hereby agree to indemnify every Contributor for any
 liability incurred by such Contributor as a result of warranty, support,
 indemnity or liability terms You offer. You may include additional
 disclaimers of warranty and limitations of liability specific to any
 jurisdiction.
  1. Inability to Comply Due to Statute or Regulation

    If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.

  2. Termination

5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice.

5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate.

5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination.

  1. Disclaimer of Warranty

    Covered Software is provided under this License on an “as is” basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer.

  2. Limitation of Liability

    Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party’s negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You.

  3. Litigation

    Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party’s ability to bring cross-claims or counter-claims.

  4. Miscellaneous

    This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor.

  5. Versions of the License

10.1. New Versions

  Mozilla Foundation is the license steward. Except as provided in Section
  10.3, no one other than the license steward has the right to modify or
  publish new versions of this License. Each version will be given a
  distinguishing version number.

10.2. Effect of New Versions

  You may distribute the Covered Software under the terms of the version of
  the License under which You originally received the Covered Software, or
  under the terms of any subsequent version published by the license
  steward.

10.3. Modified Versions

  If you create software not governed by this License, and you want to
  create a new license for such software, you may create and use a modified
  version of this License if you rename the license and remove any
  references to the name of the license steward (except to note that such
  modified license differs from this License).

10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached.

Exhibit A - Source Code Form License Notice

  This Source Code Form is subject to the
  terms of the Mozilla Public License, v.
  2.0. If a copy of the MPL was not
  distributed with this file, You can
  obtain one at
  http://mozilla.org/MPL/2.0/.

If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice.

You may add additional accurate notices of copyright ownership.

Exhibit B - “Incompatible With Secondary Licenses” Notice

  This Source Code Form is “Incompatible
  With Secondary Licenses”, as defined by
  the Mozilla Public License, v. 2.0.

Makefile

TEST?=./…

default: test

test runs the test suite and vets the code.

test: generate @echo “==> Running tests…” @go list $(TEST)
| grep -v “/vendor/”
| xargs -n1 go test -timeout=60s -parallel=10 ${TESTARGS}

testrace runs the race checker

testrace: generate @echo “==> Running tests (race)…” @go list $(TEST)
| grep -v “/vendor/”
| xargs -n1 go test -timeout=60s -race ${TESTARGS}

updatedeps installs all the dependencies needed to run and build.

updatedeps: @sh -c “’${CURDIR}/scripts/deps.sh’ ‘${NAME}’”

generate runs go generate to build the dynamically generated source files.

generate: @echo “==> Generating…” @find . -type f -name ‘.DS_Store’ -delete @go list ./…
| grep -v “/vendor/”
| xargs -n1 go generate

.PHONY: default test testrace updatedeps generate

README

go-multierror

CircleCI Go Reference GitHub go.mod Go version

go-multierror is a package for Go that provides a mechanism for representing a list of error values as a single error.

This allows a function in Go to return an error that might actually be a list of errors. If the caller knows this, they can unwrap the list and access the errors. If the caller doesn’t know, the error formats to a nice human-readable format.

go-multierror is fully compatible with the Go standard library errors package, including the functions As, Is, and Unwrap. This provides a standardized approach for introspecting on error values.

Installation and Docs

Install using go get github.com/hashicorp/go-multierror.

Full documentation is available at https://pkg.go.dev/github.com/hashicorp/go-multierror

Requires go version 1.13 or newer

go-multierror requires go version 1.13 or newer. Go 1.13 introduced error wrapping, which this library takes advantage of.

If you need to use an earlier version of go, you can use the v1.0.0 tag, which doesn’t rely on features in go 1.13.

If you see compile errors that look like the below, it’s likely that you’re on an older version of go:

/go/src/github.com/hashicorp/go-multierror/multierror.go:112:9: undefined: errors.As
/go/src/github.com/hashicorp/go-multierror/multierror.go:117:9: undefined: errors.Is

Usage

go-multierror is easy to use and purposely built to be unobtrusive in existing Go applications/libraries that may not be aware of it.

Building a list of errors

The Append function is used to create a list of errors. This function behaves a lot like the Go built-in append function: it doesn’t matter if the first argument is nil, a multierror.Error, or any other error, the function behaves as you would expect.

var result error

if err := step1(); err != nil {
	result = multierror.Append(result, err)
}
if err := step2(); err != nil {
	result = multierror.Append(result, err)
}

return result

Customizing the formatting of the errors

By specifying a custom ErrorFormat, you can customize the format of the Error() string function:

var result *multierror.Error

// ... accumulate errors here, maybe using Append

if result != nil {
	result.ErrorFormat = func([]error) string {
		return "errors!"
	}
}

Accessing the list of errors

multierror.Error implements error so if the caller doesn’t know about multierror, it will work just fine. But if you’re aware a multierror might be returned, you can use type switches to access the list of errors:

if err := something(); err != nil {
	if merr, ok := err.(*multierror.Error); ok {
		// Use merr.Errors
	}
}

You can also use the standard errors.Unwrap function. This will continue to unwrap into subsequent errors until none exist.

Extracting an error

The standard library errors.As function can be used directly with a multierror to extract a specific error:

// Assume err is a multierror value
err := somefunc()

// We want to know if "err" has a "RichErrorType" in it and extract it.
var errRich RichErrorType
if errors.As(err, &errRich) {
	// It has it, and now errRich is populated.
}

Checking for an exact error value

Some errors are returned as exact errors such as the ErrNotExist error in the os package. You can check if this error is present by using the standard errors.Is function.

// Assume err is a multierror value
err := somefunc()
if errors.Is(err, os.ErrNotExist) {
	// err contains os.ErrNotExist
}

Returning a multierror only if there are errors

If you build a multierror.Error, you can use the ErrorOrNil function to return an error implementation only if there are errors to return:

var result *multierror.Error

// ... accumulate errors here

// Return the `error` only if errors were added to the multierror, otherwise
// return nil since there are no errors.
return result.ErrorOrNil()

append

package multierror

// Append is a helper function that will append more errors // onto an Error in order to create a larger multi-error. // // If err is not a multierror.Error, then it will be turned into // one. If any of the errs are multierr.Error, they will be flattened // one level into err. // Any nil errors within errs will be ignored. If err is nil, a new // *Error will be returned. func Append(err error, errs …error) *Error { switch err := err.(type) { case *Error: // Typed nils can reach here, so initialize if we are nil if err == nil { err = new(Error) }

	// Go through each error and flatten
	for _, e := range errs {
		switch e := e.(type) {
		case *Error:
			if e != nil {
				err.Errors = append(err.Errors, e.Errors...)
			}
		default:
			if e != nil {
				err.Errors = append(err.Errors, e)
			}
		}
	}

	return err
default:
	newErrs := make([]error, 0, len(errs)+1)
	if err != nil {
		newErrs = append(newErrs, err)
	}
	newErrs = append(newErrs, errs...)

	return Append(&Error{}, newErrs...)
}

}

flatten

package multierror

// Flatten flattens the given error, merging any *Errors together into // a single *Error. func Flatten(err error) error { // If it isn’t an *Error, just return the error as-is if _, ok := err.(*Error); !ok { return err }

// Otherwise, make the result and flatten away!
flatErr := new(Error)
flatten(err, flatErr)
return flatErr

}

func flatten(err error, flatErr *Error) { switch err := err.(type) { case *Error: for _, e := range err.Errors { flatten(e, flatErr) } default: flatErr.Errors = append(flatErr.Errors, err) } }

format

package multierror

import ( “fmt” “strings” )

// ErrorFormatFunc is a function callback that is called by Error to // turn the list of errors into a string. type ErrorFormatFunc func([]error) string

// ListFormatFunc is a basic formatter that outputs the number of errors // that occurred along with a bullet point list of the errors. func ListFormatFunc(es []error) string { if len(es) == 1 { return fmt.Sprintf(“1 error occurred:\n\t* %s\n\n”, es[0]) }

points := make([]string, len(es))
for i, err := range es {
	points[i] = fmt.Sprintf("* %s", err)
}

return fmt.Sprintf(
	"%d errors occurred:\n\t%s\n\n",
	len(es), strings.Join(points, "\n\t"))

}

group

package multierror

import “sync”

// Group is a collection of goroutines which return errors that need to be // coalesced. type Group struct { mutex sync.Mutex err *Error wg sync.WaitGroup }

// Go calls the given function in a new goroutine. // // If the function returns an error it is added to the group multierror which // is returned by Wait. func (g *Group) Go(f func() error) { g.wg.Add(1)

go func() {
	defer g.wg.Done()

	if err := f(); err != nil {
		g.mutex.Lock()
		g.err = Append(g.err, err)
		g.mutex.Unlock()
	}
}()

}

// Wait blocks until all function calls from the Go method have returned, then // returns the multierror. func (g *Group) Wait() *Error { g.wg.Wait() g.mutex.Lock() defer g.mutex.Unlock() return g.err }

multierror

package multierror

import ( “errors” “fmt” )

// Error is an error type to track multiple errors. This is used to // accumulate errors in cases and return them as a single “error”. type Error struct { Errors []error ErrorFormat ErrorFormatFunc }

func (e *Error) Error() string { fn := e.ErrorFormat if fn == nil { fn = ListFormatFunc }

return fn(e.Errors)

}

// ErrorOrNil returns an error interface if this Error represents // a list of errors, or returns nil if the list of errors is empty. This // function is useful at the end of accumulation to make sure that the value // returned represents the existence of errors. func (e *Error) ErrorOrNil() error { if e == nil { return nil } if len(e.Errors) == 0 { return nil }

return e

}

func (e Error) GoString() string { return fmt.Sprintf("%#v", *e) }

// WrappedErrors returns the list of errors that this Error is wrapping. It is // an implementation of the errwrap.Wrapper interface so that multierror.Error // can be used with that library. // // This method is not safe to be called concurrently. Unlike accessing the // Errors field directly, this function also checks if the multierror is nil to // prevent a null-pointer panic. It satisfies the errwrap.Wrapper interface. func (e *Error) WrappedErrors() []error { if e == nil { return nil } return e.Errors }

// Unwrap returns an error from Error (or nil if there are no errors). // This error returned will further support Unwrap to get the next error, // etc. The order will match the order of Errors in the multierror.Error // at the time of calling. // // The resulting error supports errors.As/Is/Unwrap so you can continue // to use the stdlib errors package to introspect further. // // This will perform a shallow copy of the errors slice. Any errors appended // to this error after calling Unwrap will not be available until a new // Unwrap is called on the multierror.Error. func (e *Error) Unwrap() error { // If we have no errors then we do nothing if e == nil || len(e.Errors) == 0 { return nil }

// If we have exactly one error, we can just return that directly.
if len(e.Errors) == 1 {
	return e.Errors[0]
}

// Shallow copy the slice
errs := make([]error, len(e.Errors))
copy(errs, e.Errors)
return chain(errs)

}

// chain implements the interfaces necessary for errors.Is/As/Unwrap to // work in a deterministic way with multierror. A chain tracks a list of // errors while accounting for the current represented error. This lets // Is/As be meaningful. // // Unwrap returns the next error. In the cleanest form, Unwrap would return // the wrapped error here but we can’t do that if we want to properly // get access to all the errors. Instead, users are recommended to use // Is/As to get the correct error type out. // // Precondition: []error is non-empty (len > 0) type chain []error

// Error implements the error interface func (e chain) Error() string { return e[0].Error() }

// Unwrap implements errors.Unwrap by returning the next error in the // chain or nil if there are no more errors. func (e chain) Unwrap() error { if len(e) == 1 { return nil }

return e[1:]

}

// As implements errors.As by attempting to map to the current value. func (e chain) As(target interface{}) bool { return errors.As(e[0], target) }

// Is implements errors.Is by comparing the current value directly. func (e chain) Is(target error) bool { return errors.Is(e[0], target) }

prefix

package multierror

import ( “fmt”

"github.com/hashicorp/errwrap"

)

// Prefix is a helper function that will prefix some text // to the given error. If the error is a multierror.Error, then // it will be prefixed to each wrapped error. // // This is useful to use when appending multiple multierrors // together in order to give better scoping. func Prefix(err error, prefix string) error { if err == nil { return nil }

format := fmt.Sprintf("%s {{err}}", prefix)
switch err := err.(type) {
case *Error:
	// Typed nils can reach here, so initialize if we are nil
	if err == nil {
		err = new(Error)
	}

	// Wrap each of the errors
	for i, e := range err.Errors {
		err.Errors[i] = errwrap.Wrapf(format, e)
	}

	return err
default:
	return errwrap.Wrapf(format, err)
}

}

sort

package multierror

// Len implements sort.Interface function for length func (err Error) Len() int { return len(err.Errors) }

// Swap implements sort.Interface function for swapping elements func (err Error) Swap(i, j int) { err.Errors[i], err.Errors[j] = err.Errors[j], err.Errors[i] }

// Less implements sort.Interface function for determining order func (err Error) Less(i, j int) bool { return err.Errors[i].Error() < err.Errors[j].Error() }

github.com/jlaffaye/ftp

LICENSE

Copyright (c) 2011-2013, Julien Laffaye jlaffaye@FreeBSD.org

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

github.com/jmespath/go-jmespath

LICENSE

Copyright 2015 James Saryerwinnie

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/josharian/intern

license

MIT License

Copyright (c) 2019 Josh Bleecher Snyder

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/KyleBanks/depth

LICENSE

MIT License

Copyright (c) 2017 Kyle Banks

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/leodido/go-urn

LICENSE

MIT License

Copyright (c) 2018 Leonardo Di Donato

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/mailru/easyjson

LICENSE

Copyright (c) 2016 Mail.Ru Group

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/mattn/go-colorable

LICENSE

The MIT License (MIT)

Copyright (c) 2016 Yasuhiro Matsumoto

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/mattn/go-isatty

LICENSE

Copyright (c) Yasuhiro MATSUMOTO mattn.jp@gmail.com

MIT License (Expat)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/matttproud/golang_protobuf_extensions/pbutil

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "{}"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright {yyyy} {name of copyright owner}

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Copyright 2012 Matt T. Proud (matt.proud@gmail.com)

github.com/prometheus/client_golang/prometheus

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Prometheus instrumentation library for Go applications Copyright 2012-2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

The following components are included in this product:

perks - a fork of https://github.com/bmizerany/perks https://github.com/beorn7/perks Copyright 2013-2015 Blake Mizerany, Björn Rabenstein See https://github.com/beorn7/perks/blob/master/README.md for license details.

Go support for Protocol Buffers - Google’s data interchange format http://github.com/golang/protobuf/ Copyright 2010 The Go Authors See source code for license details.

Support for streaming Protocol Buffer messages for the Go language (golang). https://github.com/matttproud/golang_protobuf_extensions Copyright 2013 Matt T. Proud Licensed under the Apache License, Version 2.0

github.com/prometheus/client_model/go

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Data model artifacts for Prometheus. Copyright 2012-2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

github.com/prometheus/common

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Common libraries shared by Prometheus Go components. Copyright 2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg

README

PACKAGE

package goautoneg import “bitbucket.org/ww/goautoneg”

HTTP Content-Type Autonegotiation.

The functions in this package implement the behaviour specified in http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Copyright (c) 2011, Open Knowledge Foundation Ltd. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.

Neither the name of the Open Knowledge Foundation Ltd. nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior written
permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

FUNCTIONS

func Negotiate(header string, alternatives []string) (content_type string) Negotiate the most appropriate content_type given the accept header and a list of alternatives.

func ParseAccept(header string) (accept []Accept) Parse an Accept Header string returning a sorted list of clauses

TYPES

type Accept struct { Type, SubType string Q float32 Params map[string]string } Structure to represent a clause in an HTTP Accept Header

SUBDIRECTORIES

.hg

github.com/prometheus/procfs

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

procfs provides functions to retrieve system, kernel and process metrics from the pseudo-filesystem proc.

Copyright 2014-2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

github.com/rs/zerolog

LICENSE

MIT License

Copyright (c) 2017 Olivier Poitrey

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/swaggo/files/v2

LICENSE

MIT License

Copyright (c) 2019 Swaggo

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/swaggo/http-swagger/v2

LICENSE

MIT License

Copyright (c) 2018 Swaggo

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/swaggo/swag

license

MIT License

Copyright (c) 2017 Eason Lin

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

golang.org/x/exp

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/net/html

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/sys

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/text

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/tools

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

google.golang.org/protobuf

LICENSE

Copyright (c) 2018 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

gopkg.in/yaml.v3

LICENSE

This project is covered by two different licenses: MIT and Apache.

MIT License

The following files were ported to Go from C files of libyaml, and thus are still covered by their original MIT license, with the additional copyright staring in 2011 when the project was ported over:

apic.go emitterc.go parserc.go readerc.go scannerc.go
writerc.go yamlh.go yamlprivateh.go

Copyright (c) 2006-2010 Kirill Simonov Copyright (c) 2006-2011 Kirill Simonov

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Apache License

All the remaining project files are covered by the Apache license:

Copyright (c) 2011-2019 Canonical Ltd

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Copyright 2011-2016 Canonical Ltd.

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

8.4 - Releases

ESB3022 - ew-vodjit releases

8.4.1 - Release 1.0.0

First Product Release

New

  • Fundamental ESF/JITP Support

Fixes

None

Known Limitations

  • Response to first metadata request for large TS input, can be very slow
  • TTML subtitle styling is not supported
  • Input needs to be on local or mounted file system. Remote storage such as HTTP or S3, is not supported

8.5 - Licensing

Licensing for ew-vodjit

ew-vodjit requires a valid license file to operate. The license file must be obtained from AgileTV, and copied to /etc/edgeware/ew-vodjit/license.json.

See further details here.

8.6 - Logging

Logging for ew-vodjit

Details on logging can be found here.

9 - HLS Ingest (esb3023)

Ingest live HLS channels to repackagable linear channels

9.1 - Introduction

ESB3023 - the ew-hlsingest service

The service consumes live HLS v3 sources. The sources must be multiplexed video and audio in each variant. Separate audio, video or subtitles are not supported. Higher HLS versions are not supported.

The output segments are typically written to a RAM disk, and are to be be consumed by the Edgeware CBM (esb3003) for further integration with the Edgeware repackager.

The output segments will be generated with a fixed average segment duration that is constant over time. To achieve this, it is required that the input segments have a fixed segment duration except at ad boundaries signalled by SCTE-35 markers. At such boundaries, the input segments should be split by an extra IDR-frame.

9.2 - Installation and Upgrades

Installation

The ew-hlsingest service is distributed as a CentOS/Red Hat RPM and is available as ew-hlsingest.service when installed. It works both on RH 7 and 8 and compatible versions.

To install version x.y.z, the rpm command can be used as follows:

yum install ./ew-hlsingest-x.y.z-1.el8.x86_64.rpm

The service can be controlled with the standard systemctl commands:

systemctl start ew-hlsingest
systemctl stop ew-hlsingest
systemctl status ew-hlsingest

Logs from the service can be seen using journalctl -u ew-hlsingest.

The unit file is available in /usr/lib/systemd/system/ew-hlsingest.service.

When run as a service, ew-hlsingest reads its initial configuration from /etc/edgeware/ew-hlsingest/config.json. To uninstall the service, do:

yum remove ew-hlsingest

When uninstalling or upgrading it is recommended to first stop the service.

Upgrades

There is only one version of ew-hlsingest so there are no configuration concerns during upgrade.

In the future, to upgrade simply run:

$ sudo yum upgrade <rpm-file>

9.3 - Configuration and command-line arguments

Configuration and command-line

Typically ew-hlsingest is run as a systemd service with command-line arguments specified in /usr/lib/systemd/system/ew-hlsingest.service.

In can also be started from the command-line.

Command-line arguments

ew-hlsingest -h
Usage of ew-hlsingest:
  -cfg string
    	Config file (default "/etc/edgeware/ew-hlsingest/config.json")
  -defaultConfig
    	Print default configuration
  -logFormat string
    	Format and type of log: [consolejson consolepretty journald discard] (default "consolepretty")
  -logLevel string
    	log level (default "trace")
  -version
    	Get version, date, and possible expiration date

Configuration parameters

The configuration file, in the location specified as above, controls the service.

Review note: generate JSON-schema

This is an example configuration with two channels:

{
  "outDir": "/tmp/ew-hlsingest",
  "startCatchup": 20,
  "logFormat": "journald",
  "logLevel": "info",
  "maxAdBreakDuration": 600,
  "channels": [
     {
           "name": "ch1",
           "url": "https://sometv.org/channel1",
           "configID": 0,
           "maxBandwidth": 100000000,
           "liveWindowS": 180,
           "logLevel": "info"
     },
     {
           "name": "ch2",
           "url": "https://othertv.org/channel1",
           "configID": 0,
           "maxBandwidth": 100000000,
           "liveWindowS": 180,
           "logLevel": "info"
     }
  ]
}

Some fields may need clarification:

maxAdBreakDuration Sometimes upstreams may fail to insert ad-break-end-markers (i.e. #EXT-X-CUE-IN) After the specified duration inside an ad-break ew-hlsingest will insert an end-marker.

maxBandwidth variants with bitrates above this threshold will be dropped from the output

configID allows the “downstream” CBM to distinguish between channel configurations. For example if maxBandwidth is modified the number output variants change, and configID must be incremented.

Review note: part of defaultconfig and internal struct, never referenced, remove! startCatchup

Review note: maxAdBreakDuration [etc] should have Sin its name to clarify unit

Configuration updates

Channels can be modified/added/removed without restarting the service. Any modification to the configuration file are automatically detected, and channels will be restarted/started/stopped accordingly. Changes not directly related to the service itself, such as logLevel, will not trigger a restart.

Integration with ew-cbm

ew-hlsingest acts as the input source for ew-cbm (Catchup Buffer Manager, a part of SW Live Ingest), and ew-cbm, in its turn, will be the backend of SW Repackager, from which the channels are streamed to CDN, and then, to end user.

To make ew-hlsingest channel visible with ew-cbm, outDir attribute in ew-hlsingest configuration have to be the same with the location that ew-cbm gets the input from. The service file of ew-cbm can be referred to get that location (specified by argument --live-ingest-path), it is usually /mnt/ramdisk.

cat /usr/lib/systemd/system/ew-cbm.service
...
ExecStart=/usr/bin/ew-cbm --live-ingest-path /mnt/ramdisk --socket-path /var/run/edgeware/ew-cbm/socket --with-accel-redirect --node-id=%m
...

The next step is configuring the channel for ew-cbm to work with ew-hlsingest buffer.

confcli services.liveIngest.channels. -w
Running wizard for resource 'Channels'
<A list of channels>

Hint: Hitting return will set a value to its default.
Enter '?' to receive the help string

Channels <A list of channels>: [
  Channel <Configuration for a single channel>: {
    Channel Name (default: default): hlsingest-channel
    Channel State (default: enabled): cbm-only
    Catchup Location (default: ): cb1
    Channel Name Alias (default: ): 
    Channel Template Name (default: default): 
    Config Id (default: 0): 
    Input Sources <A list of input sources>: [
      Input Source <Input source configuration>: {
        Backup IGMPv3 Source (default: ): 
        Error correction (default: off): 
        IGMPv3 Source (default: ): 
        Source (default: ): 
        Passphrase for SRT connection (default: ): 
        Tracks <A list of tracks from the channel template>: [
          Track <Configuration for a single track>: {
            Log Level (default: INHERIT): 
            Track Name (default: default): 
            Variant flags (default: -1): 
          }
          Add another 'track' element to array 'tracks'? [y/N]: 
        ]
        Use As SCTE-35 Source (default: False): 
      }
      Add another 'inputSource' element to array 'inputSources'? [y/N]: 
    ]
    Logging <Logging configuration>: {
      General Log Level (default: INHERIT): 
      Track Log Level (default: INHERIT): 
      Source Log Level (default: INHERIT): 
    }
    Nielsen Marker Tracking (default: off): 
    Segmentation Template Name (default: default): 
  }
  Add another 'channel' element to array 'channels'? [y/N]: 
]
Generated config:
{
  "channels": [
    {
      "name": "hlsingest-channel",
      "state": "cbm-only",
      "catchupLocation": "cb1",
      "alias": "",
      "channelTemplate": "default",
      "configId": 0,
      "inputSources": [
        {
          "backupIgmpV3Source": "",
          "errorCorrection": "off",
          "igmpV3Source": "",
          "source": "",
          "srtPassphrase": "",
          "tracks": [
            {
              "logLevel": "INHERIT",
              "name": "default",
              "variantFlags": -1
            }
          ],
          "useAsScte35Source": false
        }
      ],
      "logging": {
        "general": "INHERIT",
        "track": "INHERIT",
        "source": "INHERIT"
      },
      "nielsenMarkerTracking": "off",
      "segmentationTemplate": "default"
    }
  ]
}
Merge and apply the config? [y/n]:

Only three configurations should be cared about: Channel Name (name), Channel State (state), Catchup Location (catchupLocation), others are meaningful for ew-live-ingest, another part of SW Live Ingest, so they should be left as default:

  • Channel Name (name): have to be exactly the same with the channel name configured in ew-hlsingest, so that ew-cbm will know where to look for the input.
  • Channel State (state): cbm-only is a must.
  • Catchup Location (catchupLocation) (optional): is the location that ew-cbm will write the catch up buffer to, please refer to ew-cbm documentation to know how to configure it.

After done configuring, this command, ew-cb-media, can be used to check for the running channel. If the channel name appears in the output of that command and the duration of catchup buffer starts growing (repeat the command the see if the channel is growing, or just use watch ew-cb-media), then the live content can now be delivered through ew-cbm to repackager and beyond.

9.4 - Logging

service logs

Logging

To provide context to each log message, structured logging is used. Thus instead of free text log messages without any specific format, the log data is to some extent divided into fields of name-value pairs, making the logs more coherent and more suitable for processing by external tools.

Log messages related to a specific HTTP request include the log field named request_id which can be used to filter out specific requests.

The log field named topic is always present and is used to separate different areas of logging. The current topics are access, messages and error, and are used to log HTTP access, debug messages and panic stack traces, respectively.

As a comparison, the topics are similar to having separate files for access logging, debug messages and errors in a conventional file-based logging system.

Log formats

When run from the command line ew-hlsingest can log in one of the formats consolepretty, consolejsonorjournalddepending on the value of the-logformatparameter. Logging can be disabled by using the valuediscard`.

$ ew-hlsingest -upstream http://127.0.0.1 -logformat consolejson

consolepretty logs to standard output (stdout) in a human-readable format. Each log line starts with the date and the log message followed by the context- dependent log fields:

2022-02-07T11:54:42Z INF Incoming request bytes_out=27592 latency_ms=6.18251 method=GET ...

consolejson logs to stdout using a JSON object for each message:

{"level":"info","topic":"access","time":"2022-02-07T12:06:07Z","bytes_out":27592, ...}

When run as a systemd service, ew-hlsingest logs directly to journaldusing thelogjournaldconfiguration parameter. When stored injournald`, field names are upper case whereas the values keep their format. Some examples:

To see entries a specific channel:

$ journalctl -u ew-hlsingest CHANNEL=ch1 -o verbose

To continuously monitor the service:

$ journalctl -fu ew-hlsingest

Log levels

At startup the log level is set to info. The log level can be changed by posting a form-field named level to the loglevel endpoint on the `ew-hlsingest server:

$ curl -F level=debug ew-hlsingest-server:8090/loglevel

The available log levels and how they relate to systemd priority values is listed below:

Log level  Systemd priority
trace      7
debug      7
info       6
warn       4
error      3
fatal      2
panic      0

To e.g. see all error and warning messages using journalctl:

$ journalctl -u ew-hlsingest PRIORITY=3 PRIORITY=4

Messages with higher level than the configured one will not be logged.

9.5 - Credits

Third party libraries used in ew-hlsingest and their licenses

Review Note:: this list was copied from ew-vod2cbm. It is just a placeholder until we generate it here.

License List

The table below lists the third party libraries used by this software and their respective license types.

LibraryLicenseChecked At
github.com/prometheus/common/internal/bitbucket.org/ww/goautonegBSD-3-Clause2022-03-18
github.com/go-openapi/jsonreferenceApache-2.02022-03-18
github.com/swaggo/swagMIT2022-03-18
github.com/go-playground/universal-translatorMIT2022-03-18
github.com/edgeware/mp4ff/mp4MIT2022-03-18
github.com/go-playground/validatorMIT2022-03-18
github.com/leodido/go-urnMIT2022-03-18
github.com/prometheus/commonApache-2.02022-03-18
github.com/zencoder/go-dash/v3Apache-2.02022-03-18
github.com/go-openapi/specApache-2.02022-03-18
gopkg.in/yaml.v2Apache-2.02022-03-18
github.com/swaggo/http-swaggerMIT2022-03-18
github.com/edgeware/mp4ff/bitsMIT2022-03-18
github.com/PuerkitoBio/purellBSD-3-Clause2022-03-18
github.com/josharian/internMIT2022-03-18
golang.org/x/textBSD-3-Clause2022-03-18
github.com/aws/aws-sdk-go/internal/sync/singleflightBSD-3-Clause2022-03-18
github.com/asticode/go-astikitMIT2022-03-18
github.com/cespare/xxhash/v2MIT2022-03-18
github.com/prometheus/procfsApache-2.02022-03-18
google.golang.org/protobufBSD-3-Clause2022-03-18
github.com/prometheus/client_model/goApache-2.02022-03-18
golang.org/x/toolsBSD-3-Clause2022-03-18
github.com/jmespath/go-jmespathApache-2.02022-03-18
github.com/prometheus/client_golang/prometheusApache-2.02022-03-18
github.com/go-openapi/swagApache-2.02022-03-18
github.com/go-chi/chi/v5MIT2022-03-18
github.com/rs/zerologMIT2022-03-18
github.com/matttproud/golang_protobuf_extensions/pbutilApache-2.02022-03-18
github.com/go-chi/docgenMIT2022-03-18
github.com/asticode/go-astisubMIT2022-03-18
github.com/PuerkitoBio/urlescBSD-3-Clause2022-03-18
github.com/swaggo/filesMIT2022-03-18
github.com/aws/aws-sdk-goApache-2.02022-03-18
github.com/golang/protobufBSD-3-Clause2022-03-18
golang.org/x/sysBSD-3-Clause2022-03-18
github.com/go-playground/localesMIT2022-03-18
github.com/go-openapi/jsonpointerApache-2.02022-03-18
github.com/coreos/go-systemd/v22/journalApache-2.02022-03-18
github.com/beorn7/perks/quantileMIT2022-03-18
github.com/edgeware/mp4ffMIT2022-03-18
golang.org/x/netBSD-3-Clause2022-03-18
github.com/asticode/go-astitsMIT2022-03-18
github.com/mailru/easyjsonMIT2022-03-18
github.com/Comcast/gotsMIT2022-03-18
github.com/KyleBanks/depthMIT2022-03-18

License Details

This section includes all the licenses/notices for each dependency verbatim

github.com/prometheus/common

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Common libraries shared by Prometheus Go components. Copyright 2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

github.com/swaggo/swag

license

MIT License

Copyright (c) 2017 Eason Lin

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/Comcast/gots

LICENSE

/* MIT License

Copyright 2016 Comcast Cable Communications Management, LLC

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */

NOTICE

Go Transport Stream Library Copyright 2016 Comcast Cable Communications Management, LLC This product includes software developed at Comcast (http://www.comcast.com/).

github.com/KyleBanks/depth

LICENSE

MIT License

Copyright (c) 2017 Kyle Banks

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/PuerkitoBio/urlesc

LICENSE

Copyright (c) 2012 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/asticode/go-astikit

LICENSE

MIT License

Copyright (c) 2020 Quentin Renard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/beorn7/perks/quantile

LICENSE

Copyright (C) 2013 Blake Mizerany

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/matttproud/golang_protobuf_extensions/pbutil

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "{}"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright {yyyy} {name of copyright owner}

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Copyright 2012 Matt T. Proud (matt.proud@gmail.com)

github.com/go-chi/chi/v5

LICENSE

Copyright (c) 2015-present Peter Kieltyka (https://github.com/pkieltyka), Google Inc.

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-chi/docgen

LICENSE

Copyright (c) 2016-Present https://github.com/go-chi authors

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/josharian/intern

license

MIT License

Copyright (c) 2019 Josh Bleecher Snyder

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/prometheus/client_model/go

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Data model artifacts for Prometheus. Copyright 2012-2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

github.com/prometheus/procfs

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

procfs provides functions to retrieve system, kernel and process metrics from the pseudo-filesystem proc.

Copyright 2014-2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

gopkg.in/yaml.v2

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "{}"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright {yyyy} {name of copyright owner}

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Copyright 2011-2016 Canonical Ltd.

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/asticode/go-astits

LICENSE

MIT License

Copyright (c) 2017 Quentin Renard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-openapi/jsonreference

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-openapi/swag

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-playground/validator

LICENSE

The MIT License (MIT)

Copyright (c) 2015 Dean Karn

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/golang/protobuf

LICENSE

Copyright 2010 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright

notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/text

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/asticode/go-astisub

LICENSE

MIT License

Copyright (c) 2016 Quentin Renard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/cespare/xxhash/v2

LICENSE

Copyright (c) 2016 Caleb Spare

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/zencoder/go-dash/v3

LICENSE

Copyright Brightcove, Inc.

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

golang.org/x/tools

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/aws/aws-sdk-go

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

AWS SDK for Go Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. Copyright 2014-2015 Stripe, Inc.

github.com/coreos/go-systemd/v22/journal

LICENSE

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  1. Grant of Copyright License.

Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  1. Grant of Patent License.

Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  1. Redistribution.

You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

You must give any other recipients of the Work or Derivative Works a copy of this License; and You must cause any modified files to carry prominent notices stating that You changed the files; and You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  1. Submission of Contributions.

Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  1. Trademarks.

This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  1. Disclaimer of Warranty.

Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  1. Limitation of Liability.

In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  1. Accepting Warranty or Additional Liability.

While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets “[]” replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

CoreOS Project Copyright 2018 CoreOS, Inc

This product includes software developed at CoreOS, Inc. (http://www.coreos.com/).

github.com/mailru/easyjson

LICENSE

Copyright (c) 2016 Mail.Ru Group

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/rs/zerolog

LICENSE

MIT License

Copyright (c) 2017 Olivier Poitrey

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

google.golang.org/protobuf

LICENSE

Copyright (c) 2018 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

golang.org/x/sys

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/PuerkitoBio/purell

LICENSE

Copyright (c) 2012, Martin Angers All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

  • Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/edgeware/mp4ff/bits

LICENSE

Copyright

Copyright (c) 2019-2020 Edgeware AB.

Some code in this directory comes from or is based on https://github.com/tcnksm/go-casper/tree/master/internal/bits Copyright (c) 2017 Taichi Nakashima.

All code has the same MIT License.

License

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-playground/universal-translator

LICENSE

The MIT License (MIT)

Copyright (c) 2016 Go Playground

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/leodido/go-urn

LICENSE

MIT License

Copyright (c) 2018 Leonardo Di Donato

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/prometheus/client_golang/prometheus

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

NOTICE

Prometheus instrumentation library for Go applications Copyright 2012-2015 The Prometheus Authors

This product includes software developed at SoundCloud Ltd. (http://soundcloud.com/).

The following components are included in this product:

perks - a fork of https://github.com/bmizerany/perks https://github.com/beorn7/perks Copyright 2013-2015 Blake Mizerany, Björn Rabenstein See https://github.com/beorn7/perks/blob/master/README.md for license details.

Go support for Protocol Buffers - Google’s data interchange format http://github.com/golang/protobuf/ Copyright 2010 The Go Authors See source code for license details.

Support for streaming Protocol Buffer messages for the Go language (golang). https://github.com/matttproud/golang_protobuf_extensions Copyright 2013 Matt T. Proud Licensed under the Apache License, Version 2.0

github.com/swaggo/files

LICENSE

MIT License

Copyright (c) 2019 Swaggo

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/aws/aws-sdk-go/internal/sync/singleflight

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

github.com/edgeware/mp4ff

LICENSE

MIT License

Copyright (c) 2019-2020 Edgeware

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-openapi/jsonpointer

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/jmespath/go-jmespath

LICENSE

Copyright 2015 James Saryerwinnie

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/swaggo/http-swagger

LICENSE

MIT License

Copyright (c) 2018 Swaggo

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/edgeware/mp4ff/mp4

LICENSE

Copyright

Most code is Copyright (c) 2019-2020 Edgeware AB.

Some code in this directory comes from or is based on https://github.com/jfbus/mp4 which has Copyright (c) 2015 Jean-François Bustarret.

All code has the same MIT License.

License

MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/go-openapi/spec

LICENSE

                             Apache License
                       Version 2.0, January 2004
                    http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions.

    “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    “Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License.

    “Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    “Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    “Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.”

    “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

    (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

    (d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

  To apply the Apache License to your work, attach the following
  boilerplate notice, with the fields enclosed by brackets "[]"
  replaced with your own identifying information. (Don't include
  the brackets!)  The text should be enclosed in the appropriate
  comment syntax for the file format. We also recommend that a
  file or class name and description of purpose be included on the
  same "printed page" as the copyright notice for easier
  identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

github.com/go-playground/locales

LICENSE

The MIT License (MIT)

Copyright (c) 2016 Go Playground

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg

README

PACKAGE

package goautoneg import “bitbucket.org/ww/goautoneg”

HTTP Content-Type Autonegotiation.

The functions in this package implement the behaviour specified in http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Copyright (c) 2011, Open Knowledge Foundation Ltd. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.

Neither the name of the Open Knowledge Foundation Ltd. nor the
names of its contributors may be used to endorse or promote
products derived from this software without specific prior written
permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

FUNCTIONS

func Negotiate(header string, alternatives []string) (content_type string) Negotiate the most appropriate content_type given the accept header and a list of alternatives.

func ParseAccept(header string) (accept []Accept) Parse an Accept Header string returning a sorted list of clauses

TYPES

type Accept struct { Type, SubType string Q float32 Params map[string]string } Structure to represent a clause in an HTTP Accept Header

SUBDIRECTORIES

.hg

golang.org/x/net

LICENSE

Copyright (c) 2009 The Go Authors. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

9.6 - Releases

ESB3023 - ew-hlsingest releases

9.6.1 - Release 0.6.0

First release of ew-hlsingest

Early release for ingesting HLS v3 streams.

Release information

  • Date: 2022-12-31
  • Type: Beta for testing

10 -

11.1 -

Software Origin Use Cases

Software Origin Use Cases

1 Introduction

1.1 Confidentiality Notice

This document is confidential and may not be reproduced, distributed or used for any purpose other than by the recipient for the assessment, evaluation and use of Edgeware products, unless written permission is given in advance by Edgeware AB.

1.2 About this Document

This document describes how to set up an Edgeware Software Origin System consisting of Convoy, SW Live Ingest, the Edgeware Recorder/VoD Ingest tool, SW Repackager as well as an Orbit 3020/4020 TV Server.

1.3 References

[1] EDGS-069 - Convoy Management Software - User Guide

[2] EDGS-122 - Convoy Management Software - CCMI Specification

[3] EDGS-187 - ESB3003 Live Ingest User Guide

[4] Nginx documentation - http://nginx.org/en/docs/

[5] Timed Text Markup Language 1 (TTML1) - https://www.w3.org/TR/ttaf1-dfxp/

[6] DASH Industry Forum Profiles - http://dashif.org/identifiers/profiles/

[7] EDGS-156 - TV content capture - CCMI CLI

[8] EDGS-176 - SW Repackager User Guide

[9] EDGS-208 - ESB3005 User Guide

[10] EDGS-162 - Preferred Format for External ABR VoD Libraries

[11] EDGS-168 - DRM Gateway User Guide

1.4 History

VersionDateChanges
A12018-12-13This is the initial version of the document
A142019-11-13Added use case for VoD ingest to AWS S3 object storage
A152019-12-13Added use case for VoD ingest to Azure blob storage. Added use cases for CBM recordings for AWS and Azure object storage.
A172022-02-22Drop unmanaged VOD support

1.5 Third party acknowledgement

The Software Repackager uses the Bento4 C++ library to read MP4 files in some workflows.

Bento4 Software Copyright © Axiomatic Systems LLC, 2002-2017. All rights reserved.

2 The Software Origin System

2.1 Overview

The Software Origin System makes it possible to:

  • Run a service with Live TV channels.
  • Support catchup TV.
  • Make recordings from catchup buffers connected to live channels.
  • Ingest, repackage and stream VoD assets on the fly.
  • Convert assets that are stored in VoD libraries into a common storage format for subsequent repackaging and streaming.

The common storage format that is used by the Software Origin System consists of MPEG CMAF (Common Media Application Format) files for audio, video, and text data, in combination with a number of additional metadata files. This complete set of files is referred to as a managed asset or an ESF (Edgeware Storage Format) asset.

2.2 System components and ESB numbers

The system components are released as ESBs (Edgeware Software Binary). The table below summarizes the mappings between those.

ESBSystem Component Name
3003SW Live Ingest
3002SW Repackager
3005Recorder or ew-vod-ingest
3009DRM GW
2001Orbit 4020 TV Server
3006Convoy

2.3 Useful Tools

2.3.1 Repackager Tool

The ew-repackager-tool that is installed along with the Software Repackager is a utility tool that allows the user to test parts of the functionality inside the Software Repackager from the command line.

Please read the Tools section in [8] for details on how to run ew-repackager-tool to e.g. validate managed VoD content or issue stream requests locally on the repackager node.

2.3.2 Live Ingest Tools

See the SW Live Ingest ESB3003 User Guide to learn about the tools available:

  • ew-liveingest-tool to verify the status of live channels.
  • ew-cb-media to verify the corresponding catchup buffers.
  • ew-diagnose-tool to troubleshoot a channel.

2.3.3 Recorder Utilities

The installation of ESB3005 will provide a number of utilities that can be used to investigate and manipulate recordings done with the Edgeware WebTV Recorder in ESF format (CMAF + metadata). See [9] for more information.

3 General Notes for Installation and Setup

3.1 Convoy

Refer to the Convoy User Guide [1] for information on how to install Convoy.

NOTE: Example uses of the channel and content command-line tools in this document do not supply the -k option, and therefore assume that the ACCT_CLI_APIKEY environment variable has been set on the mgmt machine where they are run:

$ export ACCT_CLI_APIKEY=$(convoy-admin show api-key)

3.2 ESB3005

The ESB3005 software bundle contains tools to perform recordings and VoD ingest. The ESB3005 is provided on the Convoy ISO as a convenience but can be upgraded separately.

The Recorder is installed together with the recording agent automatically when Convoy is installed. The Recorder will be installed to /usr/bin/ew-recorder. It will be invoked as required by Convoy, and log output from the Recorder can be viewed with journalctl -u convoy-recording-agent.

For information on how to install or upgrade the Recorder, consult the ESB3005 User Guide listed in [9].

3.3 ESB3009 DRM Gateway

The Edgeware DRM (edrm) Gateway is delivered as a separate software bundle called ESB3009. It comes together with a user manual describing how to install or upgrade it. It is recommended to install edrm on repackaging nodes.

3.4 Software Repackager

Please see [8] for details on how to install the Software Repackager.

The Software Repackager will typically run on dedicated machines. In order to make those machines visible in the Convoy web UI, include them in the repack role in install.conf. Example:

hosts {
    ...
    repack = { repack-1 repack-2 }
}

Note that in order to expose the Software Repackager the firewall needs to be configured to open port 80 on the repack nodes. Consult the Convoy User Guide sections 3.6.10 Configure the Firewall and B.2 Configuring iptables for more information.

4 Use Case: Recordings

When recording from live channels, all recordings are made in the past in the sense that they will not start before the end-time of the recorded program has passed. Thus they require a live buffer to be configured and used. By default, the recording will be made one hour after the program end time. An advantage of making the recordings in the past is that it is possible to reschedule the recording if the program start or end time has changed, e.g. due to an extended sports event.

A typical installation will run the Convoy recorder on the same machine as SW Live Ingest. The SW Repackager will typically run on a dedicated machine.

4.1 Prerequisites

The table below summarizes the software versions used for this use case description.

System ComponentRelease version
ESB3003 SW Live Ingest1.10
ESB3002 SW Repackager1.14
ESB3005 Recorder/VoD Ingest2.18
ESB2001 Orbit 4020 TV ServerAny
Convoy2.12

4.2 Installation

Perform the installation according to the section [General Notes for Installation and Setup]. Also note the following:

  • Depending on the preferred deployment model, the file copies required for the recordings can either be performed on a Convoy mgmt machine, a dedicated recorder machine in the Convoy cluster, or on a SW Live Ingest machine.
  • The recorder must run on the same machines that run Convoy's recording-agent service. By default, this means the machines in the mgmt role. To run the recorders on dedicated machines or the SW Live Ingest machine, simply specify the recording-agent role in Convoy's install.conf. For example (using hostnames live-ingest-1 and live-ingest-2):

      hosts {
          ...
          recording-agent = { live-ingest-1 live-ingest-2 }
      }

4.3 Configuration

4.3.1 SW Live Ingest

In order to be used as a source for the Recorder, the ew-cbm service must be exposed to the Recorder. If the Recorder (and recording agent) runs on another machine, make sure the firewall is opened.

In addition, any channel to be recorded must exist in the SW Live Ingest channel configuration on the server, and have a circular buffer sufficiently large to hold the longest recording plus the buffered_schedule_delay. For configuration of the buffered_schedule_delay see the section "Scheduling Delay".

4.3.2 Software Repackager

In order to stream content that has been ingested by the Recorder, content locations need to be configured as sources in the Software Repackager.

Please see the Configuration section in [8] for details on how to configure sources in the Software Repackager.

4.3.3 Convoy

4.3.3.1 Repackagers, Live Ingest Servers and Storage Systems

Follow the section Set Up CCMI WebTV Recordings in the Convoy user guide [1]. In summary:

  • Add repackagers as origin servers. This is required by Convoy so there is a link between the origin and the CDN.
  • Add live ingest nodes as webtv_recorders.
  • Specify buffer size and ingest_script.

Take special care to configure the storages in the correct way. In Convoy you configure the target storage, where finished recordings will end up. This storage can be either a mounted file system or an FTP host. In addition to this, you must also make sure the catchup buffers are mounted on the machine running the recording agent service. The mount point must be exactly the same as it is on SW Live Ingest. The reason is that the CBM service in SW Live Ingest provides absolute paths to the recording agent that shall be copied. This source storage is not present in the Convoy configuration.

Note that the repackager needs to be configured to read the same storage root, but may have a different path to access it. Please see the Configuration section in [8] for details on how to configure managed sources in the Software Repackager.

4.3.3.2 Edge Caches

The edge caches are listed under streamers in convoy.conf. They must be manually configured with the proper backends to be able to find the repackagers. The recommended way to do this is to use the auto streamer configuration mode, and to specify the necessary backend using the extra_config mechanism.

Using the example above, a backend with prefix /__cl/s:storage-1,storage-2 should be created, and it should fetch content from repack-1 (primary) and repack-2 (secondary). In auto mode, Convoy will automatically create streamer groups named origin_server:repack-1 and origin_server:repack-2, so these can be used in the backend configuration. Create a backend on the streamer using e.g. confcli services.webtv.origin.backends -w. The result should look like:

"backends": [
    {
        "authorization": {
            "enable": false,
            "password": "",
            "user": ""
        },
        "caseSensitive": true,
        "prefix": "/<prefix>/__cl/s:storage-1,storage-2",
        "name": "jitp",
        "rewrite": {
            "that": "",
            "this": "/<prefix>"
        },
        "serverGroups": [
            "origin_server:repack-1",
            "origin_server:repack-2"
        ]
}

The prefix <prefix> must be substituted with your account prefix. Run convoy-admin account list --verbose to list account prefixes.

Refer to the Convoy User Guide for information on how to add this file to the streamer configuration using the extra_config property.

Note that streaming interfaces and session support must also be enabled using extra_config for automatic streamer configuration to work as expected (this requirement will be removed in later versions of Convoy). Depending on if the version of the streamer used supports IPv6 or not, care has to be taken in order to configure the streaming interfaces correctly with extra_config parameter by either defining the ipAddress6 key or not.

If two edge caches are used, it is recommended to swap the order of the primary and secondary repackaging node on the second edge, so that at least one edge can still reach its primary if one of the repackaging nodes should go down.

The resulting streamer configuration in convoy.conf will look something like this:

streamers {
  edge-1 {
    host = 10.16.1.160
    parent = edge-1
    configuration = auto
    extra_config = {
      @/etc/streamer_conf/repack_backend_1_2.json
      @/etc/streamer_conf/streaming_interfaces.json
      @/etc/streamer_conf/sessions.json
    }
  }
  edge-2 {
    host = 10.16.1.161
    parent = edge-2
    configuration = auto
    extra_config = {
      @/etc/streamer_conf/repack_backend_2_1.json
      @/etc/streamer_conf/streaming_interfaces.json
      @/etc/streamer_conf/sessions.json
    }
  }
}

Note that it is not a requirement to use the origin_server:* server groups defined by Convoy in the backend configuration. If specialized behaviour is needed, just add the necessary server groups using extra_config and refer to those in the backend instead.

4.3.3.3 CCMI Channels

Recordings are scheduled in Convoy via the CCMI interface. For that to be possible, Convoy must first be made aware of the channels that can be recorded. This can be done by using the channel CCMI CLI wrapper on any Convoy mgmt machine:

[root@mgmt-1 ~]# channel add -t "Edgy TV" edgytv -T mbr_ts_multicast

The channel name "edgytv" above must match the name of the corresponding channel in SW Live Ingest. The mbr_ts_multicast parameter must be specified to indicate that this channel will be used for Web TV recordings.

4.4 Testing the Installation

In order to verify that the system has been set up correctly, the following three steps are suggested. Consider enabling debug logging in Convoy before starting to make it easier to follow what is going on.

In production, recordings will typically be scheduled via the CCMI HTTP API (see the CCMI Specification for details), but for testing purposes it is convenient to use the command-line CCMI wrappers that Convoy provides, i.e. the channel and content commands.

4.4.1 Schedule and perform a recording

Schedule a recording from the channel edgytv using content record:

[root@mgmt-1 ~] content record -c edgytv -S HTTP -t "Evening News" \
  --start "2016-06-01T18:00:00Z" --stop "2016-06-01T19:00:00Z" evening-news
"evening-news" will record from 2016-06-01T18:00:00Z to 2016-06-01T19:00:00Z on channel "edgytv"

The recording will start once the stop time plus the ccmi.webtv_recording.buffered_schedule_delay defined in convoy.conf has passed. Check progress with journalctl -u convoy-recording-agent on the recording-agent nodes.

If there are multiple webtv_recorder entries in convoy.conf, one recording will be performed from each. The jobs will be spread randomly across the available recording agents, and it is possible that the same recording agent will perform several instances of the same recording.

If the scheduling fails, check for errors with:

    jorunalctl -u convoy-acctapi

and

    jorunalctl -u convoy-rec2

The content command can also be used to cancel a recording, or reschedule a pending recording. Run content --help and content <CMD> --help for more details.

The finished recording will end up on the storages defined in convoy.conf in a structure similar to this:

/mnt/nas2/rec-root/r/5/e/6/
|
|-- r_eveningnews_5e6cd2bd6d3a72e1723c288234670da6
|   |-- content_info.json
    |-- video_1.cmfv
    |-- video_1.dat
    |-- video_2.cmfv
    |-- video_2.dat
    |-- audio_eng_0.cmfa
    |-- audio_eng_0.dat
    |-- audio_chi_0.cmfa
    |-- audio_chi_0.dat
    |-- sub_eng_0.cmft
    |-- sub_eng_0.dat
    |-- sub_eng_0.cmft
    |-- sub_eng_0.dat

Each recording will be stored in a separate folder and should have one content_info.json file describing the content, a [variant].dat file describing the segments for each variant and a [variant].cmf[x] file, where x is v, a, or t for video, audio, and text, respectively. The file extensions and the variant containers follow the proposed MPEG CMAF format which uses the MPEG-4 ISOBMFF file format.

It is possible to play a ".cmfv" file using an application like VLC to verify that the recording has the expected duration and content.

4.4.2 Serve recording directly from Software Repackager

Once a recording exists on the shared storage, the next logical step is to test the repackager by requesting an HLS version of the recording directly from Nginx.

Use content get to find the HLS delivery URI for the recording (URIs somewhat shortened for easier presentation below):

[root@mgmt-1 ~]# content get evening-news
title:    Evening News
...
delivery URIs:
  hls:     /__cl/s:storage-1,storage-2/__c/r/6/1/3/r_eveningnews_613...bac/__op/hls-default/__f/index.m3u8
  mss:     /__cl/s:storage-1,storage-2/__c/r/6/1/3/r_eveningnews_613...bac/__op/mss-default/__f/Manifest
  dash:    /__cl/s:storage-1,storage-2/__c/r/6/1/3/r_eveningnews_613...bac/__op/dash-default/__f/manifest.mpd

The HLS master playlist can then be fetched using curl like this:

$ curl http://repack-1/__cl/s:storage-1,storage-2/__c/r/6/1/3/r_eveningnews_613...bac/__op/hls-default/__f/index.m3u8

If the above command fails, check the repackager's configuration and logs.

To actually play back the recording, simply point the client to the above URL.

4.4.3 Serve recording via request router and edge cache

When both the Recorder and the Software Repackager have been verified to work correctly, the final step is to bring Convoy's request router and the edge caches into the mix.

The only change compared to above is that the request should be made against the Convoy request router rather than against the repackager node. By also adding the -L switch to curl, the redirect from the request router will be followed. This should result in the edge serving the master playlist. Assuming there is a request router running on machine rr-1:

$ curl -L http://rr-1/__cl/s:storage-1,storage-2/__c/r/6/1/3/r_eveningnews_613...bac/__op/hls-default/__f/index.m3u8

If the request router fails to respond with a 302 redirect to a streamer, check the logs by:

    journalctl -u esb3008@*

If the streamer returns an error when the redirect is followed, check the logs on the Orbit.

5 Use Case: Upload VoD Content using the CMS API (CCMI)

CCMI is the name of Edgeware's CMS API and it allows administrators to upload VoD content from different sources and formats and store them in a single format, ESF. Content stored in the ESF format can then be processed by Edgeware's Software Repackager to serve different types of clients. The following types of media source formats are supported:

  • HTTP Live Streaming (HLS) (Both Byte-Range and file segments)
  • Microsoft Smooth Streaming (MSS) Client Format
  • MPEG-DASH on-demand
  • MP4 (SMIL)

Each source can be retrieved from the filesystem or from a remote location using HTTP or FTP.

5.1 Supported Media Formats

The following media formats are supported when uploading VoD Content to ESF:

  • Video
    • H264
    • HEVC
  • Audio
    • AAC
  • Subtitles
    • TTML (MP4, MPEG-DASH on-demand, and MSS Source)
    • WebVTT (MPEG-DASH on-demand and HLS Source)

When uploading a non-segmented media source like MPEG-DASH on-demand or MP4 (SMIL) content, the segmentation logic requires that there are common synchronization points among the different video tracks. This, more or less implies that the source content also must have all its video tracks in the same timescale in order to be successfully segmented.

The only TTML input that is supported for MPEG-DASH on-demand and MP4 VoD media sources, is side-car XML files. I.e. not segmented subtitles. The mime-type must be application/text+ttml.

For DASH on-demand, side-car WebVTT files are supported. They have mime-type 'text/vtt'.

5.1.1 TTML Format Details

Subtitles are stored in TTML (Timed Text Markup Language) as defined in [5]. For each language there is a separate div tag in which all the cues for that language are listed. The language of each subtitle track is specified with the xml:lang attribute within the div tag:

<tt>
  ...
  <body>
    <div xml:id="captions" xml:lang="ger">
      <p begin="00:00:10:920" end="00:00:11:360">Ein Paar Schuhe, Bitte.</p>
      ...
    </div>
    <div xml:id="captions" xml:lang="ita">
      <p begin="00:00:10:920" end="00:00:11:360">Un paio di scarpe, per favore.</p>
      ...
    </div>
  </body>
</tt>

See section Selecting Subtitle Tracks for how to reference specific subtitle languages from the SMIL file.

5.1.2 MPEG-DASH On-Demand Format Details

There are many types and flavors of MPEG-DASH VoD assets. The Recorder currently has support for the DASH-IF on-demand profile including side-loaded subtitle files. (See [6]).

In the example below, there is one subtitle track provided as a TTML file and another provided as a WebVTT file. Normally, one input format is used for all subtitles.

Example:

<?xml version="1.0"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500S" type="static"
     mediaPresentationDuration="PT0H0M30.067S" maxSegmentDuration="PT0H0M4.000S"
     profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
 <ProgramInformation moreInformationURL="http://gpac.sourceforge.net">
  <Title>test30s</Title>
 </ProgramInformation>
 <Period duration="PT0H0M30.067S">
   <AdaptationSet contentType="video" segmentAlignment="true" maxWidth="960" maxHeight="540"
                  maxFrameRate="30" par="16:9" lang="und" subsegmentAlignment="true"
                  subsegmentStartsWithSAP="1">
   <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
   <Representation id="1" mimeType="video/mp4" codecs="avc1.640029" width="640"
                   height="360" frameRate="30" sar="1:1" startWithSAP="1"
                   bandwidth="304836">
    <BaseURL>video300kbps.mp4</BaseURL>
    <SegmentBase indexRangeExact="true" indexRange="915-1042">
      <Initialization range="0-914"/>
    </SegmentBase>
   </Representation>
   <Representation id="3" mimeType="video/mp4" codecs="avc1.640029" width="960"
                   height="540" frameRate="30" sar="1:1" startWithSAP="1"
                   bandwidth="603350">
    <BaseURL>video600kbps.mp4</BaseURL>
    <SegmentBase indexRangeExact="true" indexRange="915-1042">
      <Initialization range="0-914"/>
    </SegmentBase>
   </Representation>
  </AdaptationSet>
  <AdaptationSet contentType="audio" segmentAlignment="true" lang="eng" subsegmentAlignment="true"
                 subsegmentStartsWithSAP="1">
   <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
   <Representation id="2" mimeType="audio/mp4" codecs="mp4a.40.2" audioSamplingRate="48000"
                   startWithSAP="1" bandwidth="14764">
    <AudioChannelConfiguration
        schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
    <BaseURL>audio.mp4</BaseURL>
    <SegmentBase indexRangeExact="true" indexRange="836-963">
      <Initialization range="0-835"/>
    </SegmentBase>
   </Representation>
  </AdaptationSet>
  <AdaptationSet contentType="text" mimeType="application/ttml+xml" lang="swe">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="subtitle"/>
    <Representation id="sub_swe" bandwidth="2000">
      <BaseURL>sub_swe.ttml</BaseURL>
    </Representation>
  </AdaptationSet>
  <AdaptationSet contentType="text" mimeType="text/vtt" lang="nor">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="subtitle"/>
    <Representation id="sub_nor" bandwidth="2000">
      <BaseURL>sub_nor.vtt</BaseURL>
    </Representation>
  </AdaptationSet>
 </Period>
</MPD>

5.1.3 SMIL Format Details

SMIL files come in many types and flavors. The Recorder currently supports segmenting of MP4 VoD assets which are described using a subset of the Wowza SMIL format.

5.1.3.1 Simple SMIL File

In its most basic form, the SMIL file lists a number of media source paths and their individual bitrates.

<?xml version="1.0"?>
<smil>
  <head>
</head>
  <body>
    <switch>
      <video src="high.mp4" system-bitrate="2000000"/>
      <video src="medium.mp4" system-bitrate="1000000"/>
      <video src="low.mp4" system-bitrate="500000"/>
    </switch>
  </body>
</smil>

Since there is no information describing what tracks these files contain, or which of those tracks to include in the output, the Recorder will process every track that is found in each source file. Every track will yield a separate variant in the ABR output.

5.1.3.2 SMIL Files with Specific Tracks

5.1.3.2.1 Selecting Audio and Video Tracks

In order to extract a single media type from a source file, and also specify the bitrate and language for that variant, the audioOnly and videoOnly attributes are used. The example below creates an output with two variants at high bitrate and two variants at low bitrate:

<?xml version="1.0"?>
<smil>
  <head/>
  <body>
    <switch>
      <video src="high.mp4" system-bitrate="2000000">
        <param name="videoOnly" value="TRUE" valuetype="data"/>
      </video>
      <video src="high.mp4" audio-bitrate="128000">
        <param name="audioOnly" value="TRUE" valuetype="data"/>
      </video>
      <video src="low.mp4" system-bitrate="500000">
        <param name="videoOnly" value="TRUE" valuetype="data"/>
      </video>
      <video src="low.mp4" audio-bitrate="64000">
        <param name="audioOnly" value="TRUE" valuetype="data"/>
      </video>
    </switch>
  </body>
</smil>

If a source file contains more than one track of the same media type, e.g. two audio tracks, then an index is needed to uniquely identify each track that should be used. The track index is included in the src tag as a query string parameter:

<?xml version="1.0"?>
<smil>
  <head/>
  <body>
    <switch>
      <video src="mp4:movie.mp4?audioindex=0" audio-bitrate="128000" system-language="Mandarin">
        <param name="audioOnly" value="TRUE" valuetype="data"/>
      </video>
      <video src="mp4:movie.mp4?audioindex=1" audio-bitrate="128000" system-language="Korean">
        <param name="audioOnly" value="TRUE" valuetype="data"/>
      </video>
      <video src="movie.mp4" system-bitrate="2000000">
        <param name="videoOnly" value="TRUE" valuetype="data"/>
      </video>
    </switch>
  </body>
</smil>

Tracks are selected using the audioindex or videoindex query parameter, depending on the type of the track. The track indices are enumerated from 0 per media type in the order they appear in the MP4 file, e.g. the first audio track and the first video track both have the index 0.

Note that the asset filename should be prefixed with mp4: when a query parameter is used.

5.1.3.2.2 Selecting Subtitle Tracks

Subtitle tracks are added to the SMIL file by using the textstream tag which should reference a TTML file as its src. The language contained within each TTML file is specified as an ISO 639 code in the system-language attribute. If there are multiple languages available in a TTML file, a comma-separated list of language codes is used to specify which languages to include:

<textstream src="captions.ttml" system-language="ger,ita">
</textstream>

5.2 VoD in Convoy

5.2.1 Enabling VoD Repackaging in Configuration

The following parameters must be set in convoy.conf to repackage VoD uploads to to ESF:

ccmi.webtv_upload.storages = { storage1 }
ccmi.webtv_upload.repackage = true

ccmi.webtv_upload.storages specifies the storage IDs where the VoD content will be stored and ccmi.webtv_upload.repackage enables repackaging into ESF.

The upload and repackaging will take place on nodes with the upload-agent role (which defaults to the management nodes unless it has been explicitly defined), and log output will end up in journald. It can be read with:

    journalctl -u convoy-upload

5.2.2 VoD Upload Examples

5.2.2.1 MPEG-DASH On-Demand Source

An MPEG-DASH VoD file with the .mpd extension is required as location when uploading and repackaging MPEG-DASH VoD content into ESF.

Example:

HTTP

content upload -l http://mynas/asset/manifest.mpd ASSET_ID -t 'ASSET TITLE' -S HTTP

FTP

content upload -l ftp://user:pwd@mynas/asset/manifest.mpd ASSET_ID -t 'ASSET_TITLE' -S HTTP

File

content upload -l file:///mynas/asset/manifest.mpd ASSET_ID -t 'ASSET TITLE' -S HTTP

5.2.2.2 MP4 Source

An MP4 SMIL file with the .smil extension is required as location when uploading and repackaging MP4 VoD content into ESF.

Example:

HTTP

content upload -l http://mynas/asset/asset.smil ASSET_ID -t 'ASSET TITLE' -S HTTP

FTP

content upload -l ftp://user:pwd@mynas/asset/asset.smil ASSET_ID -t 'ASSET_TITLE' -S HTTP

File

content upload -l file:///mynas/asset/asset.smil ASSET_ID -t 'ASSET TITLE' -S HTTP

5.2.2.3 HLS Source

The master playlist file is specified as location when uploading a HLS VoD content.

Example:

HTTP

content upload -l http://mynas/asset/index.m3u8 ASSET_ID -t 'ASSET TITLE' -S HTTP

FTP

content upload -l ftp://user:pwd@mynas/asset/index.m3u8 ASSET_ID -t 'ASSET TITLE' -S HTTP

File

content upload -l file:///mynas/asset/index.m3u8 ASSET_ID -t 'ASSET TITLE' -S HTTP

6 Use Case: VOD Ingest using AWS S3 object storage

ESB3005 VoD Ingest on its own only supports ingest to a mounted file storage or FTP. In order to perform VoD ingest to S3 object storage, e.g. to an AWS S3 bucket, the ESB3005 ISO also bundle and installs the s3fs-fuse package. s3fs allow fuse mounts of S3 buckets, to allow it to be be treated as mounted storage.

To be able to use fuse mounts that may be mounted and accessible by any user, make sure that the following line exists in /etc/fuse.conf

user_allow_other

Mount an AWS S3 bucket:

mkdir /path/to/mountpoint
echo "<mybucket>:<myAccessKeyId>:<mySecretAccessKey>" >> $HOME/.passwd-s3fs
chmod 600 $HOME/.passwd-s3fs
s3fs <mybucket> /path/to/mountpoint -o passwd_file=$HOME/.passwd-s3fs -o umask=133 -o allow_other

Or mount as root via fstab:

mkdir /path/to/mountpoint
echo "<mybucket>:<myAccessKeyId>:<mySecretAccessKey>" >> /etc/passwd-s3fs
chmod 600 /etc/passwd-s3fs
echo "s3fs#<mybucket> /path/to/mountpoint fuse _netdev,allow_other 0 0" >> /etc/fstab

For further details about s3fs and additional options, see:

man s3fs

When s3fs is successfully mounted it is possible to use it via the mount point as any mounted file system. Please note that S3 is a HTTP based interface, and s3fs is not 100% POSIX compliant and some limitations apply on what you can and should do. The ew-recorder command is s3fs compliant.

Perform VoD ingest:

ew-recorder --input /path/to/source/content.smil --output /path/to/mountpoint/content [--content-id content] [--log-level info]

See [9] for further details about VoD ingest using ESB3005.

6.1 s3fs local storage

The use of a local cache directory for intermediate storage can be turned on or off in s3fs. Normally the cache should be disabled in a write-only use case for performing VOD Ingest/recordings. But even with the cache directory disabled, s3fs will utilize temporary local storage for any currently opened files towards the s3fs mount. This means that it is required to have enough local accessible disk space to fit the size of all concurrent recordings. And if the source files for VOD ingest are also on a S3 bucket, it is required to have twice the size of all concurrent recordings in available local disk space.

7 Use Case: VOD Ingest using Azure blob object storage

ESB3005 VoD Ingest on its own only supports ingest to a mounted file storage or FTP. In order to perform VoD ingest to blob object storage, e.g. to an Azure container, the ESB3005 ISO also bundles and installs the blobfuse package. Blobfuse allows fuse mounts of blob containers, to allow it to be be treated as mounted storage.

To be able to use fuse mounts that may be mounted and accessible by any user, make sure that the following line exists in /etc/fuse.conf

user_allow_other

7.1 Blobfuse cache directory

Blobfuse requires a cache directory for intermediate storage. The cache directory should preferably be on fast local storage or even RAM disk for best performance. The size of the storage where the cache directory resides, needs to be large enough to hold the size of all concurrent recordings performed on a single blobfuse mount.

7.2 Non-persistent user mount

Create the cache and mount directories:

mkdir -p /path/to/blobfusecachedir
mkdir -p /path/to/mountpoint

Create the blobfuse configuration file $HOME/.blobfuse.cfg containing:

accountName <account-name-here>
# Please provide either an account key or a SAS token, and delete the other line.
accountKey <account-name-here-delete-next-line>
sasToken <shared-access-token-here-delete-previous-line>
containerName <container-name-here>

Set access rights for the configuration file:

chmod 600 $HOME/.blobfuse.cfg

Mount the blob container using blobfuse:

blobfuse /path/to/mountpoint --config-file=$HOME/.blobfuse.cfg --tmp-path=/path/to/blobfusecachedir -o umask=133 -o allow_other

7.3 Persistent mount as root via fstab

Create mount script /usr/bin/blobfusemount.sh as root, with blobfuse specific options, containing:

#!/bin/bash
MOUNT_DIR=$1
/usr/bin/blobfuse $MOUNT_DIR --tmp-path=/path/to/blobfusecachedir --config-file=/etc/blobfuse.cfg -o allow_other

Make the mount script executable for root:

sudo chmod 744 /usr/bin/blobfusemount.sh

Create the cache and mount directories:

sudo mkdir -p /path/to/blobfusecachedir
sudo mkdir -p /path/to/mountpoint

Create the blobfuse configuration file /etc/blobfuse.cfg containing:

accountName <account-name-here>
# Please provide either an account key or a SAS token, and delete the other line.
accountKey <account-name-here-delete-next-line>
sasToken <shared-access-token-here-delete-previous-line>
containerName <container-name-here>

Set access rights for the configuration file:

sudo chmod 600 /etc/blobfuse.cfg

Add a line with a mount entry to /etc/fstab:

/usr/bin/blobfusemount.sh /path/to/mountpoint fuse _netdev,allow_other 0 0

Mount the container:

sudo mount /path/to/mountpoint

For further details about blobfuse and additional options, see https://github.com/Azure/azure-storage-fuse.

7.4 VoD ingest

When blobfuse is successfully mounted, it is possible to use it via the mount point as a mounted file system. Please note that the underlying API towards Azure blob storage is a HTTP based interface, and it is not 100% POSIX compliant and limitations apply on what you can and should do. The ew-recorder command is blobfuse compliant.

Perform VoD ingest:

ew-recorder --input /path/to/source/content.smil --output /path/to/mountpoint/content [--content-id content] [--log-level info]

See [9] for further details about VoD ingest using ESB3005.

8 Use Case: Recordings to AWS S3 object storage

The ESB3005 recorder on its own only supports recordings to a mounted file storage or FTP. In order to perform recordings from the Catch-up Buffer Manager service (ew-cbm) to S3 object storage, e.g. to an AWS S3 bucket, the ESB3005 ISO also bundles and installs the s3fs-fuse package. s3fs allow fuse mounts of S3 buckets, to allow it to be be treated as mounted storage.

Install ESB3005 on the same host as ESB3003 as described in [9].

See [VoD Ingest for AWS S3] for information on how to set up s3fs.

AWS s3 recording may then be performed by:

ew-recorder --cbm --host 127.0.0.1 --start-epoch <start time> --stop-epoch <stop time> --channel <live ingest channel> --output /path/to/s3fsmountpoint/content-name [--content-id <content id>] [--log-level <level>]

See [9] for further details about how to perform live recordings using ESB3005.

9 Use Case: Recordings to Azure blob storage

The ESB3005 recorder on its own only supports recordings to a mounted file storage or FTP. In order to perform recordings from the Catch-up Buffer Manager service (ew-cbm) to Azure blob storage, the ESB3005 ISO also bundles and installs the blobfuse package. blobfuse allow fuse mounts of Azure blob containers, to allow it to be be treated as mounted storage.

Install ESB3005 on the same host as ESB3003 as described in [9].

See [VoD Ingest for Azure blob] for information on how to set up blobfuse.

Azure blob storage recording may then be performed by:

ew-recorder --cbm --host 127.0.0.1 --start-epoch <start time> --stop-epoch <stop time> --channel <live ingest channel> --output /path/to/blobfusemountpoint/content-name [--content-id <content id>] [--log-level <level>]

See [9] for further details about how to perform live recordings using ESB3005.

12 - General

12.1 - Monitoring and Logging

Health, service logs and monitoring

Health check

You can check the health of the server by making a request to /healthz, which should return a 200 OK response.

Structured Logging

To aid processing, structured logging is available. This makes the logs more coherent, and more suitable for processing by external tools. The log formats journald or consolejson will trigger structured logging.

Log messages related to a specific HTTP request include the log field named request_id which can be used to filter out specific requests.

The log field named topic is always present and is used to separate different areas of logging. The topics are access, messages, licensing and error. It is useful when querying the log.

Log formats

When run from the command line the application can log in one of the formats consolepretty, consolejson or journald depending on the value of the -logformat parameter. Logging can be disabled by using the value discard.

$ ew-vod2cbm -upstream http://127.0.0.1 -logformat consolejson

consolepretty logs to standard output (stdout) in a human-readable format. Each log line starts with the date and the log message followed by the context- dependent log fields:

2022-02-07T11:54:42Z INF Incoming request bytes_out=27592 latency_ms=6.18251 method=GET ...

consolejson logs to stdout using a JSON object for each message:

{level:info,topic:access,time:2022-02-07T12:06:07Z,bytes_out:27592, ...}

When running as a systemd service, it logs directly to journald. In this case field names are upper case whereas the values keep their format.

Here are a few examples of querying the logs:

$ journalctl -u ew-vodjit TOPIC=access -o verbose

To see entries with a specific request ID:

$ journalctl -u ew-vod2cbm REQUEST_ID=host/B1Po0eYz1d-000006 -o verbose

To see the call stack in the event of a crash:

$ journalctl -u ew-manip TOPIC=error -o verbose

Using the verbose output includes all available name-value fields. Without this only the log message is printed. The field named JSON contains the original structured log message as sent by the service. To filter out only this field --output-fields=JSON can be used, however this requires a systemd version of at least 236.

$ journalctl -u ew-vod2cbm --output-fields=JSON TOPIC=access

To continuously monitor the service:

$ journalctl -fu ew-vod2cbm

Log levels

The startup log level is set according to the service configuration. The log level for a running service can be changed by posting a form-field named level to the loglevel endpoint. For example:

$ curl -F level=debug ew-vod2cbm-server:8090/loglevel

The available log levels and how they relate to systemd priority values is listed below:

Log level  Systemd priority
trace      7
debug      7
info       6
warn       4
error      3
fatal      2
panic      0

To e.g. see all error [3] and warning [4] messages using journalctl:

$ journalctl -u ew-vod2cbm PRIORITY=3 PRIORITY=4

Use a GET request to see the current log level:

$ curl ew-vod2cbm-server:8090/loglevel

Messages with higher level than the configured one will not be logged.

Monitoring

The services generate Prometheus data, available at the endpoint: /metrics. The respective metrics for the services are:

ew-vod2cbm

ew_audio_segment_requests_total
ew_audio_segment_request_duration_milliseconds
ew_video_segment_requests_total
ew_video_segment_request_duration_milliseconds
ew_subs_segment_requests_total
ew_subs_segment_request_duration_milliseconds
ew_segment_times_requests_total
ew_segment_times_request_duration_milliseconds
ew_content_info_requests_total
ew_content_info_request_duration_milliseconds

ew-manip

ew_hls_requests_total
ew_hls_request_duration_milliseconds
ew_dash_requests_total
ew_dash_request_duration_milliseconds

ew-vodjit

ew_cmaf_segment_requests_total
ew_cmaf_segment_request_duration_milliseconds
ew_dat_segment_requests_total
ew_dat_segment_request_duration_milliseconds
ew_content_info_requests_total
ew_content_info_request_duration_milliseconds
ew_manifest_requests_total
ew_manifest_request_duration_milliseconds

12.2 - CCMI URLs

Edgeware’s origin CCMI URLs

Edgeware’s origin URL format is called CCMI URLs and is the format that AgileTV Origin understands. A typical URL looks like:

http://<server>/__cl/<cl>/__c/<content>/__op/<op>/__f/<pres><ext>

where the different parts are indicated by prefixes starting with two underscores, and where the file extension <ext> starts with a period if present.

The most important AgileTV Origin fields are:

__cl : content location with parts prefix:name
       + cg:<live> stands for channel group <live> and denote a group
         of live channels configured with the name <live>
       + s:<vod> stands for a storage path for vod assets
__c  : the actual content or asset path (can contain slashes)
__op : output profile `<op>`, defining the encryption/DRM system or segment addressing
       Segments with different output profiles are not compatible
__f : the file path but also the way to choose a presentation.
      A presentation is a manifest variation, for example exluding some variants.
      The segments can be the same between presentation.
      The extensions ".m3u8" maps to HLS, ".mpd" maps to DASH and "Manifest" or
      ".ism/Manifest" map to MSS

The <pres> part is matched to a presentation configured in repackager. The <live>, <vod>, <op> are also defined in the repackager configuration.

For segments, the URLs are further enhanced with a config_id (for live/catchup), a variant, and a segment number (for HLS and DASH with $Number$)

__f/<cfg_id>/<variant>/<nr>.cmfv
__f/<cfg_id>/<variant>/<nr>.ts

or with a time (for DASH and MSS)

__f/<cfg_id>/<variant>/D<time>.cmfv
__f/<cfg_id>/QualityLevels({bitrate})/Fragments(video={start time})

In addition, there are other possible parts like

__dci : DRM Content ID - an id used to lookup the key from license server
__account : Account to distinguish different tenants

Finally, there are query parameters for time intervals

?startTime=
?stopTime=

and query parameters for variant flags mask

?p=<variant_flags_mask>

In addition, there may also be a part ?pre=1 that triggers ESB3020 - ew-manip.

12.3 - ESF Format

Introduction to the Edgeware Storage Format (ESF)

ESF is Edgeware’s CMAF-based storage format for both live and VoD content. It saves media data in CMAF tracks, and has additional metadata files. It supports H.264/AVC and HEVC/H.265 video, AAC and AC-3 audio, and wvtt subtitles.

Asset media data

The media data is stored as CMAF tracks in files with extensions “.cmfv”, “.cmfa”, and “.cmft”, for video, audio, and subtitles, respectively. The subtitle format is “wvtt” which is much more storage-efficient than “stpp”.

Asset metadata

The metadata for the assets are stored in two places:

  1. a single content_info.json file describing the tracks
  2. segment info (.dat) files describing the segments, one per track

Content info

Content info is stored in a file named content_info.json inside the asset directory. It is a JSON file containing enough information about the tracks of the assets, to be able to fill in all information about media tracks in HLS, DASH, or MSS manifests. This includes codecs, languages, time scales, bitrates etc. However, it does not contain information about individual segments. Such information is stored in segment info files.

Segment info

Metadata about the segments are stored in segment info files with extension .dat. There is exactly one such file for each media file.

These files describe the data of the individual segments of the CMAF tracks with a 32-byte entry for each segment:

FieldTypeDescription
Nruint32Segment number
Timeuint64Time (normally presentationTime=DecodeTime)
Duruint32Duration of segment in timescale specified in content info
Sizeuint32Size in bytes
Offsetuint64Byte offset inside track file
Restuint32Flags for SCTE-markers and other information

For VoD assets, an init segment is stored at the start of the file. Its size is given by the Offset of the first media segment in the segment info file.

Commonalities with DASH OnDemand format

DASH OnDemand stores media data in the same type of CMAF tracks as ESF. However, the metadata is stored in other structures.

To describe the asset and its variants, there is a manifest called Media Presentation Description (MPD) which is an XML file with file extension .mpd.

It is similar to the ESF content_info.json file. It has explicit switching groups called Adaptation Sets, but is lacking some other information compared to ESF like video parameter sets which are needed to generate MSS manifests.

Similar to ESF, there is a second structure that contains the information about the segments. In the case of DASH OnDemand, this information is stored in a sidx box inside the CMAF track itself. Its position is at the beginning of the media file right after the init segment, and before the actual media data.

By generating a DASH MPD file, and inserting a sidx box in the media tracks, it is possible to make VoD assets which are both compatible with DASH OnDemand and the ESF format. The new ESB3031 ew-vodingest tool generates such combined ingested files. For DASH OnDemand, a complete WebVTT file is used instead of wvtt segments. That complete WebVTT file is generated by extracting and concatenating all subtitle cues from the wvtt subtitle tracks used in the ESF format.

Live storage using ESF

The main reason to use ESF instead of DASH OnDemand, is that the latter does not support live content, but requires a static structure. In fact, since the sidx box must be placed before the media, it is not even possible to concatenate media segments and write a sidx box at the end. With ESF we can have the same format for both VoD and live.

The SegmentInfo files are separated from the media files and use 32 bytes per segment. These are therefore easy to seek and also to grow, by just adding another 32 bytes for each segment. In the ESB3003 catchup buffer, we store live content in one-minute files.

12.4 - Licensing

Using the licensed products

All AgileTV Processing products require a valid license file to operate. For the server products a few endpoints such as /metrics and /licensing are accessible without a valid license, but the core functionality requires a license.

The license file

The license file must be obtained from AgileTV along with your software. Depending on your agreement the file will contain either an online or offline license. For online licenses, the machine running the service, must have an internet connection, in order to access the license server.

The command-line products, such as ew-vodingest only support offline licenses.

Using the license file

The license must be placed in: /etc/edgeware/<product-name>/license.json e.g: /etc/edgeware/ew-vod2cbm/license.json You must never attempt to edit the license file. When you receive a new license.json, and your product is a service, the service must be restarted.

License expiry

Your product will not work beyond the expiry date. For online as well as offline licenses the server product logs will warn you that the service is about to expire, when the expiry date is closer than 7 days. For automatic expiry monitoring, the /licensing HTTP endpoint is recommended. Please note that there will be no warning before expiry for command-line products.

When the service, under a valid service contract, is about to expire, your license must be renewed:

  • For online licenses, AgileTV should renew your service license on a central license server. The licensing status can be checked by calling the /licensing endpoint (see below).
  • For offline licenses, you should obtain a new license file.

Online licenses

Less than three minutes after a service is started it starts to query the license server periodically. In case of temporary network or license server outages (up to 2 hours), your service will continue to function.

Checking the license: /licensing endpoint

You may query status of your license by querying your service with the /licensing endpoint. The response, in JSON-format, looks like:

$ curl localhost:8090/licensing
{
    "status": "valid",
    "pending_until": "",
    "expiry": "2022-12-31T23:59:29Z",
    "invalid_reason": "",
    "license_type": "online"
}

The call will return "status": "pending" during temporary network outage and for less than three minutes after the service has been restarted. The response for an expired license looks like:

{
    "status": "invalid",
    "pending_until": "",
    "expiry": "2021-12-31T23:59:29Z",
    "invalid_reason": "expired",
    "license_type": "online"
}

Checking the license: server log

If the service has, or is about to expire, the server log will show the status under "topic":"licensing". For example:

{"level":"warn","request_id":"adam/HLYRsgfrwz-000005","topic":"licensing",
"LicenseExpiryDate":"2022-08-30T23:59:09Z","time":"2022-08-24T11:42:28Z",
"message":"License will expire in less than 7 days, please remember to get a renewed license"}

These log messages only appear when a licensed endpoint e.g. /segment_times.json is called.