New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@fgv/ts-utils

Package Overview
Dependencies
Maintainers
1
Versions
95
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@fgv/ts-utils - npm Package Compare versions

Comparing version 1.2.1 to 1.3.0

brand.d.ts

254

converter.d.ts
import { Result } from './result';
import { Brand } from './brand';
declare type OnError = 'failOnError' | 'ignoreErrors';
/**
* Converter traits.
* @public
*/

@@ -11,3 +13,4 @@ export interface ConverterTraits {

/**
* Options for @see Converter @see withConstraint
* Options for {@link Converter.withConstraint}.
* @public
*/

@@ -22,97 +25,142 @@ export interface ConstraintOptions {

/**
* Helper type to brand a simple type to prevent inappropriate use
* Generic converter to convert unknown to a templated type `<T>`, using
* intrinsic rules or as modified by an optional conversion context
* of optional templated type `<TC>` (default `undefined`).
* @public
*/
export declare type Brand<T, B> = T & {
__brand: B;
};
export interface Converter<T, TC = undefined> extends ConverterTraits {
/**
* Indicates whether this element is explicitly optional
* Indicates whether this element is explicitly optional.
*/
readonly isOptional: boolean;
/**
* Returns the brand for a branded type
* Returns the brand for a branded type.
*/
readonly brand?: string;
/**
* Converts from unknown to <T>
* @param from The unknown to be converted
* @param context An optional context applied to the conversion
* @returns An @see Result with a value or an error message
* Converts from `unknown` to `<T>`.
* @param from - The `unknown` to be converted
* @param context - An optional conversion context of type `<TC>` to be used in
* the conversion.
* @returns A {@link Result} with a {@link Success} and a value on success or an
* {@link Failure} with a a message on failure.
*/
convert(from: unknown, context?: TC): Result<T>;
/**
* Converts from unknown to <T> or undefined, as appropriate.
* If 'onError' is 'failOnError', the converter succeeds for
* 'undefined' or any convertible value, but reports an error
* if it encounters a value that cannot be converted. If 'onError'
* is 'ignoreErrors' (default) then values that cannot be converted
* result in a successful return of 'undefined'.
* @param from The unknown to be converted
* @param context Optional context for use by the converter
* @param onError Specifies handling of values that cannot be converted, default 'ignoreErrors'
* Converts from `unknown` to `<T>` or `undefined`, as appropriate.
*
* @remarks
* If `onError` is `failOnError`, the converter succeeds for
* `undefined` or any convertible value, but reports an error
* if it encounters a value that cannot be converted.
*
* If `onError` is `ignoreErrors` (default) then values that
* cannot be converted result in a successful return of `undefined`.
* @param from - The `unknown` to be converted
* @param context - An optional conversion context of type `<TC>` to be used in
* the conversion.
* @param onError - Specifies handling of values that cannot be converted (default `ignoreErrors`).
* @returns A {@link Result} with a {@link Success} and a value on success or an
* {@link Failure} with a a message on failure.
*/
convertOptional(from: unknown, context?: TC, onError?: OnError): Result<T | undefined>;
/**
* Creates a converter for an optional value. If 'onError'
* is 'failOnError', the converter accepts 'undefined' or a
* convertible value, but reports an error if it encounters
* a value that cannot be converted. If 'onError' is 'ignoreErrors'
* (default) then values that cannot be converted result in a
* successful return of 'undefined'.
* Creates a {@link Converter} for an optional value.
*
* @param onError Specifies handling of values that cannot be converted, default 'ignoreErrors'
* @remarks
* If `onError` is `failOnError`, the resulting converter will accept `undefined`
* or a convertible value, but report an error if it encounters a value that cannot be
* converted.
*
* If `onError` is `ignoreErrors` (default) then values that cannot be converted will
* result in a successful return of `undefined`.
*
* @param onError - Specifies handling of values that cannot be converted (default `ignoreErrors`).
* @returns A new {@link Converter} returning `<T|undefined>`.
* */
optional(onError?: OnError): Converter<T | undefined, TC>;
/**
* Applies a (possibly) mapping conversion to the converted value.
* @param mapper A function which maps from the converted type to some other type.
* Creates a {@link Converter} which applies a (possibly) mapping conversion to
* the converted value of this {@link Converter}.
* @param mapper - A function which maps from the the result type `<T>` of this
* converter to a new result type `<T2>`.
* @returns A new {@link Converter} returning `<T2>`.
*/
map<T2>(mapper: (from: T) => Result<T2>): Converter<T2, TC>;
/**
* Applies an additional converter to the converted value.
* @param mapConverter The converter to be applied to the converted value
* Creates a {@link Converter} which applies an additional supplied
* converter to the result of this converter.
*
* @param mapConverter - The {@link Converter} to be applied to the
* converted result from this {@link Converter}.
* @returns A new {@link Converter} returning `<T2>`.
*/
mapConvert<T2>(mapConverter: Converter<T2>): Converter<T2, TC>;
/**
* Maps the individual items of the resulting value with the supplied
* map function. Fails if 'from' is not an array.
* @param mapper The map function
* Creates a {@link Converter} which maps the individual items of a collection
* resulting from this {@link Converter} using the supplied map fuction.
*
* @remarks
* Fails if `from` is not an array.
*
* @param mapper - The map function to be applied to each element of the
* result of this {@link Converter}.
* @returns A new {@link Converter} returning `<TI[]>`.
*/
mapItems<TI>(mapper: (from: unknown) => Result<TI>): Converter<TI[], TC>;
/**
* Maps the individual items of the resulting value with the supplied
* converter function. Fails if 'from' is not an array.
* @param mapConverter The map
* Creates a {@link Converter} which maps the individual items of a collection
* resulting from this {@link Converter} using the supplied {@link Converter}.
*
* @remarks
* Fails if `from` is not an array.
*
* @param mapConverter - The {@link Converter} to be applied to each element of the
* result of this {@link Converter}.
* @returns A new {@link Converter} returning `<TI[]>`.
*/
mapConvertItems<TI>(mapConverter: Converter<TI, unknown>): Converter<TI[], TC>;
/**
* Applies a type guard to the conversion result.
* @param guard The type guard function to apply
* @param message Optional message to be reported on failure
* Creates a {@link Converter} which applies a supplied type guard to the conversion
* result.
* @param guard - The type guard function to apply.
* @param message - Optional message to be reported if the type guard fails.
* @returns A new {@link Converter} returning `<TI>`.
*/
withTypeGuard<TI>(guard: (from: unknown) => from is TI, message?: string): Converter<TI, TC>;
/**
* Applies a type guard to each member of the conversion result. Fails
* if the conversion result is not an array or if any member fails the
* Creates a {@link Converter} which applies a supplied type guard to each member of
* the conversion result from this converter.
*
* @remarks
* Fails if the conversion result is not an array or if any member fails the
* type guard.
* @param guard The type guard function to apply to each element
* @param message Optional message to be reported on failure
* @param guard - The type guard function to apply to each element.
* @param message - Optional message to be reported if the type guard fails.
* @returns A new {@link Converter} returning `<TI>`.
*/
withItemTypeGuard<TI>(guard: (from: unknown) => from is TI, message?: string): Converter<TI[], TC>;
/**
* Creates a converter with an optional constraint. If the base converter
* succeeds, calls a supplied constraint evaluation function with the
* value and fails the conversion if the function returns either false
* or Failure<T>.
* Creates a {@link Converter} which applies an optional constraint to the result
* of this conversion. If this {@link Converter} (the base converter) succeeds, the new
* converter calls a supplied constraint evaluation function with the conversion, which
* fails the entire conversion if the constraint function returns either `false` or
* {@link Failure | Failure<T>}.
*
* @param constraint Constraint evaluation function
* @param options Options for constraint evaluation
* @param constraint - Constraint evaluation function.
* @param options - {@link ConstraintOptions | Options} for constraint evaluation.
* @returns A new {@link Converter} returning `<T>`.
*/
withConstraint(constraint: (val: T) => boolean | Result<T>, options?: ConstraintOptions): Converter<T, TC>;
/**
* Adds a brand to the type to prevent mismatched usage of simple types
* returns a converter which adds a brand to the type to prevent mismatched usage
* of simple types.
* @param brand - The brand to be applied to the result value.
* @returns A {@link Converter} returning `Brand<T, B>`.
*/
withBrand<B extends string>(brand: B): Converter<Brand<T, B>, TC>;
}
/**
* internal
*/
declare type InnerInferredType<TCONV> = TCONV extends Converter<infer TTO> ? (TTO extends Array<infer TTOELEM> ? InnerInferredType<TTOELEM>[] : TTO) : (TCONV extends Array<infer TELEM> ? InnerInferredType<TELEM>[] : TCONV);

@@ -122,3 +170,4 @@ /**

* for complex as well as simple types.
* @example Infer<typeof Converters.mapOf(Converters.stringArray)> is Map<string, string[]>
* @example `Infer<typeof Converters.mapOf(Converters.stringArray)>` is `Map<string, string[]>`
* @beta
*/

@@ -129,102 +178,97 @@ export declare type Infer<TCONV> = TCONV extends Converter<infer TTO> ? InnerInferredType<TTO> : never;

* @deprecated use @see Infer instead
* @internal
*/
export declare type ConvertedToType<TCONV> = Infer<TCONV>;
/**
* Simple templated converter wrapper to simplify typed conversion from unknown.
* Base templated wrapper to simplify creation of new {@link Converter}s.
* @public
*/
export declare class BaseConverter<T, TC = undefined> implements Converter<T, TC> {
/**
* @internal
*/
protected readonly _defaultContext?: TC;
/**
* @internal
*/
protected _isOptional: boolean;
/**
* @internal
*/
protected _brand?: string;
private readonly _converter;
/**
* Constructs a new {@link Converter} which uses the supplied function to perform the conversion.
* @param converter - The conversion function to be applied.
* @param defaultContext - Optional conversion context to be used by default.
* @param traits - Optional {@link ConverterTraits | traits} to be assigned to the resulting
* converter.
*/
constructor(converter: (from: unknown, self: Converter<T, TC>, context?: TC) => Result<T>, defaultContext?: TC, traits?: ConverterTraits);
/**
* Converts from unknown to <T>
* @param from The unknown to be converted
* @returns An @see Result with a value or an error message
* {@inheritdoc Converter.isOptional}
*/
convert(from: unknown, context?: TC): Result<T>;
get isOptional(): boolean;
/**
* Converts from unknown to <T> or undefined, as appropriate.
* If 'onError' is 'failOnError', the converter succeeds for
* 'undefined' or any convertible value, but reports an error
* if it encounters a value that cannot be converted. If 'onError'
* is 'ignoreErrors' (default) then values that cannot be converted
* result in a successful return of 'undefined'.
* @param from The unknown to be converted
* @param onError Specifies handling of values that cannot be converted, default 'ignoreErrors'
* {@inheritdoc Converter.brand}
*/
convertOptional(from: unknown, context?: TC, onError?: OnError): Result<T | undefined>;
get brand(): string | undefined;
/**
* Creates a converter for an optional value. If 'onError'
* is 'failOnError', the converter accepts 'undefined' or a
* convertible value, but reports an error if it encounters
* a value that cannot be converted. If 'onError' is 'ignoreErrors'
* then values that cannot be converted result in a
* successful return of 'undefined'.
*
* @param onError Specifies handling of values that cannot be converted, default 'ignoreErrors'
* */
optional(onError?: OnError): Converter<T | undefined, TC>;
* {@inheritdoc Converter.convert}
*/
convert(from: unknown, context?: TC): Result<T>;
/**
* Reports whether this value is explicitly optional
* {@inheritdoc Converter.convertOptional}
*/
get isOptional(): boolean;
convertOptional(from: unknown, context?: TC, onError?: OnError): Result<T | undefined>;
/**
* Reports the brand of a branded type.
* {@inheritdoc Converter.optional}
*/
get brand(): string | undefined;
optional(onError?: OnError): Converter<T | undefined, TC>;
/**
* Applies a (possibly) mapping conversion to the converted value.
* @param mapper A function which maps from the converted type to some other type.
* {@inheritdoc Converter.map}
*/
map<T2>(mapper: (from: T) => Result<T2>): Converter<T2, TC>;
/**
* Applies an additional converter to the converted value.
* @param mapConverter The converter to be applied to the converted value
* {@inheritdoc Converter.mapConvert}
*/
mapConvert<T2>(mapConverter: Converter<T2>): Converter<T2, TC>;
/**
* Maps the individual items of the resulting value with the supplied
* map function. Fails if 'from' is not an array.
* @param mapper The map function
* {@inheritdoc Converter.mapItems}
*/
mapItems<TI>(mapper: (from: unknown) => Result<TI>): Converter<TI[], TC>;
/**
* Maps the individual items of the resulting value with the supplied
* converter function. Fails if 'from' is not an array.
* @param mapConverter The map
* {@inheritdoc Converter.mapConvertItems}
*/
mapConvertItems<TI>(mapConverter: Converter<TI, unknown>): Converter<TI[], TC>;
/**
* Applies a type guard to the conversion result.
* @param guard The type guard function to apply
* @param message Optional message to be reported on failure
* {@inheritdoc Converter.withTypeGuard}
*/
withTypeGuard<TI>(guard: (from: unknown) => from is TI, message?: string): Converter<TI, TC>;
/**
* Applies a type guard to each member of the conversion result. Fails
* if the conversion result is not an array or if any member fails the
* type guard.
* @param guard The type guard function to apply to each element
* @param message Optional message to be reported on failure
* {@inheritdoc Converter.withItemTypeGuard}
*/
withItemTypeGuard<TI>(guard: (from: unknown) => from is TI, message?: string): Converter<TI[], TC>;
/**
* Creates a converter with an optional constraint. If the base converter
* succeeds, calls a supplied constraint evaluation function with the
* value and fails the conversion if the function returns either false
* or Failure<T>.
*
* @param constraint Constraint evaluation function
* {@inheritdoc Converter.withConstraint}
*/
withConstraint(constraint: (val: T) => boolean | Result<T>, options?: ConstraintOptions): Converter<T, TC>;
/**
* Adds a brand to the type to prevent mismatched usage of simple types
* {@inheritdoc Converter.withBrand}
*/
withBrand<B extends string>(brand: B): Converter<Brand<T, B>, TC>;
/**
* @internal
*/
protected _context(supplied?: TC): TC | undefined;
/**
* @internal
*/
protected _traits(traits?: Partial<ConverterTraits>): ConverterTraits;
/**
* @internal
*/
protected _with(traits: Partial<ConverterTraits>): this;
}
export {};
//# sourceMappingURL=converter.d.ts.map

@@ -27,6 +27,17 @@ "use strict";

/**
* Simple templated converter wrapper to simplify typed conversion from unknown.
* Base templated wrapper to simplify creation of new {@link Converter}s.
* @public
*/
class BaseConverter {
/**
* Constructs a new {@link Converter} which uses the supplied function to perform the conversion.
* @param converter - The conversion function to be applied.
* @param defaultContext - Optional conversion context to be used by default.
* @param traits - Optional {@link ConverterTraits | traits} to be assigned to the resulting
* converter.
*/
constructor(converter, defaultContext, traits) {
/**
* @internal
*/
this._isOptional = false;

@@ -39,6 +50,16 @@ this._converter = converter;

/**
* Converts from unknown to <T>
* @param from The unknown to be converted
* @returns An @see Result with a value or an error message
* {@inheritdoc Converter.isOptional}
*/
get isOptional() {
return this._isOptional;
}
/**
* {@inheritdoc Converter.brand}
*/
get brand() {
return this._brand;
}
/**
* {@inheritdoc Converter.convert}
*/
convert(from, context) {

@@ -48,10 +69,3 @@ return this._converter(from, this, context !== null && context !== void 0 ? context : this._defaultContext);

/**
* Converts from unknown to <T> or undefined, as appropriate.
* If 'onError' is 'failOnError', the converter succeeds for
* 'undefined' or any convertible value, but reports an error
* if it encounters a value that cannot be converted. If 'onError'
* is 'ignoreErrors' (default) then values that cannot be converted
* result in a successful return of 'undefined'.
* @param from The unknown to be converted
* @param onError Specifies handling of values that cannot be converted, default 'ignoreErrors'
* {@inheritdoc Converter.convertOptional}
*/

@@ -67,11 +81,4 @@ convertOptional(from, context, onError) {

/**
* Creates a converter for an optional value. If 'onError'
* is 'failOnError', the converter accepts 'undefined' or a
* convertible value, but reports an error if it encounters
* a value that cannot be converted. If 'onError' is 'ignoreErrors'
* then values that cannot be converted result in a
* successful return of 'undefined'.
*
* @param onError Specifies handling of values that cannot be converted, default 'ignoreErrors'
* */
* {@inheritdoc Converter.optional}
*/
optional(onError) {

@@ -84,17 +91,4 @@ return new BaseConverter((from, _self, context) => {

/**
* Reports whether this value is explicitly optional
* {@inheritdoc Converter.map}
*/
get isOptional() {
return this._isOptional;
}
/**
* Reports the brand of a branded type.
*/
get brand() {
return this._brand;
}
/**
* Applies a (possibly) mapping conversion to the converted value.
* @param mapper A function which maps from the converted type to some other type.
*/
map(mapper) {

@@ -110,4 +104,3 @@ return new BaseConverter((from, _self, context) => {

/**
* Applies an additional converter to the converted value.
* @param mapConverter The converter to be applied to the converted value
* {@inheritdoc Converter.mapConvert}
*/

@@ -125,5 +118,3 @@ mapConvert(mapConverter) {

/**
* Maps the individual items of the resulting value with the supplied
* map function. Fails if 'from' is not an array.
* @param mapper The map function
* {@inheritdoc Converter.mapItems}
*/

@@ -141,5 +132,3 @@ mapItems(mapper) {

/**
* Maps the individual items of the resulting value with the supplied
* converter function. Fails if 'from' is not an array.
* @param mapConverter The map
* {@inheritdoc Converter.mapConvertItems}
*/

@@ -157,5 +146,3 @@ mapConvertItems(mapConverter) {

/**
* Applies a type guard to the conversion result.
* @param guard The type guard function to apply
* @param message Optional message to be reported on failure
* {@inheritdoc Converter.withTypeGuard}
*/

@@ -171,7 +158,3 @@ withTypeGuard(guard, message) {

/**
* Applies a type guard to each member of the conversion result. Fails
* if the conversion result is not an array or if any member fails the
* type guard.
* @param guard The type guard function to apply to each element
* @param message Optional message to be reported on failure
* {@inheritdoc Converter.withItemTypeGuard}
*/

@@ -192,8 +175,3 @@ withItemTypeGuard(guard, message) {

/**
* Creates a converter with an optional constraint. If the base converter
* succeeds, calls a supplied constraint evaluation function with the
* value and fails the conversion if the function returns either false
* or Failure<T>.
*
* @param constraint Constraint evaluation function
* {@inheritdoc Converter.withConstraint}
*/

@@ -217,3 +195,3 @@ withConstraint(constraint, options) {

/**
* Adds a brand to the type to prevent mismatched usage of simple types
* {@inheritdoc Converter.withBrand}
*/

@@ -230,5 +208,11 @@ withBrand(brand) {

}
/**
* @internal
*/
_context(supplied) {
return supplied !== null && supplied !== void 0 ? supplied : this._defaultContext;
}
/**
* @internal
*/
_traits(traits) {

@@ -241,2 +225,5 @@ return {

}
/**
* @internal
*/
_with(traits) {

@@ -249,2 +236,2 @@ this._isOptional = (traits.isOptional === true);

exports.BaseConverter = BaseConverter;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxxQ0FBNkQ7QUF5SjdEOztHQUVHO0FBQ0gsTUFBYSxhQUFhO0lBT3RCLFlBQ0ksU0FBNkUsRUFDN0UsY0FBbUIsRUFDbkIsTUFBd0I7UUFSbEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFVMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFVBQVUsTUFBSyxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksT0FBTyxDQUFDLElBQWEsRUFBRSxPQUFZO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksZUFBZSxDQUFDLElBQWEsRUFBRSxPQUFZLEVBQUUsT0FBaUI7UUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNwQixPQUFPLEdBQUcsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdB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O1FBRUQsT0FBTyxJQUFJLGFBQWEsQ0FBa0IsQ0FBQyxJQUFhLEVBQUUsS0FBdUIsRUFBRSxPQUFZLEVBQUUsRUFBRTtZQUMvRixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZFLE9BQU8sSUFBQSxnQkFBTyxFQUFDLENBQWdCLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFUyxRQUFRLENBQUMsUUFBYTtRQUM1QixPQUFPLFFBQVEsYUFBUixRQUFRLGNBQVIsUUFBUSxHQUFJLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDNUMsQ0FBQztJQUVTLE9BQU8sQ0FBQyxNQUFpQztRQUMvQyxPQUFPO1lBQ0gsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixHQUFHLENBQUMsTUFBTSxhQUFOLE1BQU0sY0FBTixNQUFNLEdBQUksRUFBRSxDQUFDO1NBQ3BCLENBQUM7SUFDTixDQUFDO0lBRVMsS0FBSyxDQUFDLE1BQWdDO1FBQzVDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKO0FBMU9ELHNDQTBPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuaW1wb3J0IHsgUmVzdWx0LCBmYWlsLCBtYXBSZXN1bHRzLCBzdWNjZWVkIH0gZnJvbSAnLi9yZXN1bHQnO1xuXG50eXBlIE9uRXJyb3IgPSAnZmFpbE9uRXJyb3InIHwgJ2lnbm9yZUVycm9ycyc7XG5cbi8qKlxuICogQ29udmVydGVyIHRyYWl0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb252ZXJ0ZXJUcmFpdHMge1xuICAgIHJlYWRvbmx5IGlzT3B0aW9uYWw6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgYnJhbmQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgQHNlZSBDb252ZXJ0ZXIgQHNlZSB3aXRoQ29uc3RyYWludFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnN0cmFpbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgZXJyb3IgbWVzc2FnZXMgd2hlbiBjb25zdHJhaW50XG4gICAgICogZnVuY3Rpb24gcmV0dXJucyBmYWxzZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhlbHBlciB0eXBlIHRvIGJyYW5kIGEgc2ltcGxlIHR5cGUgdG8gcHJldmVudCBpbmFwcHJvcHJpYXRlIHVzZVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgdHlwZSBCcmFuZDxULCBCPiA9IFQgJiB7IF9fYnJhbmQ6IEIgfTtcblxuZXhwb3J0IGludGVyZmFjZSBDb252ZXJ0ZXI8VCwgVEM9dW5kZWZpbmVkPiBleHRlbmRzIENvbnZlcnRlclRyYWl0cyB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBlbGVtZW50IGlzIGV4cGxpY2l0bHkgb3B0aW9uYWxcbiAgICAgKi9cbiAgICAgcmVhZG9ubHkgaXNPcHRpb25hbDogYm9vbGVhbjtcblxuICAgICAvKipcbiAgICAgICogUmV0dXJucyB0aGUgYnJhbmQgZm9yIGEgYnJhbmRlZCB0eXBlXG4gICAgICAqL1xuICAgICByZWFkb25seSBicmFuZD86IHN0cmluZztcblxuICAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBmcm9tIHVua25vd24gdG8gPFQ+XG4gICAgICogQHBhcmFtIGZyb20gVGhlIHVua25vd24gdG8gYmUgY29udmVydGVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgQW4gb3B0aW9uYWwgY29udGV4dCBhcHBsaWVkIHRvIHRoZSBjb252ZXJzaW9uXG4gICAgICogQHJldHVybnMgQW4gQHNlZSBSZXN1bHQgd2l0aCBhIHZhbHVlIG9yIGFuIGVycm9yIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBjb252ZXJ0KGZyb206IHVua25vd24sIGNvbnRleHQ/OiBUQyk6IFJlc3VsdDxUPjtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGZyb20gdW5rbm93biB0byA8VD4gb3IgdW5kZWZpbmVkLCBhcyBhcHByb3ByaWF0ZS5cbiAgICAgKiBJZiAnb25FcnJvcicgaXMgJ2ZhaWxPbkVycm9yJywgdGhlIGNvbnZlcnRlciBzdWNjZWVkcyBmb3JcbiAgICAgKiAndW5kZWZpbmVkJyBvciBhbnkgY29udmVydGlibGUgdmFsdWUsIGJ1dCByZXBvcnRzIGFuIGVycm9yXG4gICAgICogaWYgaXQgZW5jb3VudGVycyBhIHZhbHVlIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZC4gIElmICdvbkVycm9yJ1xuICAgICAqIGlzICdpZ25vcmVFcnJvcnMnIChkZWZhdWx0KSB0aGVuIHZhbHVlcyB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWRcbiAgICAgKiByZXN1bHQgaW4gYSBzdWNjZXNzZnVsIHJldHVybiBvZiAndW5kZWZpbmVkJy5cbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdW5rbm93biB0byBiZSBjb252ZXJ0ZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBPcHRpb25hbCBjb250ZXh0IGZvciB1c2UgYnkgdGhlIGNvbnZlcnRlclxuICAgICAqIEBwYXJhbSBvbkVycm9yIFNwZWNpZmllcyBoYW5kbGluZyBvZiB2YWx1ZXMgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkLCBkZWZhdWx0ICdpZ25vcmVFcnJvcnMnXG4gICAgICovXG4gICAgY29udmVydE9wdGlvbmFsKGZyb206IHVua25vd24sIGNvbnRleHQ/OiBUQywgb25FcnJvcj86IE9uRXJyb3IpOiBSZXN1bHQ8VHx1bmRlZmluZWQ+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbnZlcnRlciBmb3IgYW4gb3B0aW9uYWwgdmFsdWUuIElmICdvbkVycm9yJ1xuICAgICAqIGlzICdmYWlsT25FcnJvcicsIHRoZSBjb252ZXJ0ZXIgYWNjZXB0cyAndW5kZWZpbmVkJyBvciBhXG4gICAgICogY29udmVydGlibGUgdmFsdWUsIGJ1dCByZXBvcnRzIGFuIGVycm9yIGlmIGl0IGVuY291bnRlcnNcbiAgICAgKiBhIHZhbHVlIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZC4gIElmICdvbkVycm9yJyBpcyAnaWdub3JlRXJyb3JzJ1xuICAgICAqIChkZWZhdWx0KSB0aGVuIHZhbHVlcyB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQgcmVzdWx0IGluIGFcbiAgICAgKiBzdWNjZXNzZnVsIHJldHVybiBvZiAndW5kZWZpbmVkJy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvbkVycm9yIFNwZWNpZmllcyBoYW5kbGluZyBvZiB2YWx1ZXMgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkLCBkZWZhdWx0ICdpZ25vcmVFcnJvcnMnXG4gICAgICogKi9cbiAgICBvcHRpb25hbChvbkVycm9yPzogT25FcnJvcik6IENvbnZlcnRlcjxUfHVuZGVmaW5lZCwgVEM+O1xuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhIChwb3NzaWJseSkgbWFwcGluZyBjb252ZXJzaW9uIHRvIHRoZSBjb252ZXJ0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIG1hcHBlciBBIGZ1bmN0aW9uIHdoaWNoIG1hcHMgZnJvbSB0aGUgY29udmVydGVkIHR5cGUgdG8gc29tZSBvdGhlciB0eXBlLlxuICAgICAqL1xuICAgIG1hcDxUMj4obWFwcGVyOiAoZnJvbTogVCkgPT4gUmVzdWx0PFQyPik6IENvbnZlcnRlcjxUMiwgVEM+O1xuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhbiBhZGRpdGlvbmFsIGNvbnZlcnRlciB0byB0aGUgY29udmVydGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSBtYXBDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciB0byBiZSBhcHBsaWVkIHRvIHRoZSBjb252ZXJ0ZWQgdmFsdWVcbiAgICAgKi9cbiAgICBtYXBDb252ZXJ0PFQyPihtYXBDb252ZXJ0ZXI6IENvbnZlcnRlcjxUMj4pOiBDb252ZXJ0ZXI8VDIsIFRDPjtcblxuICAgIC8qKlxuICAgICAqIE1hcHMgdGhlIGluZGl2aWR1YWwgaXRlbXMgb2YgdGhlIHJlc3VsdGluZyB2YWx1ZSB3aXRoIHRoZSBzdXBwbGllZFxuICAgICAqIG1hcCBmdW5jdGlvbi4gIEZhaWxzIGlmICdmcm9tJyBpcyBub3QgYW4gYXJyYXkuXG4gICAgICogQHBhcmFtIG1hcHBlciBUaGUgbWFwIGZ1bmN0aW9uXG4gICAgICovXG4gICAgbWFwSXRlbXM8VEk+KG1hcHBlcjogKGZyb206IHVua25vd24pID0+IFJlc3VsdDxUST4pOiBDb252ZXJ0ZXI8VElbXSwgVEM+O1xuXG4gICAgLyoqXG4gICAgICogTWFwcyB0aGUgaW5kaXZpZHVhbCBpdGVtcyBvZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdpdGggdGhlIHN1cHBsaWVkXG4gICAgICogY29udmVydGVyIGZ1bmN0aW9uLiAgRmFpbHMgaWYgJ2Zyb20nIGlzIG5vdCBhbiBhcnJheS5cbiAgICAgKiBAcGFyYW0gbWFwQ29udmVydGVyIFRoZSBtYXBcbiAgICAgKi9cbiAgICAgbWFwQ29udmVydEl0ZW1zPFRJPihtYXBDb252ZXJ0ZXI6IENvbnZlcnRlcjxUSSwgdW5rbm93bj4pOiBDb252ZXJ0ZXI8VElbXSwgVEM+O1xuXG4gICAgIC8qKlxuICAgICAgKiBBcHBsaWVzIGEgdHlwZSBndWFyZCB0byB0aGUgY29udmVyc2lvbiByZXN1bHQuXG4gICAgICAqIEBwYXJhbSBndWFyZCBUaGUgdHlwZSBndWFyZCBmdW5jdGlvbiB0byBhcHBseVxuICAgICAgKiBAcGFyYW0gbWVzc2FnZSBPcHRpb25hbCBtZXNzYWdlIHRvIGJlIHJlcG9ydGVkIG9uIGZhaWx1cmVcbiAgICAgICovXG4gICAgd2l0aFR5cGVHdWFyZDxUST4oZ3VhcmQ6IChmcm9tOiB1bmtub3duKSA9PiBmcm9tIGlzIFRJLCBtZXNzYWdlPzogc3RyaW5nKTogQ29udmVydGVyPFRJLCBUQz47XG5cbiAgICAgLyoqXG4gICAgICAqIEFwcGxpZXMgYSB0eXBlIGd1YXJkIHRvIGVhY2ggbWVtYmVyIG9mIHRoZSBjb252ZXJzaW9uIHJlc3VsdC4gRmFpbHNcbiAgICAgICogaWYgdGhlIGNvbnZlcnNpb24gcmVzdWx0IGlzIG5vdCBhbiBhcnJheSBvciBpZiBhbnkgbWVtYmVyIGZhaWxzIHRoZVxuICAgICAgKiB0eXBlIGd1YXJkLlxuICAgICAgKiBAcGFyYW0gZ3VhcmQgVGhlIHR5cGUgZ3VhcmQgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBlbGVtZW50XG4gICAgICAqIEBwYXJhbSBtZXNzYWdlIE9wdGlvbmFsIG1lc3NhZ2UgdG8gYmUgcmVwb3J0ZWQgb24gZmFpbHVyZVxuICAgICAgKi9cbiAgICAgIHdpdGhJdGVtVHlwZUd1YXJkPFRJPihndWFyZDogKGZyb206IHVua25vd24pID0+IGZyb20gaXMgVEksIG1lc3NhZ2U/OiBzdHJpbmcpOiBDb252ZXJ0ZXI8VElbXSwgVEM+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbnZlcnRlciB3aXRoIGFuIG9wdGlvbmFsIGNvbnN0cmFpbnQuICBJZiB0aGUgYmFzZSBjb252ZXJ0ZXJcbiAgICAgKiBzdWNjZWVkcywgY2FsbHMgYSBzdXBwbGllZCBjb25zdHJhaW50IGV2YWx1YXRpb24gZnVuY3Rpb24gd2l0aCB0aGVcbiAgICAgKiB2YWx1ZSBhbmQgZmFpbHMgdGhlIGNvbnZlcnNpb24gaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZWl0aGVyIGZhbHNlXG4gICAgICogb3IgRmFpbHVyZTxUPi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb25zdHJhaW50IENvbnN0cmFpbnQgZXZhbHVhdGlvbiBmdW5jdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGNvbnN0cmFpbnQgZXZhbHVhdGlvblxuICAgICAqL1xuICAgIHdpdGhDb25zdHJhaW50KFxuICAgICAgICBjb25zdHJhaW50OiAodmFsOiBUKSA9PiBib29sZWFufFJlc3VsdDxUPixcbiAgICAgICAgb3B0aW9ucz86IENvbnN0cmFpbnRPcHRpb25zLFxuICAgICk6IENvbnZlcnRlcjxULCBUQz47XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgYnJhbmQgdG8gdGhlIHR5cGUgdG8gcHJldmVudCBtaXNtYXRjaGVkIHVzYWdlIG9mIHNpbXBsZSB0eXBlc1xuICAgICAqL1xuICAgIHdpdGhCcmFuZDxCIGV4dGVuZHMgc3RyaW5nPihicmFuZDogQik6IENvbnZlcnRlcjxCcmFuZDxULCBCPiwgVEM+O1xufVxuXG50eXBlIElubmVySW5mZXJyZWRUeXBlPFRDT05WPiA9XG4gICAgVENPTlYgZXh0ZW5kcyBDb252ZXJ0ZXI8aW5mZXIgVFRPPlxuICAgICAgICA/IChUVE8gZXh0ZW5kcyBBcnJheTxpbmZlciBUVE9FTEVNPiA/IElubmVySW5mZXJyZWRUeXBlPFRUT0VMRU0+W10gOiBUVE8pXG4gICAgICAgIDogKFRDT05WIGV4dGVuZHMgQXJyYXk8aW5mZXIgVEVMRU0+ID8gSW5uZXJJbmZlcnJlZFR5cGU8VEVMRU0+W10gOiBUQ09OVik7XG5cbi8qKlxuICogSW5mZXJzIHRoZSB0eXBlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSBhbiBpbnRzdGFudGlhdGVkIGNvbnZlcnRlci4gIFdvcmtzXG4gKiBmb3IgY29tcGxleCBhcyB3ZWxsIGFzIHNpbXBsZSB0eXBlcy5cbiAqIEBleGFtcGxlIEluZmVyPHR5cGVvZiBDb252ZXJ0ZXJzLm1hcE9mKENvbnZlcnRlcnMuc3RyaW5nQXJyYXkpPiBpcyBNYXA8c3RyaW5nLCBzdHJpbmdbXT5cbiAqL1xuZXhwb3J0IHR5cGUgSW5mZXI8VENPTlY+ID0gVENPTlYgZXh0ZW5kcyBDb252ZXJ0ZXI8aW5mZXIgVFRPPiA/IElubmVySW5mZXJyZWRUeXBlPFRUTz4gOiBuZXZlcjtcblxuLyoqXG4gKiBEZXByZWNhdGVkIG5hbWUgZm9yIEluZmVyPFQ+IHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5XG4gKiBAZGVwcmVjYXRlZCB1c2UgQHNlZSBJbmZlciBpbnN0ZWFkXG4gKi9cbmV4cG9ydCB0eXBlIENvbnZlcnRlZFRvVHlwZTxUQ09OVj4gPSBJbmZlcjxUQ09OVj47XG5cbi8qKlxuICogU2ltcGxlIHRlbXBsYXRlZCBjb252ZXJ0ZXIgd3JhcHBlciB0byBzaW1wbGlmeSB0eXBlZCBjb252ZXJzaW9uIGZyb20gdW5rbm93bi5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VDb252ZXJ0ZXI8VCwgVEM9dW5kZWZpbmVkPiBpbXBsZW1lbnRzIENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZGVmYXVsdENvbnRleHQ/OiBUQztcbiAgICBwcm90ZWN0ZWQgX2lzT3B0aW9uYWwgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2JyYW5kPzogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udmVydGVyOiAoZnJvbTogdW5rbm93biwgc2VsZjogQ29udmVydGVyPFQsIFRDPiwgY29udGV4dD86IFRDKSA9PiBSZXN1bHQ8VD47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIGNvbnZlcnRlcjogKGZyb206IHVua25vd24sIHNlbGY6IENvbnZlcnRlcjxULCBUQz4sIGNvbnRleHQ/OiBUQykgPT4gUmVzdWx0PFQ+LFxuICAgICAgICBkZWZhdWx0Q29udGV4dD86IFRDLFxuICAgICAgICB0cmFpdHM/OiBDb252ZXJ0ZXJUcmFpdHMsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX2NvbnZlcnRlciA9IGNvbnZlcnRlcjtcbiAgICAgICAgdGhpcy5fZGVmYXVsdENvbnRleHQgPSBkZWZhdWx0Q29udGV4dDtcbiAgICAgICAgdGhpcy5faXNPcHRpb25hbCA9ICh0cmFpdHM/LmlzT3B0aW9uYWwgPT09IHRydWUpO1xuICAgICAgICB0aGlzLl9icmFuZCA9ICh0cmFpdHM/LmJyYW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBmcm9tIHVua25vd24gdG8gPFQ+XG4gICAgICogQHBhcmFtIGZyb20gVGhlIHVua25vd24gdG8gYmUgY29udmVydGVkXG4gICAgICogQHJldHVybnMgQW4gQHNlZSBSZXN1bHQgd2l0aCBhIHZhbHVlIG9yIGFuIGVycm9yIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udmVydChmcm9tOiB1bmtub3duLCBjb250ZXh0PzogVEMpOiBSZXN1bHQ8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydGVyKGZyb20sIHRoaXMsIGNvbnRleHQgPz8gdGhpcy5fZGVmYXVsdENvbnRleHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGZyb20gdW5rbm93biB0byA8VD4gb3IgdW5kZWZpbmVkLCBhcyBhcHByb3ByaWF0ZS5cbiAgICAgKiBJZiAnb25FcnJvcicgaXMgJ2ZhaWxPbkVycm9yJywgdGhlIGNvbnZlcnRlciBzdWNjZWVkcyBmb3JcbiAgICAgKiAndW5kZWZpbmVkJyBvciBhbnkgY29udmVydGlibGUgdmFsdWUsIGJ1dCByZXBvcnRzIGFuIGVycm9yXG4gICAgICogaWYgaXQgZW5jb3VudGVycyBhIHZhbHVlIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZC4gIElmICdvbkVycm9yJ1xuICAgICAqIGlzICdpZ25vcmVFcnJvcnMnIChkZWZhdWx0KSB0aGVuIHZhbHVlcyB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWRcbiAgICAgKiByZXN1bHQgaW4gYSBzdWNjZXNzZnVsIHJldHVybiBvZiAndW5kZWZpbmVkJy5cbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdW5rbm93biB0byBiZSBjb252ZXJ0ZWRcbiAgICAgKiBAcGFyYW0gb25FcnJvciBTcGVjaWZpZXMgaGFuZGxpbmcgb2YgdmFsdWVzIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZCwgZGVmYXVsdCAnaWdub3JlRXJyb3JzJ1xuICAgICAqL1xuICAgIHB1YmxpYyBjb252ZXJ0T3B0aW9uYWwoZnJvbTogdW5rbm93biwgY29udGV4dD86IFRDLCBvbkVycm9yPzogT25FcnJvcik6IFJlc3VsdDxUfHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9jb252ZXJ0ZXIoZnJvbSwgdGhpcywgdGhpcy5fY29udGV4dChjb250ZXh0KSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgIG9uRXJyb3IgPSBvbkVycm9yID8/ICdpZ25vcmVFcnJvcnMnO1xuICAgICAgICAgICAgcmV0dXJuICgoZnJvbSA9PT0gdW5kZWZpbmVkKSB8fCBvbkVycm9yID09PSAnaWdub3JlRXJyb3JzJykgPyBzdWNjZWVkKHVuZGVmaW5lZCkgOiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY29udmVydGVyIGZvciBhbiBvcHRpb25hbCB2YWx1ZS4gSWYgJ29uRXJyb3InXG4gICAgICogaXMgJ2ZhaWxPbkVycm9yJywgdGhlIGNvbnZlcnRlciBhY2NlcHRzICd1bmRlZmluZWQnIG9yIGFcbiAgICAgKiBjb252ZXJ0aWJsZSB2YWx1ZSwgYnV0IHJlcG9ydHMgYW4gZXJyb3IgaWYgaXQgZW5jb3VudGVyc1xuICAgICAqIGEgdmFsdWUgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgJ29uRXJyb3InIGlzICdpZ25vcmVFcnJvcnMnXG4gICAgICogdGhlbiB2YWx1ZXMgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkIHJlc3VsdCBpbiBhXG4gICAgICogc3VjY2Vzc2Z1bCByZXR1cm4gb2YgJ3VuZGVmaW5lZCcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25FcnJvciBTcGVjaWZpZXMgaGFuZGxpbmcgb2YgdmFsdWVzIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZCwgZGVmYXVsdCAnaWdub3JlRXJyb3JzJ1xuICAgICAqICovXG4gICAgcHVibGljIG9wdGlvbmFsKG9uRXJyb3I/OiBPbkVycm9yKTogQ29udmVydGVyPFR8dW5kZWZpbmVkLCBUQz4ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VHx1bmRlZmluZWQsIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgICAgICBvbkVycm9yID0gb25FcnJvciA/PyAnZmFpbE9uRXJyb3InO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydE9wdGlvbmFsKGZyb20sIHRoaXMuX2NvbnRleHQoY29udGV4dCksIG9uRXJyb3IpO1xuICAgICAgICB9KS5fd2l0aCh0aGlzLl90cmFpdHMoeyBpc09wdGlvbmFsOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhpcyB2YWx1ZSBpcyBleHBsaWNpdGx5IG9wdGlvbmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc09wdGlvbmFsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNPcHRpb25hbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIHRoZSBicmFuZCBvZiBhIGJyYW5kZWQgdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGJyYW5kKCk6IHN0cmluZ3x1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnJhbmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhIChwb3NzaWJseSkgbWFwcGluZyBjb252ZXJzaW9uIHRvIHRoZSBjb252ZXJ0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIG1hcHBlciBBIGZ1bmN0aW9uIHdoaWNoIG1hcHMgZnJvbSB0aGUgY29udmVydGVkIHR5cGUgdG8gc29tZSBvdGhlciB0eXBlLlxuICAgICAqL1xuICAgIHB1YmxpYyBtYXA8VDI+KG1hcHBlcjogKGZyb206IFQpID0+IFJlc3VsdDxUMj4pOiBDb252ZXJ0ZXI8VDIsIFRDPiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcjxUMiwgVEM+KChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFQyLCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5uZXJSZXN1bHQgPSB0aGlzLl9jb252ZXJ0ZXIoZnJvbSwgdGhpcywgdGhpcy5fY29udGV4dChjb250ZXh0KSk7XG4gICAgICAgICAgICBpZiAoaW5uZXJSZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGVyKGlubmVyUmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWlsKGlubmVyUmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB9KS5fd2l0aCh0aGlzLl90cmFpdHMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyBhbiBhZGRpdGlvbmFsIGNvbnZlcnRlciB0byB0aGUgY29udmVydGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSBtYXBDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciB0byBiZSBhcHBsaWVkIHRvIHRoZSBjb252ZXJ0ZWQgdmFsdWVcbiAgICAgKi9cbiAgICBwdWJsaWMgbWFwQ29udmVydDxUMj4obWFwQ29udmVydGVyOiBDb252ZXJ0ZXI8VDI+KTogQ29udmVydGVyPFQyLCBUQz4ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXI8VDIsIFRDPigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUMiwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyUmVzdWx0ID0gdGhpcy5fY29udmVydGVyKGZyb20sIHRoaXMsIHRoaXMuX2NvbnRleHQoY29udGV4dCkpO1xuICAgICAgICAgICAgaWYgKGlubmVyUmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcENvbnZlcnRlci5jb252ZXJ0KGlubmVyUmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWlsKGlubmVyUmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmV0dXJuLWFzc2lnblxuICAgICAgICB9KS5fd2l0aCh0aGlzLl90cmFpdHMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyB0aGUgaW5kaXZpZHVhbCBpdGVtcyBvZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdpdGggdGhlIHN1cHBsaWVkXG4gICAgICogbWFwIGZ1bmN0aW9uLiAgRmFpbHMgaWYgJ2Zyb20nIGlzIG5vdCBhbiBhcnJheS5cbiAgICAgKiBAcGFyYW0gbWFwcGVyIFRoZSBtYXAgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgbWFwSXRlbXM8VEk+KG1hcHBlcjogKGZyb206IHVua25vd24pID0+IFJlc3VsdDxUST4pOiBDb252ZXJ0ZXI8VElbXSwgVEM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPFRJW10sIFRDPigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUSVtdLCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRlcihmcm9tLCB0aGlzLCB0aGlzLl9jb250ZXh0KGNvbnRleHQpKS5vblN1Y2Nlc3MoKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXBSZXN1bHRzKGl0ZW1zLm1hcCgoaSkgPT4gbWFwcGVyKGkpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKCdDYW5ub3QgbWFwIGl0ZW1zIC0gbm90IGFuIGFycmF5Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyB0aGUgaW5kaXZpZHVhbCBpdGVtcyBvZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHdpdGggdGhlIHN1cHBsaWVkXG4gICAgICogY29udmVydGVyIGZ1bmN0aW9uLiAgRmFpbHMgaWYgJ2Zyb20nIGlzIG5vdCBhbiBhcnJheS5cbiAgICAgKiBAcGFyYW0gbWFwQ29udmVydGVyIFRoZSBtYXBcbiAgICAgKi9cbiAgICBwdWJsaWMgbWFwQ29udmVydEl0ZW1zPFRJPihtYXBDb252ZXJ0ZXI6IENvbnZlcnRlcjxUSSwgdW5rbm93bj4pOiBDb252ZXJ0ZXI8VElbXSwgVEM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPFRJW10sIFRDPigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUSVtdLCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRlcihmcm9tLCB0aGlzLCB0aGlzLl9jb250ZXh0KGNvbnRleHQpKS5vblN1Y2Nlc3MoKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXBSZXN1bHRzKGl0ZW1zLm1hcCgoaSkgPT4gbWFwQ29udmVydGVyLmNvbnZlcnQoaSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoJ0Nhbm5vdCBtYXAgaXRlbXMgLSBub3QgYW4gYXJyYXknKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGEgdHlwZSBndWFyZCB0byB0aGUgY29udmVyc2lvbiByZXN1bHQuXG4gICAgICogQHBhcmFtIGd1YXJkIFRoZSB0eXBlIGd1YXJkIGZ1bmN0aW9uIHRvIGFwcGx5XG4gICAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgbWVzc2FnZSB0byBiZSByZXBvcnRlZCBvbiBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIHdpdGhUeXBlR3VhcmQ8VEk+KGd1YXJkOiAoZnJvbTogdW5rbm93bikgPT4gZnJvbSBpcyBUSSwgbWVzc2FnZT86IHN0cmluZyk6IENvbnZlcnRlcjxUSSwgVEM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPFRJLCBUQz4oKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VEksIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydGVyKGZyb20sIHRoaXMsIHRoaXMuX2NvbnRleHQoY29udGV4dCkpLm9uU3VjY2VzcygoaW5uZXIpID0+IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSA/PyAnaW52YWxpZCB0eXBlJztcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3VhcmQoaW5uZXIpID8gc3VjY2VlZChpbm5lcikgOiBmYWlsKGAke21lc3NhZ2V9OiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgYSB0eXBlIGd1YXJkIHRvIGVhY2ggbWVtYmVyIG9mIHRoZSBjb252ZXJzaW9uIHJlc3VsdC4gRmFpbHNcbiAgICAgKiBpZiB0aGUgY29udmVyc2lvbiByZXN1bHQgaXMgbm90IGFuIGFycmF5IG9yIGlmIGFueSBtZW1iZXIgZmFpbHMgdGhlXG4gICAgICogdHlwZSBndWFyZC5cbiAgICAgKiBAcGFyYW0gZ3VhcmQgVGhlIHR5cGUgZ3VhcmQgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBlbGVtZW50XG4gICAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgbWVzc2FnZSB0byBiZSByZXBvcnRlZCBvbiBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIHdpdGhJdGVtVHlwZUd1YXJkPFRJPihndWFyZDogKGZyb206IHVua25vd24pID0+IGZyb20gaXMgVEksIG1lc3NhZ2U/OiBzdHJpbmcpOiBDb252ZXJ0ZXI8VElbXSwgVEM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPFRJW10sIFRDPigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUSVtdLCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRlcihmcm9tLCB0aGlzLCB0aGlzLl9jb250ZXh0KGNvbnRleHQpKS5vblN1Y2Nlc3MoKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXBSZXN1bHRzKGl0ZW1zLm1hcCgoaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UgPz8gJ2ludmFsaWQgdHlwZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3VhcmQoaSkgPyBzdWNjZWVkKGkpIDogZmFpbChgJHttZXNzYWdlfTogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbCgnQ2Fubm90IGd1YXJkIGl0ZW0gdHlwZSAtIG5vdCBhbiBhcnJheScpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb252ZXJ0ZXIgd2l0aCBhbiBvcHRpb25hbCBjb25zdHJhaW50LiAgSWYgdGhlIGJhc2UgY29udmVydGVyXG4gICAgICogc3VjY2VlZHMsIGNhbGxzIGEgc3VwcGxpZWQgY29uc3RyYWludCBldmFsdWF0aW9uIGZ1bmN0aW9uIHdpdGggdGhlXG4gICAgICogdmFsdWUgYW5kIGZhaWxzIHRoZSBjb252ZXJzaW9uIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGVpdGhlciBmYWxzZVxuICAgICAqIG9yIEZhaWx1cmU8VD4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uc3RyYWludCBDb25zdHJhaW50IGV2YWx1YXRpb24gZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aENvbnN0cmFpbnQoXG4gICAgICAgIGNvbnN0cmFpbnQ6ICh2YWw6IFQpID0+IGJvb2xlYW58UmVzdWx0PFQ+LFxuICAgICAgICBvcHRpb25zPzogQ29uc3RyYWludE9wdGlvbnMsXG4gICAgKTogQ29udmVydGVyPFQsIFRDPiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcjxULCBUQz4oKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VCwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2NvbnZlcnRlcihmcm9tLCB0aGlzLCB0aGlzLl9jb250ZXh0KGNvbnRleHQpKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJhaW50UmVzdWx0ID0gY29uc3RyYWludChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RyYWludFJlc3VsdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJhaW50UmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWlsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIiR7SlNPTi5zdHJpbmdpZnkocmVzdWx0LnZhbHVlKX1cIjogJHtvcHRpb25zPy5kZXNjcmlwdGlvbiA/PyAnZG9lcyBub3QgbWVldCBjb25zdHJhaW50J31gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RyYWludFJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pLl93aXRoKHRoaXMuX3RyYWl0cygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgYnJhbmQgdG8gdGhlIHR5cGUgdG8gcHJldmVudCBtaXNtYXRjaGVkIHVzYWdlIG9mIHNpbXBsZSB0eXBlc1xuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQnJhbmQ8QiBleHRlbmRzIHN0cmluZz4oYnJhbmQ6IEIpOiBDb252ZXJ0ZXI8QnJhbmQ8VCwgQj4sIFRDPiB7XG4gICAgICAgIGlmICh0aGlzLl9icmFuZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVwbGFjZSBleGlzdGluZyBicmFuZCBcIiR7dGhpcy5fYnJhbmR9XCIgd2l0aCBcIiR7YnJhbmR9XCIuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXI8QnJhbmQ8VCwgQj4sIFRDPigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxULCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRlcihmcm9tLCB0aGlzLCB0aGlzLl9jb250ZXh0KGNvbnRleHQpKS5vblN1Y2Nlc3MoKHYpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh2IGFzIEJyYW5kPFQsIEI+KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KS5fd2l0aCh0aGlzLl90cmFpdHMoeyBicmFuZCB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jb250ZXh0KHN1cHBsaWVkPzogVEMpOiBUQ3x1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gc3VwcGxpZWQgPz8gdGhpcy5fZGVmYXVsdENvbnRleHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF90cmFpdHModHJhaXRzPzogUGFydGlhbDxDb252ZXJ0ZXJUcmFpdHM+KTogQ29udmVydGVyVHJhaXRzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMuaXNPcHRpb25hbCxcbiAgICAgICAgICAgIGJyYW5kOiB0aGlzLmJyYW5kLFxuICAgICAgICAgICAgLi4uKHRyYWl0cyA/PyB7fSksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF93aXRoKHRyYWl0czogUGFydGlhbDxDb252ZXJ0ZXJUcmFpdHM+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lzT3B0aW9uYWwgPSAodHJhaXRzLmlzT3B0aW9uYWwgPT09IHRydWUpO1xuICAgICAgICB0aGlzLl9icmFuZCA9ICh0cmFpdHMuYnJhbmQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxxQ0FBNkQ7QUEyTTdEOzs7R0FHRztBQUNILE1BQWEsYUFBYTtJQWdCdEI7Ozs7OztPQU1HO0lBQ0gsWUFDSSxTQUE2RSxFQUM3RSxjQUFtQixFQUNuQixNQUF3QjtRQXJCNUI7O1dBRUc7UUFDTyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQW9CMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFVBQVUsTUFBSyxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsVUFBVTtRQUNqQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxLQUFLO1FBQ1osT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU8sQ0FBQyxJQUFhLEVBQUUsT0FBWTtRQUN0QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZSxDQUFDLElBQWEsRUFBRSxPQUFZLEVBQUUsT0FBaUI7UUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNwQixPQUFPLEdBQUcsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksY0FBYyxDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSSxPQUFPLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0JBQU8sRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQzdGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksUUFBUSxDQUFDLE9BQWlCO1FBQzdCLE9BQU8sSUFBSSxhQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsS0FBaUMsRUFBRSxPQUFZLEVBQUUsRUFBRTtZQUN4RixPQUFPLEdBQUcsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksYUFBYSxDQUFDO1lBQ25DLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksR0FBRyxDQUFLLE1BQStCO1FBQzFDLE9BQU8sSUFBSSxhQUFhLENBQVMsQ0FBQyxJQUFhLEVBQUUsS0FBd0IsRUFBRSxPQUFZLEVBQUUsRUFBRTtZQUN2RixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN6QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDcEM7WUFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVSxDQUFLLFlBQTJCO1FBQzdDLE9BQU8sSUFBSSxhQUFhLENBQVMsQ0FBQyxJQUFhLEVBQUUsS0FBd0IsRUFBRSxPQUFZLEVBQUUsRUFBRTtZQUN2RixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN6QixPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xEO1lBQ0QsT0FBTyxJQUFBLGFBQUksRUFBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsNENBQTRDO1FBQzVDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRLENBQUssTUFBcUM7UUFDckQsT0FBTyxJQUFJLGFBQWEsQ0FBVyxDQUFDLElBQWEsRUFBRSxLQUEwQixFQUFFLE9BQVksRUFBRSxFQUFFO1lBQzNGLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDM0UsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUN0QixPQUFPLElBQUEsbUJBQVUsRUFBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNsRDtnQkFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBSyxZQUFvQztRQUMzRCxPQUFPLElBQUksYUFBYSxDQUFXLENBQUMsSUFBYSxFQUFFLEtBQTBCLEVBQUUsT0FBWSxFQUFFLEVBQUU7WUFDM0YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUMzRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3RCLE9BQU8sSUFBQSxtQkFBVSxFQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoRTtnQkFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWEsQ0FBSyxLQUFvQyxFQUFFLE9BQWdCO1FBQzNFLE9BQU8sSUFBSSxhQUFhLENBQVMsQ0FBQyxJQUFhLEVBQUUsS0FBd0IsRUFBRSxPQUFZLEVBQUUsRUFBRTtZQUN2RixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQzNFLE9BQU8sR0FBRyxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxjQUFjLENBQUM7Z0JBQ3BDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGdCQUFPLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsYUFBSSxFQUFDLEdBQUcsT0FBTyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUIsQ0FBSyxLQUFvQyxFQUFFLE9BQWdCO1FBQy9FLE9BQU8sSUFBSSxhQUFhLENBQVcsQ0FBQyxJQUFhLEVBQUUsS0FBMEIsRUFBRSxPQUFZLEVBQUUsRUFBRTtZQUMzRixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQzNFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDdEIsT0FBTyxJQUFBLG1CQUFVLEVBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUM5QixPQUFPLEdBQUcsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksY0FBYyxDQUFDO3dCQUNwQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnQkFBTyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGFBQUksRUFBQyxHQUFHLE9BQU8sS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDUDtnQkFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDekQsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWMsQ0FDakIsVUFBeUMsRUFDekMsT0FBMkI7UUFFM0IsT0FBTyxJQUFJLGFBQWEsQ0FBUSxDQUFDLElBQWEsRUFBRSxLQUF1QixFQUFFLE9BQVksRUFBRSxFQUFFOztZQUNyRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ25FLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUNwQixNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xELElBQUksT0FBTyxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7b0JBQ3ZDLE9BQU8sZ0JBQWdCO3dCQUNuQixDQUFDLENBQUMsTUFBTTt3QkFDUixDQUFDLENBQUMsSUFBQSxhQUFJLEVBQ0YsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxXQUFXLG1DQUFJLDBCQUEwQixFQUFFLENBQzdGLENBQUM7aUJBQ1Q7Z0JBQ0QsT0FBTyxnQkFBZ0IsQ0FBQzthQUMzQjtZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTLENBQW1CLEtBQVE7UUFDdkMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsSUFBSSxDQUFDLE1BQU0sV0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDO1NBQ3RGO1FBRUQsT0FBTyxJQUFJLGFBQWEsQ0FBa0IsQ0FBQyxJQUFhLEVBQUUsS0FBdUIsRUFBRSxPQUFZLEVBQUUsRUFBRTtZQUMvRixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZFLE9BQU8sSUFBQSxnQkFBTyxFQUFDLENBQWdCLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNPLFFBQVEsQ0FBQyxRQUFhO1FBQzVCLE9BQU8sUUFBUSxhQUFSLFFBQVEsY0FBUixRQUFRLEdBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxPQUFPLENBQUMsTUFBaUM7UUFDL0MsT0FBTztZQUNILFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsR0FBRyxDQUFDLE1BQU0sYUFBTixNQUFNLGNBQU4sTUFBTSxHQUFJLEVBQUUsQ0FBQztTQUNwQixDQUFDO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ08sS0FBSyxDQUFDLE1BQWdDO1FBQzVDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKO0FBbE9ELHNDQWtPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuaW1wb3J0IHsgUmVzdWx0LCBmYWlsLCBtYXBSZXN1bHRzLCBzdWNjZWVkIH0gZnJvbSAnLi9yZXN1bHQnO1xuaW1wb3J0IHsgQnJhbmQgfSBmcm9tICcuL2JyYW5kJztcblxudHlwZSBPbkVycm9yID0gJ2ZhaWxPbkVycm9yJyB8ICdpZ25vcmVFcnJvcnMnO1xuXG4vKipcbiAqIENvbnZlcnRlciB0cmFpdHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVydGVyVHJhaXRzIHtcbiAgICByZWFkb25seSBpc09wdGlvbmFsOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGJyYW5kPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBDb252ZXJ0ZXIud2l0aENvbnN0cmFpbnR9LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnN0cmFpbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgZXJyb3IgbWVzc2FnZXMgd2hlbiBjb25zdHJhaW50XG4gICAgICogZnVuY3Rpb24gcmV0dXJucyBmYWxzZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEdlbmVyaWMgY29udmVydGVyIHRvIGNvbnZlcnQgdW5rbm93biB0byBhIHRlbXBsYXRlZCB0eXBlIGA8VD5gLCB1c2luZ1xuICogaW50cmluc2ljIHJ1bGVzIG9yIGFzIG1vZGlmaWVkIGJ5IGFuIG9wdGlvbmFsIGNvbnZlcnNpb24gY29udGV4dFxuICogb2Ygb3B0aW9uYWwgdGVtcGxhdGVkIHR5cGUgYDxUQz5gIChkZWZhdWx0IGB1bmRlZmluZWRgKS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb252ZXJ0ZXI8VCwgVEM9dW5kZWZpbmVkPiBleHRlbmRzIENvbnZlcnRlclRyYWl0cyB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBlbGVtZW50IGlzIGV4cGxpY2l0bHkgb3B0aW9uYWwuXG4gICAgICovXG4gICAgIHJlYWRvbmx5IGlzT3B0aW9uYWw6IGJvb2xlYW47XG5cbiAgICAgLyoqXG4gICAgICAqIFJldHVybnMgdGhlIGJyYW5kIGZvciBhIGJyYW5kZWQgdHlwZS5cbiAgICAgICovXG4gICAgIHJlYWRvbmx5IGJyYW5kPzogc3RyaW5nO1xuXG4gICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGZyb20gYHVua25vd25gIHRvIGA8VD5gLlxuICAgICAqIEBwYXJhbSBmcm9tIC0gVGhlIGB1bmtub3duYCB0byBiZSBjb252ZXJ0ZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCAtIEFuIG9wdGlvbmFsIGNvbnZlcnNpb24gY29udGV4dCBvZiB0eXBlIGA8VEM+YCB0byBiZSB1c2VkIGluXG4gICAgICogdGhlIGNvbnZlcnNpb24uXG4gICAgICogQHJldHVybnMgQSB7QGxpbmsgUmVzdWx0fSB3aXRoIGEge0BsaW5rIFN1Y2Nlc3N9IGFuZCBhIHZhbHVlIG9uIHN1Y2Nlc3Mgb3IgYW5cbiAgICAgKiB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhIGEgbWVzc2FnZSBvbiBmYWlsdXJlLlxuICAgICAqL1xuICAgIGNvbnZlcnQoZnJvbTogdW5rbm93biwgY29udGV4dD86IFRDKTogUmVzdWx0PFQ+O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZnJvbSBgdW5rbm93bmAgdG8gYDxUPmAgb3IgYHVuZGVmaW5lZGAsIGFzIGFwcHJvcHJpYXRlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBgb25FcnJvcmAgaXMgYGZhaWxPbkVycm9yYCwgdGhlIGNvbnZlcnRlciBzdWNjZWVkcyBmb3JcbiAgICAgKiBgdW5kZWZpbmVkYCBvciBhbnkgY29udmVydGlibGUgdmFsdWUsIGJ1dCByZXBvcnRzIGFuIGVycm9yXG4gICAgICogaWYgaXQgZW5jb3VudGVycyBhIHZhbHVlIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZC5cbiAgICAgKlxuICAgICAqIElmIGBvbkVycm9yYCBpcyBgaWdub3JlRXJyb3JzYCAoZGVmYXVsdCkgdGhlbiB2YWx1ZXMgdGhhdFxuICAgICAqIGNhbm5vdCBiZSBjb252ZXJ0ZWQgcmVzdWx0IGluIGEgc3VjY2Vzc2Z1bCByZXR1cm4gb2YgYHVuZGVmaW5lZGAuXG4gICAgICogQHBhcmFtIGZyb20gLSBUaGUgYHVua25vd25gIHRvIGJlIGNvbnZlcnRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IC0gQW4gb3B0aW9uYWwgY29udmVyc2lvbiBjb250ZXh0IG9mIHR5cGUgYDxUQz5gIHRvIGJlIHVzZWQgaW5cbiAgICAgKiB0aGUgY29udmVyc2lvbi5cbiAgICAgKiBAcGFyYW0gb25FcnJvciAtIFNwZWNpZmllcyBoYW5kbGluZyBvZiB2YWx1ZXMgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkIChkZWZhdWx0IGBpZ25vcmVFcnJvcnNgKS5cbiAgICAgKiBAcmV0dXJucyBBIHtAbGluayBSZXN1bHR9IHdpdGggYSB7QGxpbmsgU3VjY2Vzc30gYW5kIGEgdmFsdWUgb24gc3VjY2VzcyBvciBhblxuICAgICAqIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgYSBtZXNzYWdlIG9uIGZhaWx1cmUuXG4gICAgICovXG4gICAgY29udmVydE9wdGlvbmFsKGZyb206IHVua25vd24sIGNvbnRleHQ/OiBUQywgb25FcnJvcj86IE9uRXJyb3IpOiBSZXN1bHQ8VHx1bmRlZmluZWQ+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBDb252ZXJ0ZXJ9IGZvciBhbiBvcHRpb25hbCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgYG9uRXJyb3JgIGlzIGBmYWlsT25FcnJvcmAsIHRoZSByZXN1bHRpbmcgY29udmVydGVyIHdpbGwgYWNjZXB0IGB1bmRlZmluZWRgXG4gICAgICogb3IgYSBjb252ZXJ0aWJsZSB2YWx1ZSwgYnV0IHJlcG9ydCBhbiBlcnJvciBpZiBpdCBlbmNvdW50ZXJzIGEgdmFsdWUgdGhhdCBjYW5ub3QgYmVcbiAgICAgKiBjb252ZXJ0ZWQuXG4gICAgICpcbiAgICAgKiBJZiBgb25FcnJvcmAgaXMgYGlnbm9yZUVycm9yc2AgKGRlZmF1bHQpIHRoZW4gdmFsdWVzIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZCB3aWxsXG4gICAgICogcmVzdWx0IGluIGEgc3VjY2Vzc2Z1bCByZXR1cm4gb2YgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25FcnJvciAtIFNwZWNpZmllcyBoYW5kbGluZyBvZiB2YWx1ZXMgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkIChkZWZhdWx0IGBpZ25vcmVFcnJvcnNgKS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgQ29udmVydGVyfSByZXR1cm5pbmcgYDxUfHVuZGVmaW5lZD5gLlxuICAgICAqICovXG4gICAgb3B0aW9uYWwob25FcnJvcj86IE9uRXJyb3IpOiBDb252ZXJ0ZXI8VHx1bmRlZmluZWQsIFRDPjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBhcHBsaWVzIGEgKHBvc3NpYmx5KSBtYXBwaW5nIGNvbnZlcnNpb24gdG9cbiAgICAgKiB0aGUgY29udmVydGVkIHZhbHVlIG9mIHRoaXMge0BsaW5rIENvbnZlcnRlcn0uXG4gICAgICogQHBhcmFtIG1hcHBlciAtIEEgZnVuY3Rpb24gd2hpY2ggbWFwcyBmcm9tIHRoZSB0aGUgcmVzdWx0IHR5cGUgYDxUPmAgb2YgdGhpc1xuICAgICAqIGNvbnZlcnRlciB0byBhIG5ldyByZXN1bHQgdHlwZSBgPFQyPmAuXG4gICAgICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJuaW5nIGA8VDI+YC5cbiAgICAgKi9cbiAgICBtYXA8VDI+KG1hcHBlcjogKGZyb206IFQpID0+IFJlc3VsdDxUMj4pOiBDb252ZXJ0ZXI8VDIsIFRDPjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBhcHBsaWVzIGFuIGFkZGl0aW9uYWwgc3VwcGxpZWRcbiAgICAgKiBjb252ZXJ0ZXIgdG8gdGhlIHJlc3VsdCBvZiB0aGlzIGNvbnZlcnRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtYXBDb252ZXJ0ZXIgLSBUaGUge0BsaW5rIENvbnZlcnRlcn0gdG8gYmUgYXBwbGllZCB0byB0aGVcbiAgICAgKiBjb252ZXJ0ZWQgcmVzdWx0IGZyb20gdGhpcyB7QGxpbmsgQ29udmVydGVyfS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgQ29udmVydGVyfSByZXR1cm5pbmcgYDxUMj5gLlxuICAgICAqL1xuICAgIG1hcENvbnZlcnQ8VDI+KG1hcENvbnZlcnRlcjogQ29udmVydGVyPFQyPik6IENvbnZlcnRlcjxUMiwgVEM+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIG1hcHMgdGhlIGluZGl2aWR1YWwgaXRlbXMgb2YgYSBjb2xsZWN0aW9uXG4gICAgICogcmVzdWx0aW5nIGZyb20gdGhpcyB7QGxpbmsgQ29udmVydGVyfSB1c2luZyB0aGUgc3VwcGxpZWQgbWFwIGZ1Y3Rpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEZhaWxzIGlmIGBmcm9tYCBpcyBub3QgYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWFwcGVyIC0gVGhlIG1hcCBmdW5jdGlvbiB0byBiZSBhcHBsaWVkIHRvIGVhY2ggZWxlbWVudCBvZiB0aGVcbiAgICAgKiByZXN1bHQgb2YgdGhpcyB7QGxpbmsgQ29udmVydGVyfS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgQ29udmVydGVyfSByZXR1cm5pbmcgYDxUSVtdPmAuXG4gICAgICovXG4gICAgbWFwSXRlbXM8VEk+KG1hcHBlcjogKGZyb206IHVua25vd24pID0+IFJlc3VsdDxUST4pOiBDb252ZXJ0ZXI8VElbXSwgVEM+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIG1hcHMgdGhlIGluZGl2aWR1YWwgaXRlbXMgb2YgYSBjb2xsZWN0aW9uXG4gICAgICogcmVzdWx0aW5nIGZyb20gdGhpcyB7QGxpbmsgQ29udmVydGVyfSB1c2luZyB0aGUgc3VwcGxpZWQge0BsaW5rIENvbnZlcnRlcn0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEZhaWxzIGlmIGBmcm9tYCBpcyBub3QgYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWFwQ29udmVydGVyIC0gVGhlIHtAbGluayBDb252ZXJ0ZXJ9IHRvIGJlIGFwcGxpZWQgdG8gZWFjaCBlbGVtZW50IG9mIHRoZVxuICAgICAqIHJlc3VsdCBvZiB0aGlzIHtAbGluayBDb252ZXJ0ZXJ9LlxuICAgICAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBDb252ZXJ0ZXJ9IHJldHVybmluZyBgPFRJW10+YC5cbiAgICAgKi9cbiAgICAgbWFwQ29udmVydEl0ZW1zPFRJPihtYXBDb252ZXJ0ZXI6IENvbnZlcnRlcjxUSSwgdW5rbm93bj4pOiBDb252ZXJ0ZXI8VElbXSwgVEM+O1xuXG4gICAgIC8qKlxuICAgICAgKiBDcmVhdGVzIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggYXBwbGllcyBhIHN1cHBsaWVkIHR5cGUgZ3VhcmQgdG8gdGhlIGNvbnZlcnNpb25cbiAgICAgICogcmVzdWx0LlxuICAgICAgKiBAcGFyYW0gZ3VhcmQgLSBUaGUgdHlwZSBndWFyZCBmdW5jdGlvbiB0byBhcHBseS5cbiAgICAgICogQHBhcmFtIG1lc3NhZ2UgLSBPcHRpb25hbCBtZXNzYWdlIHRvIGJlIHJlcG9ydGVkIGlmIHRoZSB0eXBlIGd1YXJkIGZhaWxzLlxuICAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgQ29udmVydGVyfSByZXR1cm5pbmcgYDxUST5gLlxuICAgICAgKi9cbiAgICB3aXRoVHlwZUd1YXJkPFRJPihndWFyZDogKGZyb206IHVua25vd24pID0+IGZyb20gaXMgVEksIG1lc3NhZ2U/OiBzdHJpbmcpOiBDb252ZXJ0ZXI8VEksIFRDPjtcblxuICAgICAvKipcbiAgICAgICogQ3JlYXRlcyBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGFwcGxpZXMgYSBzdXBwbGllZCB0eXBlIGd1YXJkIHRvIGVhY2ggbWVtYmVyIG9mXG4gICAgICAqIHRoZSBjb252ZXJzaW9uIHJlc3VsdCBmcm9tIHRoaXMgY29udmVydGVyLlxuICAgICAgKlxuICAgICAgKiBAcmVtYXJrc1xuICAgICAgKiBGYWlscyBpZiB0aGUgY29udmVyc2lvbiByZXN1bHQgaXMgbm90IGFuIGFycmF5IG9yIGlmIGFueSBtZW1iZXIgZmFpbHMgdGhlXG4gICAgICAqIHR5cGUgZ3VhcmQuXG4gICAgICAqIEBwYXJhbSBndWFyZCAtIFRoZSB0eXBlIGd1YXJkIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggZWxlbWVudC5cbiAgICAgICogQHBhcmFtIG1lc3NhZ2UgLSBPcHRpb25hbCBtZXNzYWdlIHRvIGJlIHJlcG9ydGVkIGlmIHRoZSB0eXBlIGd1YXJkIGZhaWxzLlxuICAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgQ29udmVydGVyfSByZXR1cm5pbmcgYDxUST5gLlxuICAgICAgKi9cbiAgICAgIHdpdGhJdGVtVHlwZUd1YXJkPFRJPihndWFyZDogKGZyb206IHVua25vd24pID0+IGZyb20gaXMgVEksIG1lc3NhZ2U/OiBzdHJpbmcpOiBDb252ZXJ0ZXI8VElbXSwgVEM+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGFwcGxpZXMgYW4gb3B0aW9uYWwgY29uc3RyYWludCB0byB0aGUgcmVzdWx0XG4gICAgICogb2YgdGhpcyBjb252ZXJzaW9uLiAgSWYgdGhpcyB7QGxpbmsgQ29udmVydGVyfSAodGhlIGJhc2UgY29udmVydGVyKSBzdWNjZWVkcywgdGhlIG5ld1xuICAgICAqIGNvbnZlcnRlciBjYWxscyBhIHN1cHBsaWVkIGNvbnN0cmFpbnQgZXZhbHVhdGlvbiBmdW5jdGlvbiB3aXRoIHRoZSBjb252ZXJzaW9uLCB3aGljaFxuICAgICAqIGZhaWxzIHRoZSBlbnRpcmUgY29udmVyc2lvbiBpZiB0aGUgY29uc3RyYWludCBmdW5jdGlvbiByZXR1cm5zIGVpdGhlciBgZmFsc2VgIG9yXG4gICAgICoge0BsaW5rIEZhaWx1cmUgfCBGYWlsdXJlPFQ+fS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb25zdHJhaW50IC0gQ29uc3RyYWludCBldmFsdWF0aW9uIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0ge0BsaW5rIENvbnN0cmFpbnRPcHRpb25zIHwgT3B0aW9uc30gZm9yIGNvbnN0cmFpbnQgZXZhbHVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgQ29udmVydGVyfSByZXR1cm5pbmcgYDxUPmAuXG4gICAgICovXG4gICAgd2l0aENvbnN0cmFpbnQoXG4gICAgICAgIGNvbnN0cmFpbnQ6ICh2YWw6IFQpID0+IGJvb2xlYW58UmVzdWx0PFQ+LFxuICAgICAgICBvcHRpb25zPzogQ29uc3RyYWludE9wdGlvbnMsXG4gICAgKTogQ29udmVydGVyPFQsIFRDPjtcblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgYSBjb252ZXJ0ZXIgd2hpY2ggYWRkcyBhIGJyYW5kIHRvIHRoZSB0eXBlIHRvIHByZXZlbnQgbWlzbWF0Y2hlZCB1c2FnZVxuICAgICAqIG9mIHNpbXBsZSB0eXBlcy5cbiAgICAgKiBAcGFyYW0gYnJhbmQgLSBUaGUgYnJhbmQgdG8gYmUgYXBwbGllZCB0byB0aGUgcmVzdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJuaW5nIGBCcmFuZDxULCBCPmAuXG4gICAgICovXG4gICAgd2l0aEJyYW5kPEIgZXh0ZW5kcyBzdHJpbmc+KGJyYW5kOiBCKTogQ29udmVydGVyPEJyYW5kPFQsIEI+LCBUQz47XG59XG5cbi8qKlxuICogaW50ZXJuYWxcbiAqL1xudHlwZSBJbm5lckluZmVycmVkVHlwZTxUQ09OVj4gPVxuICAgIFRDT05WIGV4dGVuZHMgQ29udmVydGVyPGluZmVyIFRUTz5cbiAgICAgICAgPyAoVFRPIGV4dGVuZHMgQXJyYXk8aW5mZXIgVFRPRUxFTT4gPyBJbm5lckluZmVycmVkVHlwZTxUVE9FTEVNPltdIDogVFRPKVxuICAgICAgICA6IChUQ09OViBleHRlbmRzIEFycmF5PGluZmVyIFRFTEVNPiA/IElubmVySW5mZXJyZWRUeXBlPFRFTEVNPltdIDogVENPTlYpO1xuXG4vKipcbiAqIEluZmVycyB0aGUgdHlwZSB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgYW4gaW50c3RhbnRpYXRlZCBjb252ZXJ0ZXIuICBXb3Jrc1xuICogZm9yIGNvbXBsZXggYXMgd2VsbCBhcyBzaW1wbGUgdHlwZXMuXG4gKiBAZXhhbXBsZSBgSW5mZXI8dHlwZW9mIENvbnZlcnRlcnMubWFwT2YoQ29udmVydGVycy5zdHJpbmdBcnJheSk+YCBpcyBgTWFwPHN0cmluZywgc3RyaW5nW10+YFxuICogQGJldGFcbiAqL1xuZXhwb3J0IHR5cGUgSW5mZXI8VENPTlY+ID0gVENPTlYgZXh0ZW5kcyBDb252ZXJ0ZXI8aW5mZXIgVFRPPiA/IElubmVySW5mZXJyZWRUeXBlPFRUTz4gOiBuZXZlcjtcblxuLyoqXG4gKiBEZXByZWNhdGVkIG5hbWUgZm9yIEluZmVyPFQ+IHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5XG4gKiBAZGVwcmVjYXRlZCB1c2UgQHNlZSBJbmZlciBpbnN0ZWFkXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUgQ29udmVydGVkVG9UeXBlPFRDT05WPiA9IEluZmVyPFRDT05WPjtcblxuLyoqXG4gKiBCYXNlIHRlbXBsYXRlZCB3cmFwcGVyIHRvIHNpbXBsaWZ5IGNyZWF0aW9uIG9mIG5ldyB7QGxpbmsgQ29udmVydGVyfXMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQ29udmVydGVyPFQsIFRDPXVuZGVmaW5lZD4gaW1wbGVtZW50cyBDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2RlZmF1bHRDb250ZXh0PzogVEM7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9pc09wdGlvbmFsID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9icmFuZD86IHN0cmluZztcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnZlcnRlcjogKGZyb206IHVua25vd24sIHNlbGY6IENvbnZlcnRlcjxULCBUQz4sIGNvbnRleHQ/OiBUQykgPT4gUmVzdWx0PFQ+O1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ29udmVydGVyfSB3aGljaCB1c2VzIHRoZSBzdXBwbGllZCBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBjb252ZXJzaW9uLlxuICAgICAqIEBwYXJhbSBjb252ZXJ0ZXIgLSBUaGUgY29udmVyc2lvbiBmdW5jdGlvbiB0byBiZSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSBkZWZhdWx0Q29udGV4dCAtIE9wdGlvbmFsIGNvbnZlcnNpb24gY29udGV4dCB0byBiZSB1c2VkIGJ5IGRlZmF1bHQuXG4gICAgICogQHBhcmFtIHRyYWl0cyAtIE9wdGlvbmFsIHtAbGluayBDb252ZXJ0ZXJUcmFpdHMgfCB0cmFpdHN9IHRvIGJlIGFzc2lnbmVkIHRvIHRoZSByZXN1bHRpbmdcbiAgICAgKiBjb252ZXJ0ZXIuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBjb252ZXJ0ZXI6IChmcm9tOiB1bmtub3duLCBzZWxmOiBDb252ZXJ0ZXI8VCwgVEM+LCBjb250ZXh0PzogVEMpID0+IFJlc3VsdDxUPixcbiAgICAgICAgZGVmYXVsdENvbnRleHQ/OiBUQyxcbiAgICAgICAgdHJhaXRzPzogQ29udmVydGVyVHJhaXRzLFxuICAgICkge1xuICAgICAgICB0aGlzLl9jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRDb250ZXh0ID0gZGVmYXVsdENvbnRleHQ7XG4gICAgICAgIHRoaXMuX2lzT3B0aW9uYWwgPSAodHJhaXRzPy5pc09wdGlvbmFsID09PSB0cnVlKTtcbiAgICAgICAgdGhpcy5fYnJhbmQgPSAodHJhaXRzPy5icmFuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIENvbnZlcnRlci5pc09wdGlvbmFsfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNPcHRpb25hbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzT3B0aW9uYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIENvbnZlcnRlci5icmFuZH1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGJyYW5kKCk6IHN0cmluZ3x1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnJhbmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIENvbnZlcnRlci5jb252ZXJ0fVxuICAgICAqL1xuICAgIHB1YmxpYyBjb252ZXJ0KGZyb206IHVua25vd24sIGNvbnRleHQ/OiBUQyk6IFJlc3VsdDxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0ZXIoZnJvbSwgdGhpcywgY29udGV4dCA/PyB0aGlzLl9kZWZhdWx0Q29udGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIENvbnZlcnRlci5jb252ZXJ0T3B0aW9uYWx9XG4gICAgICovXG4gICAgcHVibGljIGNvbnZlcnRPcHRpb25hbChmcm9tOiB1bmtub3duLCBjb250ZXh0PzogVEMsIG9uRXJyb3I/OiBPbkVycm9yKTogUmVzdWx0PFR8dW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2NvbnZlcnRlcihmcm9tLCB0aGlzLCB0aGlzLl9jb250ZXh0KGNvbnRleHQpKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgb25FcnJvciA9IG9uRXJyb3IgPz8gJ2lnbm9yZUVycm9ycyc7XG4gICAgICAgICAgICByZXR1cm4gKChmcm9tID09PSB1bmRlZmluZWQpIHx8IG9uRXJyb3IgPT09ICdpZ25vcmVFcnJvcnMnKSA/IHN1Y2NlZWQodW5kZWZpbmVkKSA6IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBDb252ZXJ0ZXIub3B0aW9uYWx9XG4gICAgICovXG4gICAgcHVibGljIG9wdGlvbmFsKG9uRXJyb3I/OiBPbkVycm9yKTogQ29udmVydGVyPFR8dW5kZWZpbmVkLCBUQz4ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VHx1bmRlZmluZWQsIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgICAgICBvbkVycm9yID0gb25FcnJvciA/PyAnZmFpbE9uRXJyb3InO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydE9wdGlvbmFsKGZyb20sIHRoaXMuX2NvbnRleHQoY29udGV4dCksIG9uRXJyb3IpO1xuICAgICAgICB9KS5fd2l0aCh0aGlzLl90cmFpdHMoeyBpc09wdGlvbmFsOiB0cnVlIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgQ29udmVydGVyLm1hcH1cbiAgICAgKi9cbiAgICBwdWJsaWMgbWFwPFQyPihtYXBwZXI6IChmcm9tOiBUKSA9PiBSZXN1bHQ8VDI+KTogQ29udmVydGVyPFQyLCBUQz4ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXI8VDIsIFRDPigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUMiwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyUmVzdWx0ID0gdGhpcy5fY29udmVydGVyKGZyb20sIHRoaXMsIHRoaXMuX2NvbnRleHQoY29udGV4dCkpO1xuICAgICAgICAgICAgaWYgKGlubmVyUmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcHBlcihpbm5lclJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFpbChpbm5lclJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgfSkuX3dpdGgodGhpcy5fdHJhaXRzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBDb252ZXJ0ZXIubWFwQ29udmVydH1cbiAgICAgKi9cbiAgICBwdWJsaWMgbWFwQ29udmVydDxUMj4obWFwQ29udmVydGVyOiBDb252ZXJ0ZXI8VDI+KTogQ29udmVydGVyPFQyLCBUQz4ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXI8VDIsIFRDPigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUMiwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyUmVzdWx0ID0gdGhpcy5fY29udmVydGVyKGZyb20sIHRoaXMsIHRoaXMuX2NvbnRleHQoY29udGV4dCkpO1xuICAgICAgICAgICAgaWYgKGlubmVyUmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcENvbnZlcnRlci5jb252ZXJ0KGlubmVyUmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWlsKGlubmVyUmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmV0dXJuLWFzc2lnblxuICAgICAgICB9KS5fd2l0aCh0aGlzLl90cmFpdHMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIENvbnZlcnRlci5tYXBJdGVtc31cbiAgICAgKi9cbiAgICBwdWJsaWMgbWFwSXRlbXM8VEk+KG1hcHBlcjogKGZyb206IHVua25vd24pID0+IFJlc3VsdDxUST4pOiBDb252ZXJ0ZXI8VElbXSwgVEM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPFRJW10sIFRDPigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUSVtdLCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRlcihmcm9tLCB0aGlzLCB0aGlzLl9jb250ZXh0KGNvbnRleHQpKS5vblN1Y2Nlc3MoKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXBSZXN1bHRzKGl0ZW1zLm1hcCgoaSkgPT4gbWFwcGVyKGkpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKCdDYW5ub3QgbWFwIGl0ZW1zIC0gbm90IGFuIGFycmF5Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIENvbnZlcnRlci5tYXBDb252ZXJ0SXRlbXN9XG4gICAgICovXG4gICAgcHVibGljIG1hcENvbnZlcnRJdGVtczxUST4obWFwQ29udmVydGVyOiBDb252ZXJ0ZXI8VEksIHVua25vd24+KTogQ29udmVydGVyPFRJW10sIFRDPiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcjxUSVtdLCBUQz4oKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VElbXSwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0ZXIoZnJvbSwgdGhpcywgdGhpcy5fY29udGV4dChjb250ZXh0KSkub25TdWNjZXNzKChpdGVtcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwUmVzdWx0cyhpdGVtcy5tYXAoKGkpID0+IG1hcENvbnZlcnRlci5jb252ZXJ0KGkpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKCdDYW5ub3QgbWFwIGl0ZW1zIC0gbm90IGFuIGFycmF5Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIENvbnZlcnRlci53aXRoVHlwZUd1YXJkfVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoVHlwZUd1YXJkPFRJPihndWFyZDogKGZyb206IHVua25vd24pID0+IGZyb20gaXMgVEksIG1lc3NhZ2U/OiBzdHJpbmcpOiBDb252ZXJ0ZXI8VEksIFRDPiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcjxUSSwgVEM+KChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFRJLCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRlcihmcm9tLCB0aGlzLCB0aGlzLl9jb250ZXh0KGNvbnRleHQpKS5vblN1Y2Nlc3MoKGlubmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UgPz8gJ2ludmFsaWQgdHlwZSc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGd1YXJkKGlubmVyKSA/IHN1Y2NlZWQoaW5uZXIpIDogZmFpbChgJHttZXNzYWdlfTogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgQ29udmVydGVyLndpdGhJdGVtVHlwZUd1YXJkfVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoSXRlbVR5cGVHdWFyZDxUST4oZ3VhcmQ6IChmcm9tOiB1bmtub3duKSA9PiBmcm9tIGlzIFRJLCBtZXNzYWdlPzogc3RyaW5nKTogQ29udmVydGVyPFRJW10sIFRDPiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcjxUSVtdLCBUQz4oKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VElbXSwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0ZXIoZnJvbSwgdGhpcywgdGhpcy5fY29udGV4dChjb250ZXh0KSkub25TdWNjZXNzKChpdGVtcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwUmVzdWx0cyhpdGVtcy5tYXAoKGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlID8/ICdpbnZhbGlkIHR5cGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGd1YXJkKGkpID8gc3VjY2VlZChpKSA6IGZhaWwoYCR7bWVzc2FnZX06ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoJ0Nhbm5vdCBndWFyZCBpdGVtIHR5cGUgLSBub3QgYW4gYXJyYXknKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgQ29udmVydGVyLndpdGhDb25zdHJhaW50fVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQ29uc3RyYWludChcbiAgICAgICAgY29uc3RyYWludDogKHZhbDogVCkgPT4gYm9vbGVhbnxSZXN1bHQ8VD4sXG4gICAgICAgIG9wdGlvbnM/OiBDb25zdHJhaW50T3B0aW9ucyxcbiAgICApOiBDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPFQsIFRDPigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxULCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fY29udmVydGVyKGZyb20sIHRoaXMsIHRoaXMuX2NvbnRleHQoY29udGV4dCkpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cmFpbnRSZXN1bHQgPSBjb25zdHJhaW50KHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJhaW50UmVzdWx0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRSZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IGZhaWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiJHtKU09OLnN0cmluZ2lmeShyZXN1bHQudmFsdWUpfVwiOiAke29wdGlvbnM/LmRlc2NyaXB0aW9uID8/ICdkb2VzIG5vdCBtZWV0IGNvbnN0cmFpbnQnfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJhaW50UmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSkuX3dpdGgodGhpcy5fdHJhaXRzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBDb252ZXJ0ZXIud2l0aEJyYW5kfVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQnJhbmQ8QiBleHRlbmRzIHN0cmluZz4oYnJhbmQ6IEIpOiBDb252ZXJ0ZXI8QnJhbmQ8VCwgQj4sIFRDPiB7XG4gICAgICAgIGlmICh0aGlzLl9icmFuZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVwbGFjZSBleGlzdGluZyBicmFuZCBcIiR7dGhpcy5fYnJhbmR9XCIgd2l0aCBcIiR7YnJhbmR9XCIuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXI8QnJhbmQ8VCwgQj4sIFRDPigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxULCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRlcihmcm9tLCB0aGlzLCB0aGlzLl9jb250ZXh0KGNvbnRleHQpKS5vblN1Y2Nlc3MoKHYpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh2IGFzIEJyYW5kPFQsIEI+KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KS5fd2l0aCh0aGlzLl90cmFpdHMoeyBicmFuZCB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jb250ZXh0KHN1cHBsaWVkPzogVEMpOiBUQ3x1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gc3VwcGxpZWQgPz8gdGhpcy5fZGVmYXVsdENvbnRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF90cmFpdHModHJhaXRzPzogUGFydGlhbDxDb252ZXJ0ZXJUcmFpdHM+KTogQ29udmVydGVyVHJhaXRzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzT3B0aW9uYWw6IHRoaXMuaXNPcHRpb25hbCxcbiAgICAgICAgICAgIGJyYW5kOiB0aGlzLmJyYW5kLFxuICAgICAgICAgICAgLi4uKHRyYWl0cyA/PyB7fSksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF93aXRoKHRyYWl0czogUGFydGlhbDxDb252ZXJ0ZXJUcmFpdHM+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lzT3B0aW9uYWwgPSAodHJhaXRzLmlzT3B0aW9uYWwgPT09IHRydWUpO1xuICAgICAgICB0aGlzLl9icmFuZCA9ICh0cmFpdHMuYnJhbmQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4iXX0=

@@ -7,3 +7,5 @@ import { BaseConverter, Converter, ConverterTraits } from './converter';

/**
* Options for @see StringConverter maching method
* Options for {@link Converters.StringConverter | StringConverter}
* matching method
* @public
*/

@@ -18,49 +20,60 @@ export interface StringMatchOptions {

/**
* The @see StringConverter class extends @see BaseConverter to provide string-specific helper
* functions.
* The {@link Converters.StringConverter | StringConverter} class extends {@link BaseConverter}
* to provide string-specific helper methods.
* @public
*/
export declare class StringConverter<T extends string = string, TC = unknown> extends BaseConverter<T, TC> {
/**
* Construct a new @see StringConverter
* @param defaultContext Optional context used by the conversion
* @param traits Optional traits to be applied to the conversion
* @param converter Optional converter to be used for the conversion
* Construct a new {@link Converters.StringConverter | StringConverter}.
* @param defaultContext - Optional context used by the conversion.
* @param traits - Optional traits to be applied to the conversion.
* @param converter - Optional conversion function to be used for the conversion.
*/
constructor(defaultContext?: TC, traits?: ConverterTraits, converter?: (from: unknown, self: Converter<T, TC>, context?: TC) => Result<T>);
/**
* @internal
*/
protected static _convert<T extends string>(from: unknown): Result<T>;
/**
* @internal
*/
protected static _wrap<T extends string, TC>(wrapped: StringConverter<T, TC>, converter: (from: T) => Result<T>, traits?: ConverterTraits): StringConverter<T, TC>;
/**
* Returns a @see StringConverter which constrains the result to match a supplied
* string.
* @param match The string to be matched
* @param options Optional @see StringMatchOptions for this conversion
* @returns @see Success with a matching string or @see Failure with an informative
* Returns a {@link Converters.StringConverter | StringConverter} which constrains the result to match
* a supplied string.
* @param match - The string to be matched
* @param options - Optional {@link Converters.StringMatchOptions} for this conversion.
* @returns {@link Success} with a matching string or {@link Failure} with an informative
* error if the string does not match.
* {@label string}
*/
matching(match: string, options?: Partial<StringMatchOptions>): StringConverter<T, TC>;
/**
* Returns a @see StringConverter which constrains the result to match one of a supplied
* array of strings.
* @param match The array to be searched
* @param options Optional @see StringMatchOptions for this conversion
* @returns @see Success with a matching string or @see Failure with an informative
* Returns a {@link Converters.StringConverter | StringConverter} which constrains the result to match
* one of a supplied array of strings.
* @param match - The array of allowed strings.
* @param options - Optional {@link Converters.StringMatchOptions} for this conversion.
* @returns {@link Success} with a matching string or {@link Failure} with an informative
* error if the string does not match.
* {@label array}
*/
matching(match: string[], options?: Partial<StringMatchOptions>): StringConverter<T, TC>;
/**
* Returns a @see StringConverter which constrains the result to match one of a supplied
* Set of strings.
* @param match The Set to be tested
* @param options Optional @see StringMatchOptions for this conversion
* @returns @see Success with a matching string or @see Failure with an informative
* Returns a {@link Converters.StringConverter | StringConverter} which constrains the result to match
* one of a supplied `Set` of strings.
* @param match - The `Set` of allowed strings.
* @param options - Optional {@link Converters.StringMatchOptions} for this conversion.
* @returns {@link Success} with a matching string or {@link Failure} with an informative
* error if the string does not match.
* {@label set}
*/
matching(match: Set<T>, options?: Partial<StringMatchOptions>): StringConverter<T, TC>;
/**
* Returns a @see StringConverter which constrains the result to match a supplied regular
* expression.
* @param match The @see RegExp to be tested
* @param options Optional @see StringMatchOptions for this conversion
* @returns @see Success with a matching string or @see Failure with an informative
* Returns a {@link Converters.StringConverter | StringConverter} which constrains the result to match
* a supplied regular expression.
* @param match - The regular expression to be used as a constraint.
* @param options - Optional {@link Converters.StringMatchOptions} for this conversion
* @returns {@link Success} with a matching string or {@link Failure} with an informative
* error if the string does not match.
* {@label regexp}
*/

@@ -72,31 +85,47 @@ matching(match: RegExp, options?: Partial<StringMatchOptions>): StringConverter<T, TC>;

* string succeed. Anything else fails.
* @public
*/
export declare const string: StringConverter<string, unknown>;
/**
* Helper function to create a converter which converts unknown to string, applying
* template conversions supplied at construction time or at runtime as context.
* @param defaultContext optional default context to use for template values
* Helper function to create a {@link Converters.StringConverter | StringConverter} which converts
* `unknown` to `string`, applying template conversions supplied at construction time or at
* runtime as context.
* @remarks
* Template conversions are applied using `mustache` syntax.
* @param defaultContext - Optional default context to use for template values.
* @returns A new {@link Converter} returning `string`.
* @public
*/
export declare function templateString(defaultContext?: unknown): StringConverter<string, unknown>;
/**
* A converter to convert unknown to one of a set of supplied enumerated values. Anything else fails.
* Helper function to create a {@link Converter} which converts `unknown` to one of a set of supplied
* enumerated values. Anything else fails.
*
* @remarks
* Allowed enumerated values can also be supplied as context at conversion time.
* @param values Array of allowed values
* @param values - Array of allowed values.
* @returns A new {@link Converter} returning `<T>`.
* @public
*/
export declare function enumeratedValue<T>(values: T[]): Converter<T, T[]>;
/**
* Converts unknown to one of a set of supplied enumerated values, mapping any of multiple supplied
* values to the enumeration. Enables mapping of multiple input values to a consistent internal
* representation (so e.g. 'y', 'yes', 'true' and true can all map to boolean true)
* @param map An array of tuples describing the mapping. The first element of each tuple is the result
* Helper function to create a {@link Converter} which converts `unknown` to one of a set of supplied enumerated
* values, mapping any of multiple supplied values to the enumeration.
* @remarks
* Enables mapping of multiple input values to a consistent internal representation (so e.g. `'y'`, `'yes'`,
* `'true'`, `1` and `true` can all map to boolean `true`)
* @param map - An array of tuples describing the mapping. The first element of each tuple is the result
* value, the second is the set of values that map to the result. Tuples are evaluated in the order
* supplied and are not checked for duplicates.
* @param message an optional error message
* @returns The mapped value
* @param message - An optional error message.
* @returns A {@link Converter} which applies the mapping and yields `<T>` on success.
* @public
*/
export declare function mappedEnumeratedValue<T>(map: [T, unknown[]][], message?: string): Converter<T, undefined>;
/**
* A converter to convert unknown to some value. Succeeds with the supplied value if an identity
* comparison succeeds, fails otherwise.
* @param value The value to be compared
* Helper function to create a {@link Converter} which converts `unknown` to some supplied literal value. Succeeds with
* the supplied value if an identity comparison succeeds, fails otherwise.
* @param value - The value to be compared.
* @returns A {@link Converter} which returns the supplied value on success.
* @public
*/

@@ -106,185 +135,275 @@ export declare function literal<T>(value: T): Converter<T, unknown>;

* Deprecated alias for @see literal
* @param value The value to be compared
* @deprecated use literal instead
* @param value - The value to be compared.
* @deprecated Use {@link Converters.literal} instead.
* @internal
*/
export declare const value: typeof literal;
/**
* A converter to convert unknown to a number. Numbers and strings
* with a numeric format succeed. Anything else fails.
* A {@link Converter} which converts `unknown` to a `number`.
* @remarks
* Numbers and strings with a numeric format succeed. Anything else fails.
* @public
*/
export declare const number: BaseConverter<number, undefined>;
/**
* A converter to convert unknown to boolean. Boolean values or the
* case-insensitive strings 'true' and 'false' succeed. Anything
* else fails.
* A {@link Converter} which converts `unknown` to `boolean`.
* @remarks
* Boolean values or the case-insensitive strings `'true'` and `'false'` succeed.
* Anything else fails.
* @public
*/
export declare const boolean: BaseConverter<boolean, undefined>;
/**
* A converter to convert an optional string value. Values of type string
* are returned. Anything else returns success with an undefined value.
* A {@link Converter} which converts an optional `string` value. Values of type
* `string` are returned. Anything else returns {@link Success} with value `undefined`.
* @public
*/
export declare const optionalString: Converter<string | undefined, unknown>;
/**
* Creates a converter which converts any string into an array of strings
* by separating at a supplied delimiter. Delimeter may also be supplied
* as context at conversion time.
* @param delimiter The delimiter at which to split.
* Helper function to create a {@link Converter} which converts any `string` into an
* array of `string`, by separating at a supplied delimiter.
* @remarks
* Delimeter may also be supplied as context at conversion time.
* @param delimiter - The delimiter at which to split.
* @returns A new {@link Converter} returning `string[]`.
* @public
*/
export declare function delimitedString(delimiter: string, options?: 'filtered' | 'all'): Converter<string[], string>;
/**
* A converter to convert an iso formatted string, a number or a Date object to a Date object
* A {@link Converter} which converts an iso formatted string, a number or a `Date` object to
* a `Date` object.
* @public
*/
export declare const isoDate: BaseConverter<Date, undefined>;
/**
* A converter to convert an optional number value. Values of type number
* or numeric strings are converted and returned. Anything else returns
* success with an undefined value.
* A {@link Converter} which converts an optional `number` value.
* @remarks
* Values of type `number` or numeric strings are converted and returned.
* Anything else returns {@link Success} with value `undefined`.
* @public
*/
export declare const optionalNumber: Converter<number | undefined, undefined>;
/**
* A converter to convert an optional boolean value. Values of type boolean
* or strings that match (case-insensitive) 'true' or 'false' are converted
* and returned. Anything else returns success with an undefined value.
* A {@link Converter} to convert an optional `boolean` value.
* @remarks
* Values of type `boolean` or strings that match (case-insensitive) `'true'`
* or `'false'` are converted and returned. Anything else returns {@link Success}
* with value `undefined`.
* @public
*/
export declare const optionalBoolean: Converter<boolean | undefined, undefined>;
/**
* A helper wrapper for polymorphic fields. Invokes the wrapped converters
* in sequence, returning the first successful result. Returns an error
* if none of the supplied converters can convert the value.
*
* If onError is 'ignoreErrors' (default), then errors from any of the
* A helper function to create a {@link Converter} for polymorphic values. Returns a
* converter which Invokes the wrapped converters in sequence, returning the first successful
* result. Returns an error if none of the supplied converters can convert the value.
* @remarks
* If `onError` is `ignoreErrors` (default), then errors from any of the
* converters are ignored provided that some converter succeeds. If
* onError is 'failOnError', then an error from any converter fails the entire
* onError is `failOnError`, then an error from any converter fails the entire
* conversion.
*
* @param converters An ordered list of converters to be considered
* @param onError Specifies treatment of unconvertable elements
* @param converters - An ordered list of {@link Converter | converters} to be considered.
* @param onError - Specifies treatment of unconvertable elements.
* @returns A new {@link Converter} which yields a value from the union of the types returned
* by the wrapped converters.
* @public
*/
export declare function oneOf<T, TC = unknown>(converters: Array<Converter<T, TC>>, onError?: OnError): Converter<T, TC>;
/**
* A helper wrapper for converting an array of <T>. If onError is 'failOnError' (default),
* then the entire conversion fails if any element cannot be converted. If onError
* is 'ignoreErrors', failing elements are silently ignored.
* @param converter Converter used to convert each item in the array
* @param ignoreErrors Specifies treatment of unconvertable elements
* A helper function to create a {@link Converter} which converts `unknown` to an array of `<T>`.
* @remarks
* If `onError` is `'failOnError'` (default), then the entire conversion fails if any element cannot
* be converted. If `onError` is `'ignoreErrors'`, then failing elements are silently ignored.
* @param converter - {@link Converter} used to convert each item in the array.
* @param ignoreErrors - Specifies treatment of unconvertable elements.
* @returns A {@link Converter} which returns an array of `<T>`.
* @public
*/
export declare function arrayOf<T, TC = undefined>(converter: Converter<T, TC>, onError?: OnError): Converter<T[], TC>;
/**
* A helper wrapper for converting to Itemrray<T>. If onError is 'failOnError' (default),
* then the entire conversion fails if any element cannot be converted. If onError
* is 'ignoreErrors', failing elements are silently ignored.
* @param converter Converter used to convert each item in the array
* @param ignoreErrors Specifies treatment of unconvertable elements
* A helper function to create a {@link Converter} which converts `unknown` to {@link ExtendedArray | ExtendedArray<T>}.
* @remarks
* If `onError` is `'failOnError'` (default), then the entire conversion fails if any element cannot
* be converted. If `onError` is `'ignoreErrors'`, then failing elements are silently ignored.
* @param converter - {@link Converter} used to convert each item in the array
* @param ignoreErrors - Specifies treatment of unconvertable elements
* @beta
*/
export declare function extendedArrayOf<T, TC = undefined>(label: string, converter: Converter<T, TC>, onError?: OnError): Converter<ExtendedArray<T>, TC>;
/**
* Converter to convert an unknown to an array of strings. Conversion succeeds
* and returns the supplied value if it as an array of strings, fails otherwise.
* {@link Converter} to convert an `unknown` to an array of `string`.
* @remarks
* Returns {@link Success} with the the supplied value if it as an array
* of strings, returns {@link Failure} with an error message otherwise.
* @public
*/
export declare const stringArray: Converter<string[], unknown>;
/**
* Converter to convert an unknown to an array of numbers. Conversion succeeds
* and returns the supplied value if it as an array of numbers, fails otherwise.
* {@link Converter} to convert an `unknown` to an array of `number`.
* @remarks
* Returns {@link Success} with the the supplied value if it as an array
* of numbers, returns {@link Failure} with an error message otherwise.
* @public
*/
export declare const numberArray: Converter<number[], undefined>;
/**
* Options for 'recordOf' and 'mapOf' converters
* Options for {@link Converters.(recordOf:withOptions)} and {@link Converters.(mapOf:withOptions)}
* helper functions.
* @public
*/
export interface KeyedConverterOptions<T extends string = string, TC = undefined> {
/**
* if `onError` is `'fail'` (default), then the entire conversion fails if any key or element
* cannot be converted. If `onError` is `'ignore'`, failing elements are silently ignored.
*/
onError?: 'fail' | 'ignore';
/**
* If present, `keyConverter` is used to convert the source object property names to
* keys in the resulting map or record.
* @remarks
* Can be used to coerce key names to supported values and/or strong types.
*/
keyConverter?: Converter<T, TC>;
}
/**
* A helper wrapper to convert the string-keyed properties of an object to a Record of T.
* Conversion fails if any element cannot be converted. If onError is 'ignore' failing
* elements are silently ignored.
* @param converter Converter used to convert each item in the record
* A helper function to create a {@link Converter} which converts the `string`-keyed properties
* using a supplied {@link Converter | Converter<T>} to produce a `Record<string, T>`.
* @remarks
* The resulting converter fails conversion if any element cannot be converted.
* @param converter - {@link Converter} used to convert each item in the source object.
* @returns A {@link Converter} which returns `Record<string, T>`.
* {@label default}
* @public
*/
export declare function recordOf<T, TC = undefined, TK extends string = string>(converter: Converter<T, TC>): Converter<Record<TK, T>, TC>;
/**
* A helper wrapper to convert the string-keyed properties of an object to a Record of T.
* If onError is 'fail' (default), then the entire conversion fails if any element
* cannot be converted. If onError is 'ignore' failing elements are silently ignored.
* @param converter Converter used to convert each item in the record
* @param onError Specifies treatment of unconvertable elements
* A helper function to create a {@link Converter} which converts the `string`-keyed properties
* using a supplied {@link Converter | Converter<T>} to produce a `Record<string, T>` and optionally
* specified handling of elements that cannot be converted.
* @remarks
* if `onError` is `'fail'` (default), then the entire conversion fails if any key or element
* cannot be converted. If `onError` is `'ignore'`, failing elements are silently ignored.
* @param converter - {@link Converter} used to convert each item in the source object.
* @returns A {@link Converter} which returns `Record<string, T>`.
* {@label withOnError}
* @public
*/
export declare function recordOf<T, TC = undefined, TK extends string = string>(converter: Converter<T, TC>, onError: 'fail' | 'ignore'): Converter<Record<TK, T>, TC>;
/**
* A helper wrapper to convert the string-keyed properties of an object to a Record of T.
* If options specify a key converter it will be applied to each key.
* If onError is 'fail' (default), then the entire conversion fails if any key or element
* cannot be converted. If onError is 'ignore' failing elements are silently ignored.
* @param converter Converter used to convert each item in the record
* @param options Optional @see KeyedConverterOptions
* A helper function to create a {@link Converter} which converts the `string`-keyed properties
* using a supplied {@link Converter | Converter<T>} to produce a `Record<TK, T>`.
* @remarks
* If present, the supplied {@link Converters.KeyedConverterOptions | options} can provide a strongly-typed
* converter for keys and/or control the handling of elements that fail conversion.
* @param converter - {@link Converter} used to convert each item in the source object.
* @param options - Optional {@link Converters.KeyedConverterOptions | KeyedConverterOptions<TK, TC>} which
* supplies a key converter and/or error-handling options.
* @returns A {@link Converter} which returns `Record<TK, T>`.
* {@label withOptions}
* @public
*/
export declare function recordOf<T, TC = undefined, TK extends string = string>(converter: Converter<T, TC>, options: KeyedConverterOptions<TK, TC>): Converter<Record<TK, T>, TC>;
/**
* A helper wrapper to convert the string-keyed properties of an object to a Map of T.
* Conversion fails if any element cannot be converted.
* @param converter Converter used to convert each item in the map
* A helper function to create a {@link Converter} which converts the `string`-keyed properties
* using a supplied {@link Converter | Converter<T>} to produce a `Map<string, T>`.
* @remarks
* The resulting converter fails conversion if any element cannot be converted.
* @param converter - {@link Converter} used to convert each item in the source object.
* @returns A {@link Converter} which returns `Map<string, T>`.
* {@label default}
* @public
*/
export declare function mapOf<T, TC = undefined, TK extends string = string>(converter: Converter<T, TC>): Converter<Map<TK, T>, TC>;
/**
* A helper wrapper to convert the string-keyed properties of an object to a Map of T.
* If onError is 'fail' (default), then the entire conversion fails if any element
* cannot be converted. If onError is 'ignore' failing elements are silently ignored.
* @param converter Converter used to convert each item in the map
* @param onError Specifies treatment of unconvertable elements
* A helper function to create a {@link Converter} which converts the `string`-keyed properties
* using a supplied {@link Converter | Converter<T>} to produce a `Map<string, T>` and optionally
* specified handling of elements that cannot be converted.
* @remarks
* if `onError` is `'fail'` (default), then the entire conversion fails if any key or element
* cannot be converted. If `onError` is `'ignore'`, failing elements are silently ignored.
* @param converter - {@link Converter} used to convert each item in the source object.
* @returns A {@link Converter} which returns `Map<string, T>`.
* {@label withOnError}
* @public
*/
export declare function mapOf<T, TC = undefined, TK extends string = string>(converter: Converter<T, TC>, onError: 'fail' | 'ignore'): Converter<Map<TK, T>, TC>;
/**
* A helper wrapper to convert the string-keyed properties of an object to a Map of T.
* If options specify a key converter it will be applied to each key.
* If onError is 'fail' (default), then the entire conversion fails if any key or element
* cannot be converted. If onError is 'ignore' failing elements are silently ignored.
* @param converter Converter used to convert each item in the map
* @param options Optional @see KeyedConverterOptions
* A helper function to create a {@link Converter} which converts the `string`-keyed properties
* using a supplied {@link Converter | Converter<T>} to produce a `Map<TK, T>`.
* @remarks
* If present, the supplied {@link Converters.KeyedConverterOptions | options} can provide a strongly-typed
* converter for keys and/or control the handling of elements that fail conversion.
* @param converter - {@link Converter} used to convert each item in the source object.
* @param options - Optional {@link Converters.KeyedConverterOptions | KeyedConverterOptions<TK, TC>} which
* supplies a key converter and/or error-handling options.
* @returns A {@link Converter} which returns `Map<TK, T>`.
* {@label withOptions}
* @public
*/
export declare function mapOf<T, TC = undefined, TK extends string = string>(converter: Converter<T, TC>, options: KeyedConverterOptions<TK, TC>): Converter<Map<TK, T>, TC>;
/**
* Gets a converter which validates that a supplied value is of a type validated by
* a supplied validator and returns it.
* @param validator A validator function to determine if the converted value is valid
* @param description A description of the validate type for use in error messages
* @returns If validator returns true, suceeds with from coerced to T. Fails with an error
* message otherwise.
* Helper function to create a {@link Converter} which validates that a supplied value is
* of a type validated by a supplied validator function and returns it.
* @remarks
* If `validator` succeeds, this {@link Converter} returns {@link Success} with the supplied
* value of `from` coerced to type `<T>`. Returns a {@link Failure} with additional
* information otherwise.
* @param validator - A validator function to determine if the converted value is valid.
* @param description - A description of the validated type for use in error messages.
* @returns A new {@link Converter | Converter<T>} which applies the supplied validation.
* @public
*/
export declare function validateWith<T, TC = undefined>(validator: (from: unknown) => from is T, description?: string): Converter<T, TC>;
/**
* A helper function to extract and convert an element from an array. Succeeds and returns
* the converted value if the element exists in the supplied parameter and can be converted.
* Fails otherwise.
* @param index The index of the field to be extracted.
* @param converter Converter used to convert the extracted element.
* A helper function to create a {@link Converter} which extracts and converts an element from an array.
* @remarks
* The returned {@link Converter} returns {@link Success} with the converted value if the element exists
* in the supplied array and can be converted. Returns {@link Failure} with an error message otherwise.
* @param index - The index of the element to be extracted.
* @param converter - A {@link Converter} used to convert the extracted element.
* @returns A {@link Converter | Converter<T>} which extracts the specified element from an array.
* @public
*/
export declare function element<T, TC = undefined>(index: number, converter: Converter<T, TC>): Converter<T, TC>;
/**
* A helper function to extract and convert an optional element from an array. Succeeds
* and returns the converted value if the element exists in the supplied parameter and can
* be converted. Succeeds with undefined if the parameter is an array but the index is too
* large. Fails if the supplied parameter is not an array, if the requested index is negative,
* or if the element cannot be converted.
* @param name The name of the field to be extracted.
* @param converter Converter used to convert the extracted field.
* A helper function to create a {@link Converter} which extracts and converts an optional element from an array.
* @remarks
* The resulting {@link Converter} returns {@link Success} with the converted value if the element exsist
* in the supplied array and can be converted. Returns {@link Success} with value `undefined` if the parameter
* is an array but the index is out of range. Returns {@link Failure} with a message if the supplied parameter
* is not an array, if the requested index is negative, or if the element cannot be converted.
* @param index - The index of the element to be extracted.
* @param converter - A {@link Converter} used to convert the extracted element.
* @returns A {@link Converter | Converter<T>} which extracts the specified element from an array.
* @public
*/
export declare function optionalElement<T, TC = undefined>(index: number, converter: Converter<T, TC>): Converter<T | undefined, TC>;
/**
* A helper function to extract and convert a field from an object. Succeeds and returns
* the converted value if the field exists in the supplied parameter and can be converted.
* Fails otherwise.
* @param name The name of the field to be extracted.
* @param converter Converter used to convert the extracted field.
* A helper function to create a {@link Converter} which extracts and convert a property specified
* by name from an object.
* @remarks
* The resulting {@link Converter} returns {@link Success} with the converted value of the correpsonding
* object property if the field exists and can be converted. Returns {@link Failure} with an error message
* otherwise.
* @param name - The name of the field to be extracted.
* @param converter - {@link Converter} used to convert the extracted field.
* @public
*/
export declare function field<T, TC = undefined>(name: string, converter: Converter<T, TC>): Converter<T, TC>;
/**
* A helper function to extract and convert an optional field from an object. Succeeds
* and returns the converted value if the field exists in the supplied parameter and can
* be converted. Succeeds with undefined if the parameter is an object but the named field
* is not present. Fails if the supplied parameter is not an object.
* @param name The name of the field to be extracted.
* @param converter Converter used to convert the extracted field.
* A helper function to create a {@link Converter} which extracts and convert a property specified
* by name from an object.
* @remarks
* The resulting {@link Converter} returns {@link Success} with the converted value of the correpsonding
* object property if the field exists and can be converted. Returns {@link Success} with value `undefined`
* if the supplied parametr is an object but the named field is not present. Returns {@link Failure} with
* an error message otherwise.
* @param name - The name of the field to be extracted.
* @param converter - {@link Converter} used to convert the extracted field.
* @public
*/
export declare function optionalField<T, TC = undefined>(name: string, converter: Converter<T, TC>): Converter<T | undefined, TC>;
/**
* Options for an @see ObjectConverter.
* Options for an {@link Converters.ObjectConverter | ObjectConverter}.
* @public
*/

@@ -304,2 +423,5 @@ export interface ObjectConverterOptions<T> {

* Per-property converters for each of the properties in type T.
* @remarks
* Used to construct a {@link Converters.ObjectConverter | ObjectConverter}
* @public
*/

@@ -310,79 +432,183 @@ export declare type FieldConverters<T, TC = unknown> = {

/**
* Converter to convert an object of type T without changing shape, given a @see FieldConverters<T>.
* If all of the required fields exist and can be converted, returns a new object with the converted
* values under the original key names. If any required fields do not exist or cannot be converted,
* the entire conversion fails. See @see ObjectConverterOptions for other conversion options.
* A {@link Converter} which converts an object of type `<T>` without changing shape, given
* a {@link Converters.FieldConverters | FieldConverters<T>} for the fields in the object.
* @remarks
* By default, if all of the required fields exist and can be converted, returns a new object with
* the converted values under the original key names. If any required fields do not exist or cannot
* be converted, the entire conversion fails. See {@link Converters.ObjectConverterOptions | ObjectConverterOptions}
* for other conversion options.
* @public
*/
export declare class ObjectConverter<T, TC = unknown> extends BaseConverter<T, TC> {
/**
* Fields converted by this {@link Converters.ObjectConverter | ObjectConverter}.
*/
readonly fields: FieldConverters<T>;
/**
* Options used to initialize this {@link Converters.ObjectConverter | ObjectConverter}.
*/
readonly options: ObjectConverterOptions<T>;
/**
* Constructs a new @see ObjectConverter<T> using options supplied in an
* optional @see ObjectConverterOptions<T>.
* @param fields A @see FieldConverters<T> containing converters for each field
* @param options An optional @see ObjectConverterOptions to configure the conversion
* Constructs a new {@link Converters.ObjectConverter | ObjectConverter<T>} using options
* supplied in a {@link Converters.ObjectConverterOptions | ObjectConverterOptions<T>}.
* @param fields - A {@link Converters.FieldConverters | FieldConverters<T>} containing
* a {@link Converter} for each field
* @param options - An optional @see ObjectConverterOptions to configure the conversion
* {@label withOptions}
*/
constructor(fields: FieldConverters<T, TC>, options?: ObjectConverterOptions<T>);
/**
* Constructs a new @see ObjectConverter<T> using optional fields supplied in an
* optional array of keyof T.
* @param fields A @see FieldConverters<T> containing converters for each field
* @param optional An optional array of keyof T listing fields that are not required.
* Constructs a new {@link Converters.ObjectConverter | ObjectConverter<T>} with optional
* properties specified as an array of `keyof T`.
* @param fields - A {@link Converters.FieldConverters | FieldConverters<T>} containing
* a {@link Converter} for each field.
* @param optional - An array of `keyof T` listing fields that are not required.
* {@label withKeys}
*/
constructor(fields: FieldConverters<T, TC>, optional?: (keyof T)[]);
/**
* Creates a new {@link Converters.ObjectConverter | ObjectConverter} derived from this one but with
* new optional properties as specified by a supplied {@link Converters.ObjectConverterOptions | ObjectConverterOptions<T>}.
* @param options - The {@link Converters.ObjectConverterOptions | options} to be applied to the new
* converter.
* @returns A new {@link Converters.ObjectConverter | ObjectConverter} with the additional optional source properties.
* {@label withOptions}
*/
partial(options: ObjectConverterOptions<T>): ObjectConverter<Partial<T>, TC>;
/**
* Creates a new {@link Converters.ObjectConverter | ObjectConverter} derived from this one but with
* new optional properties as specified by a supplied array of `keyof T`.
* @param optional - The keys of the source object properties to be made optional.
* @returns A new {@link Converters.ObjectConverter | ObjectConverter} with the additional optional source
* properties.
* {@label withKeys}
*/
partial(optional?: (keyof T)[]): ObjectConverter<Partial<T>, TC>;
addPartial(addOptionalFields: (keyof T)[]): ObjectConverter<Partial<T>, TC>;
/**
* Creates a new {@link Converters.ObjectConverter | ObjectConverter} derived from this one but with
* new optional properties as specified by a supplied array of `keyof T`.
* @param addOptionalProperties - The keys to be made optional.
* @returns A new {@link Converters.ObjectConverter | ObjectConverter} with the additional optional source
* properties.
*/
addPartial(addOptionalProperties: (keyof T)[]): ObjectConverter<Partial<T>, TC>;
}
/**
* Helper to convert an object without changing shape. The source parameter is an object with
* key names that correspond to the target object and the appropriate corresponding converter
* as the property value. If all of the requested fields exist and can be converted, returns a
* new object with the converted values under the original key names. If any fields do not exist
* or cannot be converted, the entire conversion fails.
* Helper function to create a {@link Converters.ObjectConverter | ObjectConverter<T>} which converts an object
* without changing shape, given a {@link Converters.FieldConverters | FieldConverters<T>} and an optional
* {@link Converters.ObjectConverterOptions | ObjectConverterOptions<T>} to further refine conversion beavior.
* @remarks
* By default, if all of the requested fields exist and can be converted, returns {@link Success}
* with a new object that contains the converted values under the original key names. If any requried properties
* do not exist or cannot be converted, the entire conversion fails, returning {@link Failure} with additional
* error information.
*
* Fields that succeed but convert to undefined are omitted from the result object but do not
* fail the conversion.
* @param fields An object containing defining the shape and converters to be applied.
* @param opt An @see ObjectConverterOptions<T> containing options for the object converter, or
* an array of (keyof T) containing optional keys.
* @param properties - An {@link Converters.FieldConverters | FieldConverters<T>} defining the shape of the
* source object and {@link Converter | converters} to be applied to each properties.
* @param options - An {@link Converters.ObjectConverterOptions | ObjectConverterOptions<T>} containing options
* for the object converter.
* @returns A new {@link Converters.ObjectConverter | ObjectConverter} which applies the specified conversions.
* {@label withOptions}
* @public
*/
export declare function object<T>(fields: FieldConverters<T>, opt?: (keyof T)[] | ObjectConverterOptions<T>): ObjectConverter<T>;
export declare function object<T>(properties: FieldConverters<T>, options?: ObjectConverterOptions<T>): ObjectConverter<T>;
/**
* Helper to convert an object without changing shape. The source parameter is an object with
* key names that correspond to the target object and the appropriate corresponding converter
* as the property value. If all of the requested fields exist and can be converted, returns a
* new object with the converted values under the original key names. If any fields do not exist
* or cannot be converted, the entire conversion fails.
* Helper function to create a {@link Converters.ObjectConverter | ObjectConverter<T>} which converts an object
* without changing shape, given a {@link Converters.FieldConverters | FieldConverters<T>} and a set of
* optional properties.
* @remarks
* By default, if all of the requested fields exist and can be converted, returns {@link Success}
* with a new object that contains the converted values under the original key names. If any requried properties
* do not exist or cannot be converted, the entire conversion fails, returning {@link Failure} with additional
* error information.
*
* Fields that succeed but convert to undefined are omitted from the result object but do not
* fail the conversion.
* @param properties - An {@link Converters.FieldConverters | FieldConverters<T>} defining the shape of the
* source object and {@link Converter | converters} to be applied to each properties.
* @param optional - An array of `(keyof T)` listing the keys to be considered optional.
* {@label withKeys}
* @returns A new {@link Converters.ObjectConverter | ObjectConverter} which applies the specified conversions.
* @public
* @deprecated Use {@link Converters.(object:withOptions) | Converters.object(fields, options)} instead.
*/
export declare function object<T>(properties: FieldConverters<T>, optional: (keyof T)[]): ObjectConverter<T>;
/**
* Options for the {@link Converters.(strictObject:withOptions)} helper function.
* @public
*/
export declare type StrictObjectConverterOptions<T> = Omit<ObjectConverterOptions<T>, 'strict'>;
/**
* Helper function to create a {@link Converters.ObjectConverter | ObjectConverter} which converts an object
* without changing shape, a {@link Converters.FieldConverters | FieldConverters<T>} and an optional
* {@link Converters.StrictObjectConverterOptions | StrictObjectConverterOptions<T>} to further refine
* conversion behavior.
*
* @remarks
* Fields that succeed but convert to undefined are omitted from the result object but do not
* fail the conversion.
*
* The conversion fails if any unexpected fields are encountered.
*
* @param fields An object containing defining the shape and converters to be applied.
* @param opt - An @see ObjectConverterOptions<T> containing options for the object converter, or
* an array of (keyof T) containing optional keys.
* @param properties - An object containing defining the shape and converters to be applied.
* @param options - An optional @see StrictObjectConverterOptions<T> containing options for the object converter.
* @returns A new {@link Converters.ObjectConverter | ObjectConverter} which applies the specified conversions.
* {@label withOptions}
* @public
*/
export declare function strictObject<T>(fields: FieldConverters<T>, opt?: (keyof T)[] | Omit<ObjectConverterOptions<T>, 'strict'>): ObjectConverter<T>;
export declare function strictObject<T>(properties: FieldConverters<T>, options?: StrictObjectConverterOptions<T>): ObjectConverter<T>;
/**
* Helper function to create a {@link Converters.ObjectConverter | ObjectConverter} which converts an object
* without changing shape, a {@link Converters.FieldConverters | FieldConverters<T>} and an optional
* {@link Converters.StrictObjectConverterOptions | StrictObjectConverterOptions<T>} to further refine
* conversion behavior.
*
* @remarks
* Fields that succeed but convert to undefined are omitted from the result object but do not
* fail the conversion.
*
* The conversion fails if any unexpected fields are encountered.
*
* @param properties - An object containing defining the shape and converters to be applied.
* @param optional - An array of `keyof T` containing keys to be considered optional.
* @returns A new {@link Converters.ObjectConverter | ObjectConverter} which applies the specified conversions.
* {@label withKeys}
* @deprecated Use {@link Converters.(strictObject:withOptions) | Converters.strictObject(options)} instead.
* @public
*/
export declare function strictObject<T>(properties: FieldConverters<T>, optional: (keyof T)[]): ObjectConverter<T>;
/**
* A string-keyed `Record<string, Converter>` which maps specific {@link Converter | converters} to the
* value of a discriminator property.
* @public
*/
export declare type DiscriminatedObjectConverters<T, TD extends string = string, TC = unknown> = Record<TD, Converter<T, TC>>;
/**
* Helper to convert a discriminated property without changing shape. Takes the name of the
* discriminator property and a string-keyed record of object converters, and invokes the
* converter that corresponds to the value of the discriminator property in the source object.
* Fails if the source is not an object or if the discriminator property is missing or has
* a value not present in the converters.
* @param discriminatorProp Name of the property used to discriminate types
* @param converters String-keyed record of converters to invoke, where key corresponds to a value of the
* discriminator property.
* Helper to create a {@link Converter} whhich converts a discriminated object without changing shape.
* @remarks
* Takes the name of the discriminator property and a
* {@link Converters.DiscriminatedObjectConverters | string-keyed Record of converters}. During conversion,
* the resulting {@link Converter} invokes the converter from `converters` that corresponds to the value of
* the discriminator property in the source object.
*
* If the source is not an object, the discriminator property is missing, or the discriminator has
* a value not present in the converters, conversion fails and returns {@link Failure} with more information.
* @param discriminatorProp - Name of the property used to discriminate types.
* @param converters - {@link Converters.DiscriminatedObjectConverters | String-keyed record of converters} to
* invoke, where each key corresponds to a value of the discriminator property.
* @returns A {@link Converter} which converts the corresponding discriminated object.
* @public
*/
export declare function discriminatedObject<T, TD extends string = string, TC = unknown>(discriminatorProp: string, converters: DiscriminatedObjectConverters<T, TD>): Converter<T, TC>;
/**
* Helper to convert an object to a new object with a different shape. The source parameter is
* an object with key names that correspond to the target object, and an approriate _field_
* converter that will extract and convert a single field from the source object.
* Helper to create a {@link Converter} which converts a source object to a new object with a
* different shape.
*
* If all of the extracted fields exist and can be converted, returns a new object with the
* converted values under the original key names. If any fields to be extracted do not exist
* or cannot be converted, the entire conversion fails.
* @remarks
* On successful conversion, the resulting {@link Converter} returns {@link Success} with a new
* object, which contains the converted values under the key names specified at initialization time.
* It returns {@link Failure} with an error message if any fields to be extracted do not exist
* or cannot be converted.
*

@@ -392,13 +618,25 @@ * Fields that succeed but convert to undefined are omitted from the result object but do not

*
* @param fields An object defining the shape of the target object and the field converters
* to be used to construct it.
* @param properties - An object with key names that correspond to the target object and an
* appropriate {@link Converters.FieldConverters | FieldConverter} which extracts and converts
* a single filed from the source object.
* @returns A {@link Converter} with the specified conversion behavior.
* @public
*/
export declare function transform<T, TC = unknown>(fields: FieldConverters<T, TC>): Converter<T, TC>;
export declare function transform<T, TC = unknown>(properties: FieldConverters<T, TC>): Converter<T, TC>;
/**
* A helper wrapper to convert a range of some other comparable type
* @param converter Converter used to convert min and max extent of the raid
* @param constructor Optional static constructor to instantiate the object
* A helper wrapper to construct a {@link Converter} which converts to an arbitrary strongly-typed
* range of some comparable type.
* @param converter - {@link Converter} used to convert `min` and `max` extent of the range.
* @param constructor - Static constructor to instantiate the object.
* @public
*/
export declare function rangeTypeOf<T, RT extends RangeOf<T>, TC = unknown>(converter: Converter<T, TC>, constructor: (init: RangeOfProperties<T>) => Result<RT>): Converter<RT, TC>;
/**
* A helper wrapper to construct a {@link Converter} which converts to {@link RangeOf | RangeOf<T>}
* where `<T>` is some comparable type.
* @param converter - {@link Converter} used to convert `min` and `max` extent of the range.
* @public
*/
export declare function rangeOf<T, TC = unknown>(converter: Converter<T, TC>): Converter<RangeOf<T>, TC>;
export {};
//# sourceMappingURL=converters.d.ts.map
import { Result } from './result';
/**
* Reads a CSV file from a supplied path.
* @param srcPath - Source path from which the file is read.
* @returns The contents of the file.
* @beta
*/
export declare function readCsvFileSync(srcPath: string): Result<unknown>;
//# sourceMappingURL=csvHelpers.d.ts.map

@@ -25,3 +25,7 @@ "use strict";

if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {

@@ -52,2 +56,8 @@ if (k2 === undefined) k2 = k;

const sync_1 = __importDefault(require("csv-parse/lib/sync"));
/**
* Reads a CSV file from a supplied path.
* @param srcPath - Source path from which the file is read.
* @returns The contents of the file.
* @beta
*/
function readCsvFileSync(srcPath) {

@@ -62,2 +72,2 @@ return (0, result_1.captureResult)(() => {

exports.readCsvFileSync = readCsvFileSync;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2SGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jc3ZIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLHFDQUFpRDtBQUNqRCw4REFBc0M7QUFFdEMsU0FBZ0IsZUFBZSxDQUFDLE9BQWU7SUFDM0MsT0FBTyxJQUFBLHNCQUFhLEVBQUMsR0FBRyxFQUFFO1FBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUQsMkJBQTJCO1FBQzNCLE9BQU8sSUFBQSxjQUFJLEVBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFQRCwwQ0FPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgUmVzdWx0LCBjYXB0dXJlUmVzdWx0IH0gZnJvbSAnLi9yZXN1bHQnO1xuaW1wb3J0IHN5bmMgZnJvbSAnY3N2LXBhcnNlL2xpYi9zeW5jJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDc3ZGaWxlU3luYyhzcmNQYXRoOiBzdHJpbmcpOiBSZXN1bHQ8dW5rbm93bj4ge1xuICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUoc3JjUGF0aCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsICd1dGY4JykudG9TdHJpbmcoKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHJldHVybiBzeW5jKGJvZHksIHsgdHJpbTogdHJ1ZSwgZnJvbV9saW5lOiAyfSk7XG4gICAgfSk7XG59XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2SGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jc3ZIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixxQ0FBaUQ7QUFDakQsOERBQXNDO0FBRXRDOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLE9BQWU7SUFDM0MsT0FBTyxJQUFBLHNCQUFhLEVBQUMsR0FBRyxFQUFFO1FBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUQsMkJBQTJCO1FBQzNCLE9BQU8sSUFBQSxjQUFJLEVBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFQRCwwQ0FPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgUmVzdWx0LCBjYXB0dXJlUmVzdWx0IH0gZnJvbSAnLi9yZXN1bHQnO1xuaW1wb3J0IHN5bmMgZnJvbSAnY3N2LXBhcnNlL2xpYi9zeW5jJztcblxuLyoqXG4gKiBSZWFkcyBhIENTViBmaWxlIGZyb20gYSBzdXBwbGllZCBwYXRoLlxuICogQHBhcmFtIHNyY1BhdGggLSBTb3VyY2UgcGF0aCBmcm9tIHdoaWNoIHRoZSBmaWxlIGlzIHJlYWQuXG4gKiBAcmV0dXJucyBUaGUgY29udGVudHMgb2YgdGhlIGZpbGUuXG4gKiBAYmV0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZENzdkZpbGVTeW5jKHNyY1BhdGg6IHN0cmluZyk6IFJlc3VsdDx1bmtub3duPiB7XG4gICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4ge1xuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShzcmNQYXRoKTtcbiAgICAgICAgY29uc3QgYm9keSA9IGZzLnJlYWRGaWxlU3luYyhmdWxsUGF0aCwgJ3V0ZjgnKS50b1N0cmluZygpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgcmV0dXJuIHN5bmMoYm9keSwgeyB0cmltOiB0cnVlLCBmcm9tX2xpbmU6IDJ9KTtcbiAgICB9KTtcbn1cbiJdfQ==
import { Result } from './result';
/**
* An experimental array template which extend built-in `Array` to include a handful
* of predicates which return {@link Result | Result<T>}.
* @beta
*/
export declare class ExtendedArray<T> extends Array<T> {
readonly itemDescription: string;
/**
* Constructs an {@link ExtendedArray}.
* @param itemDescription - Brief description of the type of each item in this array.
* @param items - The initial contents of the array.
*/
constructor(itemDescription: string, ...items: T[]);
/**
* Type guard to determine if some arbitrary array is an
* {@link ExtendedArray}
* @param a - The `Array` to be tested.
* @returns Returns `true` if `a` is an {@link ExtendedArray},
* `false` otherwise.
*/
static isExtendedArray<T>(a?: T[]): a is ExtendedArray<T>;
/**
* Determines if this array contains exactly one element which matches
* a supplied predicate.
* @param predicate - The predicate function to be applied.
* @returns Returns {@link Success | Success<T>} with the single matching
* result if exactly one item matches `predicate`. Returns {@link Failure}
* with an error message if there are no matches or more than one match.
*/
single(predicate?: (item: T) => boolean): Result<T>;
/**
* Returns the first element of an {@link ExtendedArray}. Fails with an
* error message if the array is empty.
* @param failMessage - Optional message to be displayed in the event of failure.
* @returns Returns {@link Success | Success<T>} with the value of the first element
* in the array, or {@link Failure} with an error message if the array is empty.
*/
first(failMessage?: string): Result<T>;
/**
* Returns an array containing all elements of an {@link ExtendedArray}. Fails with
* an error message if the array is empty.
* @param failMessage - Optional message to be displayed in the event of failure.
* @returns Returns {@link Success | Success<T[]>} with a new (non-extended) `Array`
* containing the elements of this array, or {@link Failure} with an error message
* if the array is empty.
*/
atLeastOne(failMessage?: string): Result<T[]>;
/**
* Gets a new (non-extended) `Array` containing all of the elements from this
* {@link ExtendedArray}.
* @returns A new (non-extended) `Array<T>`.
*/
all(): T[];
}
//# sourceMappingURL=extendedArray.d.ts.map

@@ -26,3 +26,13 @@ "use strict";

const result_1 = require("./result");
/**
* An experimental array template which extend built-in `Array` to include a handful
* of predicates which return {@link Result | Result<T>}.
* @beta
*/
class ExtendedArray extends Array {
/**
* Constructs an {@link ExtendedArray}.
* @param itemDescription - Brief description of the type of each item in this array.
* @param items - The initial contents of the array.
*/
constructor(itemDescription, ...items) {

@@ -32,5 +42,20 @@ super(...items);

}
/**
* Type guard to determine if some arbitrary array is an
* {@link ExtendedArray}
* @param a - The `Array` to be tested.
* @returns Returns `true` if `a` is an {@link ExtendedArray},
* `false` otherwise.
*/
static isExtendedArray(a) {
return a instanceof ExtendedArray;
}
/**
* Determines if this array contains exactly one element which matches
* a supplied predicate.
* @param predicate - The predicate function to be applied.
* @returns Returns {@link Success | Success<T>} with the single matching
* result if exactly one item matches `predicate`. Returns {@link Failure}
* with an error message if there are no matches or more than one match.
*/
single(predicate) {

@@ -46,2 +71,9 @@ const match = (predicate ? this.filter(predicate) : this);

}
/**
* Returns the first element of an {@link ExtendedArray}. Fails with an
* error message if the array is empty.
* @param failMessage - Optional message to be displayed in the event of failure.
* @returns Returns {@link Success | Success<T>} with the value of the first element
* in the array, or {@link Failure} with an error message if the array is empty.
*/
first(failMessage) {

@@ -53,2 +85,10 @@ if (this.length > 0) {

}
/**
* Returns an array containing all elements of an {@link ExtendedArray}. Fails with
* an error message if the array is empty.
* @param failMessage - Optional message to be displayed in the event of failure.
* @returns Returns {@link Success | Success<T[]>} with a new (non-extended) `Array`
* containing the elements of this array, or {@link Failure} with an error message
* if the array is empty.
*/
atLeastOne(failMessage) {

@@ -60,2 +100,7 @@ if (this.length > 0) {

}
/**
* Gets a new (non-extended) `Array` containing all of the elements from this
* {@link ExtendedArray}.
* @returns A new (non-extended) `Array<T>`.
*/
all() {

@@ -66,2 +111,2 @@ return Array.from(this);

exports.ExtendedArray = ExtendedArray;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5kZWRBcnJheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9leHRlbmRlZEFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7OztBQUVILHFDQUFpRDtBQUVqRCxNQUFhLGFBQWlCLFNBQVEsS0FBUTtJQUcxQyxZQUFtQixlQUF1QixFQUFFLEdBQUcsS0FBVTtRQUNyRCxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUMzQyxDQUFDO0lBRU0sTUFBTSxDQUFDLGVBQWUsQ0FBSSxDQUFPO1FBQ3BDLE9BQU8sQ0FBQyxZQUFZLGFBQWEsQ0FBQztJQUN0QyxDQUFDO0lBRU0sTUFBTSxDQUFDLFNBQWdDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3BCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNwQixPQUFPLElBQUEsYUFBSSxFQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsWUFBWSxDQUFDLENBQUM7U0FDcEQ7UUFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsWUFBWSxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU0sS0FBSyxDQUFDLFdBQW9CO1FBQzdCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDakIsT0FBTyxJQUFBLGdCQUFPLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0I7UUFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLFdBQVcsYUFBWCxXQUFXLGNBQVgsV0FBVyxHQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsWUFBWSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVNLFVBQVUsQ0FBQyxXQUFvQjtRQUNsQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNwQztRQUNELE9BQU8sSUFBQSxhQUFJLEVBQUMsV0FBVyxhQUFYLFdBQVcsY0FBWCxXQUFXLEdBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxZQUFZLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRU0sR0FBRztRQUNOLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0o7QUF4Q0Qsc0NBd0NDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcclxuICogU09GVFdBUkUuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgUmVzdWx0LCBmYWlsLCBzdWNjZWVkIH0gZnJvbSAnLi9yZXN1bHQnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEV4dGVuZGVkQXJyYXk8VD4gZXh0ZW5kcyBBcnJheTxUPiB7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXRlbURlc2NyaXB0aW9uOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGl0ZW1EZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5pdGVtczogVFtdKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uaXRlbXMpO1xyXG4gICAgICAgIHRoaXMuaXRlbURlc2NyaXB0aW9uID0gaXRlbURlc2NyaXB0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNFeHRlbmRlZEFycmF5PFQ+KGE/OiBUW10pOiBhIGlzIEV4dGVuZGVkQXJyYXk8VD4ge1xyXG4gICAgICAgIHJldHVybiBhIGluc3RhbmNlb2YgRXh0ZW5kZWRBcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2luZ2xlKHByZWRpY2F0ZT86IChpdGVtOiBUKSA9PiBib29sZWFuKTogUmVzdWx0PFQ+IHtcclxuICAgICAgICBjb25zdCBtYXRjaCA9IChwcmVkaWNhdGUgPyB0aGlzLmZpbHRlcihwcmVkaWNhdGUpIDogdGhpcyk7XHJcbiAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChtYXRjaFswXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXRjaC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7dGhpcy5pdGVtRGVzY3JpcHRpb259IG5vdCBmb3VuZGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFpbChgJHt0aGlzLml0ZW1EZXNjcmlwdGlvbn0gbWF0Y2hlcyAke21hdGNoLmxlbmd0aH0gaXRlbXNgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmlyc3QoZmFpbE1lc3NhZ2U/OiBzdHJpbmcpOiBSZXN1bHQ8VD4ge1xyXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQodGhpc1swXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWlsKGZhaWxNZXNzYWdlID8/IGAke3RoaXMuaXRlbURlc2NyaXB0aW9ufSBub3QgZm91bmRgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXRMZWFzdE9uZShmYWlsTWVzc2FnZT86IHN0cmluZyk6IFJlc3VsdDxUW10+IHtcclxuICAgICAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKEFycmF5LmZyb20odGhpcykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFpbChmYWlsTWVzc2FnZSA/PyBgJHt0aGlzLml0ZW1EZXNjcmlwdGlvbn0gbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFsbCgpOiBUW10ge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5kZWRBcnJheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9leHRlbmRlZEFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7OztBQUVILHFDQUFpRDtBQUVqRDs7OztHQUlHO0FBQ0gsTUFBYSxhQUFpQixTQUFRLEtBQVE7SUFHMUM7Ozs7T0FJRztJQUNILFlBQW1CLGVBQXVCLEVBQUUsR0FBRyxLQUFVO1FBQ3JELEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsZUFBZSxDQUFJLENBQU87UUFDcEMsT0FBTyxDQUFDLFlBQVksYUFBYSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLFNBQWdDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3BCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNwQixPQUFPLElBQUEsYUFBSSxFQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsWUFBWSxDQUFDLENBQUM7U0FDcEQ7UUFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsWUFBWSxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLFdBQW9CO1FBQzdCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDakIsT0FBTyxJQUFBLGdCQUFPLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0I7UUFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLFdBQVcsYUFBWCxXQUFXLGNBQVgsV0FBVyxHQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsWUFBWSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxVQUFVLENBQUMsV0FBb0I7UUFDbEMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNqQixPQUFPLElBQUEsZ0JBQU8sRUFBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDcEM7UUFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLFdBQVcsYUFBWCxXQUFXLGNBQVgsV0FBVyxHQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsWUFBWSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxHQUFHO1FBQ04sT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDSjtBQWhGRCxzQ0FnRkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXHJcbiAqXHJcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcclxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxyXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXHJcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcclxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXHJcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAqXHJcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxyXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4gKlxyXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxyXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcclxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxyXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxyXG4gKiBTT0ZUV0FSRS5cclxuICovXHJcblxyXG5pbXBvcnQgeyBSZXN1bHQsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XHJcblxyXG4vKipcclxuICogQW4gZXhwZXJpbWVudGFsIGFycmF5IHRlbXBsYXRlIHdoaWNoIGV4dGVuZCBidWlsdC1pbiBgQXJyYXlgIHRvIGluY2x1ZGUgYSBoYW5kZnVsXHJcbiAqIG9mIHByZWRpY2F0ZXMgd2hpY2ggcmV0dXJuIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VD59LlxyXG4gKiBAYmV0YVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEV4dGVuZGVkQXJyYXk8VD4gZXh0ZW5kcyBBcnJheTxUPiB7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXRlbURlc2NyaXB0aW9uOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RzIGFuIHtAbGluayBFeHRlbmRlZEFycmF5fS5cclxuICAgICAqIEBwYXJhbSBpdGVtRGVzY3JpcHRpb24gLSBCcmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiBlYWNoIGl0ZW0gaW4gdGhpcyBhcnJheS5cclxuICAgICAqIEBwYXJhbSBpdGVtcyAtIFRoZSBpbml0aWFsIGNvbnRlbnRzIG9mIHRoZSBhcnJheS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGl0ZW1EZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5pdGVtczogVFtdKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uaXRlbXMpO1xyXG4gICAgICAgIHRoaXMuaXRlbURlc2NyaXB0aW9uID0gaXRlbURlc2NyaXB0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHlwZSBndWFyZCB0byBkZXRlcm1pbmUgaWYgc29tZSBhcmJpdHJhcnkgYXJyYXkgaXMgYW5cclxuICAgICAqIHtAbGluayBFeHRlbmRlZEFycmF5fVxyXG4gICAgICogQHBhcmFtIGEgLSBUaGUgYEFycmF5YCB0byBiZSB0ZXN0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyBSZXR1cm5zIGB0cnVlYCBpZiBgYWAgaXMgYW4ge0BsaW5rIEV4dGVuZGVkQXJyYXl9LFxyXG4gICAgICogYGZhbHNlYCBvdGhlcndpc2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaXNFeHRlbmRlZEFycmF5PFQ+KGE/OiBUW10pOiBhIGlzIEV4dGVuZGVkQXJyYXk8VD4ge1xyXG4gICAgICAgIHJldHVybiBhIGluc3RhbmNlb2YgRXh0ZW5kZWRBcnJheTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZXMgaWYgdGhpcyBhcnJheSBjb250YWlucyBleGFjdGx5IG9uZSBlbGVtZW50IHdoaWNoIG1hdGNoZXNcclxuICAgICAqIGEgc3VwcGxpZWQgcHJlZGljYXRlLlxyXG4gICAgICogQHBhcmFtIHByZWRpY2F0ZSAtIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdG8gYmUgYXBwbGllZC5cclxuICAgICAqIEByZXR1cm5zIFJldHVybnMge0BsaW5rIFN1Y2Nlc3MgfCBTdWNjZXNzPFQ+fSB3aXRoIHRoZSBzaW5nbGUgbWF0Y2hpbmdcclxuICAgICAqIHJlc3VsdCBpZiBleGFjdGx5IG9uZSBpdGVtIG1hdGNoZXMgYHByZWRpY2F0ZWAuICBSZXR1cm5zIHtAbGluayBGYWlsdXJlfVxyXG4gICAgICogd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZXJlIGFyZSBubyBtYXRjaGVzIG9yIG1vcmUgdGhhbiBvbmUgbWF0Y2guXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaW5nbGUocHJlZGljYXRlPzogKGl0ZW06IFQpID0+IGJvb2xlYW4pOiBSZXN1bHQ8VD4ge1xyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gKHByZWRpY2F0ZSA/IHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkgOiB0aGlzKTtcclxuICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKG1hdGNoWzBdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFpbChgJHt0aGlzLml0ZW1EZXNjcmlwdGlvbn0gbm90IGZvdW5kYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWlsKGAke3RoaXMuaXRlbURlc2NyaXB0aW9ufSBtYXRjaGVzICR7bWF0Y2gubGVuZ3RofSBpdGVtc2ApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhbiB7QGxpbmsgRXh0ZW5kZWRBcnJheX0uIEZhaWxzIHdpdGggYW5cclxuICAgICAqIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGFycmF5IGlzIGVtcHR5LlxyXG4gICAgICogQHBhcmFtIGZhaWxNZXNzYWdlIC0gT3B0aW9uYWwgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGV2ZW50IG9mIGZhaWx1cmUuXHJcbiAgICAgKiBAcmV0dXJucyBSZXR1cm5zIHtAbGluayBTdWNjZXNzIHwgU3VjY2VzczxUPn0gd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnRcclxuICAgICAqIGluIHRoZSBhcnJheSwgb3Ige0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgYXJyYXkgaXMgZW1wdHkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaXJzdChmYWlsTWVzc2FnZT86IHN0cmluZyk6IFJlc3VsdDxUPiB7XHJcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh0aGlzWzBdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhaWwoZmFpbE1lc3NhZ2UgPz8gYCR7dGhpcy5pdGVtRGVzY3JpcHRpb259IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCBlbGVtZW50cyBvZiBhbiB7QGxpbmsgRXh0ZW5kZWRBcnJheX0uIEZhaWxzIHdpdGhcclxuICAgICAqIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGFycmF5IGlzIGVtcHR5LlxyXG4gICAgICogQHBhcmFtIGZhaWxNZXNzYWdlIC0gT3B0aW9uYWwgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGV2ZW50IG9mIGZhaWx1cmUuXHJcbiAgICAgKiBAcmV0dXJucyBSZXR1cm5zIHtAbGluayBTdWNjZXNzIHwgU3VjY2VzczxUW10+fSB3aXRoIGEgbmV3IChub24tZXh0ZW5kZWQpIGBBcnJheWBcclxuICAgICAqIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoaXMgYXJyYXksIG9yIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGVycm9yIG1lc3NhZ2VcclxuICAgICAqIGlmIHRoZSBhcnJheSBpcyBlbXB0eS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGF0TGVhc3RPbmUoZmFpbE1lc3NhZ2U/OiBzdHJpbmcpOiBSZXN1bHQ8VFtdPiB7XHJcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChBcnJheS5mcm9tKHRoaXMpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhaWwoZmFpbE1lc3NhZ2UgPz8gYCR7dGhpcy5pdGVtRGVzY3JpcHRpb259IG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhIG5ldyAobm9uLWV4dGVuZGVkKSBgQXJyYXlgIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXNcclxuICAgICAqIHtAbGluayBFeHRlbmRlZEFycmF5fS5cclxuICAgICAqIEByZXR1cm5zIEEgbmV3IChub24tZXh0ZW5kZWQpIGBBcnJheTxUPmAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhbGwoKTogVFtdIHtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzKTtcclxuICAgIH1cclxufVxyXG4iXX0=
import { Result } from './result';
/**
* Destination format for some formatted string.
* @beta
*/
export declare type FormatTargets = 'text' | 'markdown' | 'embed';
/**
* Interface for an object that can be formatted.
* @beta
*/
export interface Formattable {
/**
* Formats an object using the supplied mustache template.
* @param format - A mustache template used to format the object.
* @returns {@link Success} with the resulting string, or {@link Failure}
* with an error message if an error occurs.
*/
format(format: string): Result<string>;
}
/**
* Base class which adds common formatting.
* @beta
*/
export declare class FormattableBase {
/**
* Helper enables derived classes to add named details to a formatted presentation.
* @param details - An array of detail description strings.
* @param label - Label to use for the new detail.
* @param value - Value to use for the new detail.
* @internal
*/
protected static _tryAddDetail(details: string[], label: string, value: string | undefined): void;
/**
* {@inheritdoc Formattable.format}
*/
format(template: string): Result<string>;
}
/**
* Type definition for a formatting function, which takes a `string` and an
* item and returns {@link Result | Result<string>}.
* @beta
*/
export declare type Formatter<T> = (format: string, item: T) => Result<string>;
/**
* A collection of {@link Formatter | formatters} indexed by target name, to enable
* different format methods per output target.
* @beta
*/
export declare type FormattersByExtendedTarget<TFT extends FormatTargets, T> = Record<TFT, Formatter<T>>;
/**
* A collection of {@link Formatter | formatters} indexed by the {@link FormatTargets | default supported
* target formats}.
* @beta
*/
export declare type FormattersByTarget<T> = FormattersByExtendedTarget<FormatTargets, T>;
/**
* Formats a list of items using the supplied template and formatter, one result
* per output line.
* @param format - A mustache template used to format each item.
* @param items - The items to be formatted.
* @param itemFormatter - The {@link Formatter | Formatter<T>} used to format each item.
* @returns The resulting string.
* @beta
*/
export declare function formatList<T>(format: string, items: T[], itemFormatter: Formatter<T>): Result<string>;
//# sourceMappingURL=formatter.d.ts.map

@@ -31,3 +31,14 @@ "use strict";

mustache_1.default.escape = (s) => s;
/**
* Base class which adds common formatting.
* @beta
*/
class FormattableBase {
/**
* Helper enables derived classes to add named details to a formatted presentation.
* @param details - An array of detail description strings.
* @param label - Label to use for the new detail.
* @param value - Value to use for the new detail.
* @internal
*/
static _tryAddDetail(details, label, value) {

@@ -39,2 +50,5 @@ if (value !== undefined) {

}
/**
* {@inheritdoc Formattable.format}
*/
format(template) {

@@ -45,2 +59,11 @@ return (0, result_1.captureResult)(() => mustache_1.default.render(template, this));

exports.FormattableBase = FormattableBase;
/**
* Formats a list of items using the supplied template and formatter, one result
* per output line.
* @param format - A mustache template used to format each item.
* @param items - The items to be formatted.
* @param itemFormatter - The {@link Formatter | Formatter<T>} used to format each item.
* @returns The resulting string.
* @beta
*/
function formatList(format, items, itemFormatter) {

@@ -55,2 +78,2 @@ return (0, result_1.mapResults)(items.map((item) => {

exports.formatList = formatList;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Zvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7Ozs7QUFFSCxxQ0FBc0U7QUFDdEUsd0RBQWdDO0FBRWhDLGtCQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFRbkMsTUFBYSxlQUFlO0lBQ2QsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFpQixFQUFFLEtBQWEsRUFBRSxLQUF1QjtRQUNwRixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDckIsTUFBTSxNQUFNLEdBQUcsS0FBSyxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFTSxNQUFNLENBQUMsUUFBZ0I7UUFDMUIsT0FBTyxJQUFBLHNCQUFhLEVBQUMsR0FBRyxFQUFFLENBQUMsa0JBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztDQUNKO0FBWEQsMENBV0M7QUFNRCxTQUFnQixVQUFVLENBQUksTUFBYyxFQUFFLEtBQVUsRUFBRSxhQUEyQjtJQUNqRixPQUFPLElBQUEsbUJBQVUsRUFBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDakMsT0FBTyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBaUIsRUFBRSxFQUFFO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsT0FBTyxJQUFBLGdCQUFPLEVBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQVBELGdDQU9DIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7IFJlc3VsdCwgY2FwdHVyZVJlc3VsdCwgbWFwUmVzdWx0cywgc3VjY2VlZCB9IGZyb20gJy4vcmVzdWx0JztcbmltcG9ydCBNdXN0YWNoZSBmcm9tICdtdXN0YWNoZSc7XG5cbk11c3RhY2hlLmVzY2FwZSA9IChzOiBzdHJpbmcpID0+IHM7XG5cbmV4cG9ydCB0eXBlIEZvcm1hdFRhcmdldHMgPSAndGV4dCd8J21hcmtkb3duJ3wnZW1iZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRhYmxlIHtcbiAgICBmb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiBSZXN1bHQ8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGNsYXNzIEZvcm1hdHRhYmxlQmFzZSB7XG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfdHJ5QWRkRGV0YWlsKGRldGFpbHM6IHN0cmluZ1tdLCBsYWJlbDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nfHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcGFkZGVkID0gYCAgJHtsYWJlbH06YC5wYWRFbmQoMjAsICcgJyk7XG4gICAgICAgICAgICBkZXRhaWxzLnB1c2goYCR7cGFkZGVkfSAke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGZvcm1hdCh0ZW1wbGF0ZTogc3RyaW5nKTogUmVzdWx0PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBNdXN0YWNoZS5yZW5kZXIodGVtcGxhdGUsIHRoaXMpKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEZvcm1hdHRlcjxUPiA9IChmb3JtYXQ6IHN0cmluZywgaXRlbTogVCkgPT4gUmVzdWx0PHN0cmluZz47XG5leHBvcnQgdHlwZSBGb3JtYXR0ZXJzQnlFeHRlbmRlZFRhcmdldDxURlQgZXh0ZW5kcyBGb3JtYXRUYXJnZXRzLCBUPiA9IFJlY29yZDxURlQsIEZvcm1hdHRlcjxUPj47XG5leHBvcnQgdHlwZSBGb3JtYXR0ZXJzQnlUYXJnZXQ8VD4gPSBGb3JtYXR0ZXJzQnlFeHRlbmRlZFRhcmdldDxGb3JtYXRUYXJnZXRzLCBUPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdExpc3Q8VD4oZm9ybWF0OiBzdHJpbmcsIGl0ZW1zOiBUW10sIGl0ZW1Gb3JtYXR0ZXI6IEZvcm1hdHRlcjxUPik6IFJlc3VsdDxzdHJpbmc+IHtcbiAgICByZXR1cm4gbWFwUmVzdWx0cyhpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW1Gb3JtYXR0ZXIoZm9ybWF0LCBpdGVtKTtcbiAgICB9KSkub25TdWNjZXNzKChyZXN1bHRzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IHJlc3VsdHMuZmlsdGVyKChzKSA9PiAocyAhPT0gJycpKTtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZmlsdGVyZWQuam9pbignXFxuJykpO1xuICAgIH0pO1xufVxuXG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Zvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7Ozs7QUFFSCxxQ0FBc0U7QUFDdEUsd0RBQWdDO0FBRWhDLGtCQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFzQm5DOzs7R0FHRztBQUNILE1BQWEsZUFBZTtJQUN4Qjs7Ozs7O09BTUc7SUFDTyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQWlCLEVBQUUsS0FBYSxFQUFFLEtBQXVCO1FBQ3BGLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUNyQixNQUFNLE1BQU0sR0FBRyxLQUFLLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0MsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3RDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFFBQWdCO1FBQzFCLE9BQU8sSUFBQSxzQkFBYSxFQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7Q0FDSjtBQXJCRCwwQ0FxQkM7QUFzQkQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixVQUFVLENBQUksTUFBYyxFQUFFLEtBQVUsRUFBRSxhQUEyQjtJQUNqRixPQUFPLElBQUEsbUJBQVUsRUFBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDakMsT0FBTyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBaUIsRUFBRSxFQUFFO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsT0FBTyxJQUFBLGdCQUFPLEVBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQVBELGdDQU9DIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7IFJlc3VsdCwgY2FwdHVyZVJlc3VsdCwgbWFwUmVzdWx0cywgc3VjY2VlZCB9IGZyb20gJy4vcmVzdWx0JztcbmltcG9ydCBNdXN0YWNoZSBmcm9tICdtdXN0YWNoZSc7XG5cbk11c3RhY2hlLmVzY2FwZSA9IChzOiBzdHJpbmcpID0+IHM7XG5cbi8qKlxuICogRGVzdGluYXRpb24gZm9ybWF0IGZvciBzb21lIGZvcm1hdHRlZCBzdHJpbmcuXG4gKiBAYmV0YVxuICovXG5leHBvcnQgdHlwZSBGb3JtYXRUYXJnZXRzID0gJ3RleHQnfCdtYXJrZG93bid8J2VtYmVkJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGFuIG9iamVjdCB0aGF0IGNhbiBiZSBmb3JtYXR0ZWQuXG4gKiBAYmV0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRhYmxlIHtcbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIGFuIG9iamVjdCB1c2luZyB0aGUgc3VwcGxpZWQgbXVzdGFjaGUgdGVtcGxhdGUuXG4gICAgICogQHBhcmFtIGZvcm1hdCAtIEEgbXVzdGFjaGUgdGVtcGxhdGUgdXNlZCB0byBmb3JtYXQgdGhlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgcmVzdWx0aW5nIHN0cmluZywgb3Ige0BsaW5rIEZhaWx1cmV9XG4gICAgICogd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cbiAgICAgKi9cbiAgICBmb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiBSZXN1bHQ8c3RyaW5nPjtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIHdoaWNoIGFkZHMgY29tbW9uIGZvcm1hdHRpbmcuXG4gKiBAYmV0YVxuICovXG5leHBvcnQgY2xhc3MgRm9ybWF0dGFibGVCYXNlIHtcbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZW5hYmxlcyBkZXJpdmVkIGNsYXNzZXMgdG8gYWRkIG5hbWVkIGRldGFpbHMgdG8gYSBmb3JtYXR0ZWQgcHJlc2VudGF0aW9uLlxuICAgICAqIEBwYXJhbSBkZXRhaWxzIC0gQW4gYXJyYXkgb2YgZGV0YWlsIGRlc2NyaXB0aW9uIHN0cmluZ3MuXG4gICAgICogQHBhcmFtIGxhYmVsIC0gTGFiZWwgdG8gdXNlIGZvciB0aGUgbmV3IGRldGFpbC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB1c2UgZm9yIHRoZSBuZXcgZGV0YWlsLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX3RyeUFkZERldGFpbChkZXRhaWxzOiBzdHJpbmdbXSwgbGFiZWw6IHN0cmluZywgdmFsdWU6IHN0cmluZ3x1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZGRlZCA9IGAgICR7bGFiZWx9OmAucGFkRW5kKDIwLCAnICcpO1xuICAgICAgICAgICAgZGV0YWlscy5wdXNoKGAke3BhZGRlZH0gJHt2YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBGb3JtYXR0YWJsZS5mb3JtYXR9XG4gICAgICovXG4gICAgcHVibGljIGZvcm1hdCh0ZW1wbGF0ZTogc3RyaW5nKTogUmVzdWx0PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBNdXN0YWNoZS5yZW5kZXIodGVtcGxhdGUsIHRoaXMpKTtcbiAgICB9XG59XG5cbi8qKlxuICogVHlwZSBkZWZpbml0aW9uIGZvciBhIGZvcm1hdHRpbmcgZnVuY3Rpb24sIHdoaWNoIHRha2VzIGEgYHN0cmluZ2AgYW5kIGFuXG4gKiBpdGVtIGFuZCByZXR1cm5zIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8c3RyaW5nPn0uXG4gKiBAYmV0YVxuICovXG5leHBvcnQgdHlwZSBGb3JtYXR0ZXI8VD4gPSAoZm9ybWF0OiBzdHJpbmcsIGl0ZW06IFQpID0+IFJlc3VsdDxzdHJpbmc+O1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRm9ybWF0dGVyIHwgZm9ybWF0dGVyc30gaW5kZXhlZCBieSB0YXJnZXQgbmFtZSwgdG8gZW5hYmxlXG4gKiBkaWZmZXJlbnQgZm9ybWF0IG1ldGhvZHMgcGVyIG91dHB1dCB0YXJnZXQuXG4gKiBAYmV0YVxuICovXG5leHBvcnQgdHlwZSBGb3JtYXR0ZXJzQnlFeHRlbmRlZFRhcmdldDxURlQgZXh0ZW5kcyBGb3JtYXRUYXJnZXRzLCBUPiA9IFJlY29yZDxURlQsIEZvcm1hdHRlcjxUPj47XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRm9ybWF0dGVyIHwgZm9ybWF0dGVyc30gaW5kZXhlZCBieSB0aGUge0BsaW5rIEZvcm1hdFRhcmdldHMgfCBkZWZhdWx0IHN1cHBvcnRlZFxuICogdGFyZ2V0IGZvcm1hdHN9LlxuICogQGJldGFcbiAqL1xuZXhwb3J0IHR5cGUgRm9ybWF0dGVyc0J5VGFyZ2V0PFQ+ID0gRm9ybWF0dGVyc0J5RXh0ZW5kZWRUYXJnZXQ8Rm9ybWF0VGFyZ2V0cywgVD47XG5cbi8qKlxuICogRm9ybWF0cyBhIGxpc3Qgb2YgaXRlbXMgdXNpbmcgdGhlIHN1cHBsaWVkIHRlbXBsYXRlIGFuZCBmb3JtYXR0ZXIsIG9uZSByZXN1bHRcbiAqIHBlciBvdXRwdXQgbGluZS5cbiAqIEBwYXJhbSBmb3JtYXQgLSBBIG11c3RhY2hlIHRlbXBsYXRlIHVzZWQgdG8gZm9ybWF0IGVhY2ggaXRlbS5cbiAqIEBwYXJhbSBpdGVtcyAtIFRoZSBpdGVtcyB0byBiZSBmb3JtYXR0ZWQuXG4gKiBAcGFyYW0gaXRlbUZvcm1hdHRlciAtIFRoZSB7QGxpbmsgRm9ybWF0dGVyIHwgRm9ybWF0dGVyPFQ+fSB1c2VkIHRvIGZvcm1hdCBlYWNoIGl0ZW0uXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0aW5nIHN0cmluZy5cbiAqIEBiZXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRMaXN0PFQ+KGZvcm1hdDogc3RyaW5nLCBpdGVtczogVFtdLCBpdGVtRm9ybWF0dGVyOiBGb3JtYXR0ZXI8VD4pOiBSZXN1bHQ8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG1hcFJlc3VsdHMoaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtRm9ybWF0dGVyKGZvcm1hdCwgaXRlbSk7XG4gICAgfSkpLm9uU3VjY2VzcygocmVzdWx0czogc3RyaW5nW10pID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSByZXN1bHRzLmZpbHRlcigocykgPT4gKHMgIT09ICcnKSk7XG4gICAgICAgIHJldHVybiBzdWNjZWVkKGZpbHRlcmVkLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuIl19
import { Result } from './result';
/**
* Computes an md5 hash from an array of strings. Not secure and not intended to be secure.
* @param parts The strings to be hashed
* @param parts - The strings to be hashed
* @returns An md5 hash of the parts
* @public
*/
export declare function computeHash(parts: string[]): string;
/**
* Computes a normalized hash for an arbitrary javascript value.
* @public
*/
export declare class Normalizer {

@@ -16,9 +21,32 @@ /**

*
* @param from The arbitrary unknown to be hashed
* @returns An md5 hash
* @param from - The arbitrary `unknown` to be hashed.
* @returns A normalized md5 hash for the supplied value.
*/
computeHash(from: unknown): Result<string>;
/**
* Compares two property names from some object being normalized.
* @param k1 - First key to be compared.
* @param k2 - Second key to be compared.
* @returns `1` if `k1` is greater, `-1` if `k2` is greater and
* `0` if they are equal.
* @internal
*/
protected _compareKeys(k1: unknown, k2: unknown): number;
/**
* Normalizes an array of object property entries (e.g. as returned by `Object.entries()`).
* @remarks
* Converts property names (entry key) to string and then sorts as string.
* @param entries - The entries to be normalized.
* @returns A normalized sorted array of entries.
* @internal
*/
protected _normalizeEntries(entries: Iterable<[unknown, unknown]>): [unknown, unknown][];
/**
* Constructs a normalized string representation of some literal value.
* @param from - The literal value to be normalized.
* @returns A normalized string representation of the literal.
* @internal
*/
protected _normalizeLiteral(from: string | number | bigint | boolean | symbol | undefined | Date | RegExp | null): Result<string>;
}
//# sourceMappingURL=hash.d.ts.map

@@ -25,3 +25,7 @@ "use strict";

if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {

@@ -49,4 +53,5 @@ if (k2 === undefined) k2 = k;

* Computes an md5 hash from an array of strings. Not secure and not intended to be secure.
* @param parts The strings to be hashed
* @param parts - The strings to be hashed
* @returns An md5 hash of the parts
* @public
*/

@@ -57,2 +62,6 @@ function computeHash(parts) {

exports.computeHash = computeHash;
/**
* Computes a normalized hash for an arbitrary javascript value.
* @public
*/
class Normalizer {

@@ -66,4 +75,4 @@ /**

*
* @param from The arbitrary unknown to be hashed
* @returns An md5 hash
* @param from - The arbitrary `unknown` to be hashed.
* @returns A normalized md5 hash for the supplied value.
*/

@@ -99,2 +108,10 @@ computeHash(from) {

}
/**
* Compares two property names from some object being normalized.
* @param k1 - First key to be compared.
* @param k2 - Second key to be compared.
* @returns `1` if `k1` is greater, `-1` if `k2` is greater and
* `0` if they are equal.
* @internal
*/
_compareKeys(k1, k2) {

@@ -113,5 +130,19 @@ const cs1 = String(k1);

}
/**
* Normalizes an array of object property entries (e.g. as returned by `Object.entries()`).
* @remarks
* Converts property names (entry key) to string and then sorts as string.
* @param entries - The entries to be normalized.
* @returns A normalized sorted array of entries.
* @internal
*/
_normalizeEntries(entries) {
return Array.from(entries).sort((e1, e2) => this._compareKeys(e1[0], e2[0]));
}
/**
* Constructs a normalized string representation of some literal value.
* @param from - The literal value to be normalized.
* @returns A normalized string representation of the literal.
* @internal
*/
_normalizeLiteral(from) {

@@ -143,2 +174,2 @@ switch (typeof from) {

exports.Normalizer = Normalizer;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oYXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCwrQ0FBaUM7QUFDakMscUNBQTRFO0FBRTVFOzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQUMsS0FBZTtJQUN2QyxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xGLENBQUM7QUFGRCxrQ0FFQztBQUVELE1BQWEsVUFBVTtJQUNuQjs7Ozs7Ozs7O09BU0c7SUFDSSxXQUFXLENBQUMsSUFBYTtRQUM1QixRQUFRLE9BQU8sSUFBSSxFQUFFO1lBQ2pCLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFdBQVc7Z0JBQ1osT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ2hELE9BQU8sSUFBQSxzQkFBYSxFQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakQsQ0FBQyxDQUFDLENBQUM7WUFDUCxLQUFLLFFBQVE7Z0JBQ1QsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxNQUFNLENBQUMsRUFBRTtvQkFDdkUsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFB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SSxZQUFZLE1BQU0sRUFBRTtZQUN4QixPQUFPLElBQUEsZ0JBQU8sRUFBQyxhQUFhLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDckQ7UUFDRCx1QkFBdUI7UUFDdkIsT0FBTyxJQUFBLGFBQUksRUFBQyxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQztDQUNKO0FBcEZELGdDQW9GQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IFJlc3VsdCwgY2FwdHVyZVJlc3VsdCwgZmFpbCwgbWFwUmVzdWx0cywgc3VjY2VlZCB9IGZyb20gJy4vcmVzdWx0JztcblxuLyoqXG4gKiBDb21wdXRlcyBhbiBtZDUgaGFzaCBmcm9tIGFuIGFycmF5IG9mIHN0cmluZ3MuIE5vdCBzZWN1cmUgYW5kIG5vdCBpbnRlbmRlZCB0byBiZSBzZWN1cmUuXG4gKiBAcGFyYW0gcGFydHMgVGhlIHN0cmluZ3MgdG8gYmUgaGFzaGVkXG4gKiBAcmV0dXJucyBBbiBtZDUgaGFzaCBvZiB0aGUgcGFydHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVIYXNoKHBhcnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUocGFydHMuam9pbignfCcpLCAndXRmOCcpLmRpZ2VzdCgnaGV4Jyk7XG59XG5cbmV4cG9ydCBjbGFzcyBOb3JtYWxpemVyIHtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBhIG5vcm1hbGl6ZWQgbWQ1IGhhc2ggZnJvbSBhbiBhcmJpdHJhcnkgc3VwcGxpZWQgb2JqZWN0LiAgTm90IHNlY3VyZSBhbmQgbm90XG4gICAgICogaW50ZW5kZWQgdG8gYmUgc2VjdXJlLiAgQWxzbyBub3QgZmFzdCBhbmQgbm90IGludGVuZGVkIHRvIGJlIGZhc3QuXG4gICAgICpcbiAgICAgKiBOb3JtYWxpemF0aW9uIGp1c3Qgc29ydHMgTWFwcywgU2V0cyBhbmQgb2JqZWN0IGtleXMgYnkgaGFzaCBzbyB0aGF0IGRpZmZlcmVuY2VzIGluIG9yZGVyXG4gICAgICogZG8gbm90IGFmZmVjdCB0aGUgaGFzaC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSBhcmJpdHJhcnkgdW5rbm93biB0byBiZSBoYXNoZWRcbiAgICAgKiBAcmV0dXJucyBBbiBtZDUgaGFzaFxuICAgICAqL1xuICAgIHB1YmxpYyBjb21wdXRlSGFzaChmcm9tOiB1bmtub3duKTogUmVzdWx0PHN0cmluZz4ge1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBmcm9tKSB7XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3JtYWxpemVMaXRlcmFsKGZyb20pLm9uU3VjY2VzcygodikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBjb21wdXRlSGFzaChbdl0pKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgaWYgKChmcm9tID09PSBudWxsKSB8fCAoZnJvbSBpbnN0YW5jZW9mIERhdGUpIHx8IChmcm9tIGluc3RhbmNlb2YgUmVnRXhwKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbm9ybWFsaXplTGl0ZXJhbChmcm9tKS5vblN1Y2Nlc3MoKHYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IGNvbXB1dGVIYXNoKFt2XSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwUmVzdWx0cyhmcm9tLm1hcCgoZSkgPT4gdGhpcy5jb21wdXRlSGFzaChlKSkpLm9uU3VjY2VzcygoYSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gY29tcHV0ZUhhc2goYSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoKGZyb20gaW5zdGFuY2VvZiBNYXApIHx8IChmcm9tIGluc3RhbmNlb2YgU2V0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlSGFzaCh0aGlzLl9ub3JtYWxpemVFbnRyaWVzKGZyb20uZW50cmllcygpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVIYXNoKHRoaXMuX25vcm1hbGl6ZUVudHJpZXMoT2JqZWN0LmVudHJpZXMoZnJvbSkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgY29tcHV0ZUhhc2g6IFVuZXhwZWN0ZWQgdHlwZSAtIGNhbm5vdCBoYXNoICcke3R5cGVvZiBmcm9tfSdgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2NvbXBhcmVLZXlzKGsxOiB1bmtub3duLCBrMjogdW5rbm93bik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGNzMSA9IFN0cmluZyhrMSk7XG4gICAgICAgIGNvbnN0IGNzMiA9IFN0cmluZyhrMik7XG4gICAgICAgIGlmIChjczEgPiBjczIpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG4gICAgICAgIGlmIChjczIgPiBjczEpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbm9ybWFsaXplRW50cmllcyhlbnRyaWVzOiBJdGVyYWJsZTxbdW5rbm93biwgdW5rbm93bl0+KTogW3Vua25vd24sIHVua25vd25dW10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlbnRyaWVzKS5zb3J0KChlMSwgZTIpID0+IHRoaXMuX2NvbXBhcmVLZXlzKGUxWzBdLCBlMlswXSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbm9ybWFsaXplTGl0ZXJhbChmcm9tOiBzdHJpbmd8bnVtYmVyfGJpZ2ludHxib29sZWFufHN5bWJvbHx1bmRlZmluZWR8RGF0ZXxSZWdFeHB8bnVsbCk6IFJlc3VsdDxzdHJpbmc+IHtcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgZnJvbSkge1xuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tKTtcbiAgICAgICAgICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZChgJHt0eXBlb2YgZnJvbX06W1tbJHtTdHJpbmcoZnJvbSl9XV1dYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZyb20gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKCdvYmplY3Q6W1tbbnVsbF1dJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZyb20gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChgRGF0ZTpbW1ske1N0cmluZyhmcm9tLnZhbHVlT2YoKSl9XV1dYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICAgICAgaWYgKGZyb20gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGBSZWdFeHA6W1tbJHtmcm9tLnRvU3RyaW5nKCl9XV1dYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgcmV0dXJuIGZhaWwoYGNhbm5vdCBub3JtYWxpemUgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9XG59XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oYXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsK0NBQWlDO0FBQ2pDLHFDQUE0RTtBQUU1RTs7Ozs7R0FLRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxLQUFlO0lBQ3ZDLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbEYsQ0FBQztBQUZELGtDQUVDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBYSxVQUFVO0lBQ25COzs7Ozs7Ozs7T0FTRztJQUNJLFdBQVcsQ0FBQyxJQUFhO1FBQzVCLFFBQVEsT0FBTyxJQUFJLEVBQUU7WUFDakIsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDaEQsT0FBTyxJQUFBLHNCQUFhLEVBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDLENBQUMsQ0FBQztZQUNQLEtBQUssUUFBUTtnQkFDVCxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLE1BQU0sQ0FBQyxFQUFFO29CQUN2RSxPQUFPLElBQUksQ0FB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LE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFEO1FBQ0QsdUJBQXVCO1FBQ3ZCLElBQUksSUFBSSxZQUFZLE1BQU0sRUFBRTtZQUN4QixPQUFPLElBQUEsZ0JBQU8sRUFBQyxhQUFhLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDckQ7UUFDRCx1QkFBdUI7UUFDdkIsT0FBTyxJQUFBLGFBQUksRUFBQyxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQztDQUNKO0FBMUdELGdDQTBHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IFJlc3VsdCwgY2FwdHVyZVJlc3VsdCwgZmFpbCwgbWFwUmVzdWx0cywgc3VjY2VlZCB9IGZyb20gJy4vcmVzdWx0JztcblxuLyoqXG4gKiBDb21wdXRlcyBhbiBtZDUgaGFzaCBmcm9tIGFuIGFycmF5IG9mIHN0cmluZ3MuIE5vdCBzZWN1cmUgYW5kIG5vdCBpbnRlbmRlZCB0byBiZSBzZWN1cmUuXG4gKiBAcGFyYW0gcGFydHMgLSBUaGUgc3RyaW5ncyB0byBiZSBoYXNoZWRcbiAqIEByZXR1cm5zIEFuIG1kNSBoYXNoIG9mIHRoZSBwYXJ0c1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUhhc2gocGFydHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShwYXJ0cy5qb2luKCd8JyksICd1dGY4JykuZGlnZXN0KCdoZXgnKTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBhIG5vcm1hbGl6ZWQgaGFzaCBmb3IgYW4gYXJiaXRyYXJ5IGphdmFzY3JpcHQgdmFsdWUuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3JtYWxpemVyIHtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBhIG5vcm1hbGl6ZWQgbWQ1IGhhc2ggZnJvbSBhbiBhcmJpdHJhcnkgc3VwcGxpZWQgb2JqZWN0LiAgTm90IHNlY3VyZSBhbmQgbm90XG4gICAgICogaW50ZW5kZWQgdG8gYmUgc2VjdXJlLiAgQWxzbyBub3QgZmFzdCBhbmQgbm90IGludGVuZGVkIHRvIGJlIGZhc3QuXG4gICAgICpcbiAgICAgKiBOb3JtYWxpemF0aW9uIGp1c3Qgc29ydHMgTWFwcywgU2V0cyBhbmQgb2JqZWN0IGtleXMgYnkgaGFzaCBzbyB0aGF0IGRpZmZlcmVuY2VzIGluIG9yZGVyXG4gICAgICogZG8gbm90IGFmZmVjdCB0aGUgaGFzaC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmcm9tIC0gVGhlIGFyYml0cmFyeSBgdW5rbm93bmAgdG8gYmUgaGFzaGVkLlxuICAgICAqIEByZXR1cm5zIEEgbm9ybWFsaXplZCBtZDUgaGFzaCBmb3IgdGhlIHN1cHBsaWVkIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb21wdXRlSGFzaChmcm9tOiB1bmtub3duKTogUmVzdWx0PHN0cmluZz4ge1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBmcm9tKSB7XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3JtYWxpemVMaXRlcmFsKGZyb20pLm9uU3VjY2VzcygodikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBjb21wdXRlSGFzaChbdl0pKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgaWYgKChmcm9tID09PSBudWxsKSB8fCAoZnJvbSBpbnN0YW5jZW9mIERhdGUpIHx8IChmcm9tIGluc3RhbmNlb2YgUmVnRXhwKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbm9ybWFsaXplTGl0ZXJhbChmcm9tKS5vblN1Y2Nlc3MoKHYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IGNvbXB1dGVIYXNoKFt2XSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwUmVzdWx0cyhmcm9tLm1hcCgoZSkgPT4gdGhpcy5jb21wdXRlSGFzaChlKSkpLm9uU3VjY2VzcygoYSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gY29tcHV0ZUhhc2goYSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoKGZyb20gaW5zdGFuY2VvZiBNYXApIHx8IChmcm9tIGluc3RhbmNlb2YgU2V0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlSGFzaCh0aGlzLl9ub3JtYWxpemVFbnRyaWVzKGZyb20uZW50cmllcygpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVIYXNoKHRoaXMuX25vcm1hbGl6ZUVudHJpZXMoT2JqZWN0LmVudHJpZXMoZnJvbSkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgY29tcHV0ZUhhc2g6IFVuZXhwZWN0ZWQgdHlwZSAtIGNhbm5vdCBoYXNoICcke3R5cGVvZiBmcm9tfSdgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0d28gcHJvcGVydHkgbmFtZXMgZnJvbSBzb21lIG9iamVjdCBiZWluZyBub3JtYWxpemVkLlxuICAgICAqIEBwYXJhbSBrMSAtIEZpcnN0IGtleSB0byBiZSBjb21wYXJlZC5cbiAgICAgKiBAcGFyYW0gazIgLSBTZWNvbmQga2V5IHRvIGJlIGNvbXBhcmVkLlxuICAgICAqIEByZXR1cm5zIGAxYCBpZiBgazFgIGlzIGdyZWF0ZXIsIGAtMWAgaWYgYGsyYCBpcyBncmVhdGVyIGFuZFxuICAgICAqIGAwYCBpZiB0aGV5IGFyZSBlcXVhbC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NvbXBhcmVLZXlzKGsxOiB1bmtub3duLCBrMjogdW5rbm93bik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGNzMSA9IFN0cmluZyhrMSk7XG4gICAgICAgIGNvbnN0IGNzMiA9IFN0cmluZyhrMik7XG4gICAgICAgIGlmIChjczEgPiBjczIpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG4gICAgICAgIGlmIChjczIgPiBjczEpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgYW4gYXJyYXkgb2Ygb2JqZWN0IHByb3BlcnR5IGVudHJpZXMgKGUuZy4gYXMgcmV0dXJuZWQgYnkgYE9iamVjdC5lbnRyaWVzKClgKS5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIENvbnZlcnRzIHByb3BlcnR5IG5hbWVzIChlbnRyeSBrZXkpIHRvIHN0cmluZyBhbmQgdGhlbiBzb3J0cyBhcyBzdHJpbmcuXG4gICAgICogQHBhcmFtIGVudHJpZXMgLSBUaGUgZW50cmllcyB0byBiZSBub3JtYWxpemVkLlxuICAgICAqIEByZXR1cm5zIEEgbm9ybWFsaXplZCBzb3J0ZWQgYXJyYXkgb2YgZW50cmllcy5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX25vcm1hbGl6ZUVudHJpZXMoZW50cmllczogSXRlcmFibGU8W3Vua25vd24sIHVua25vd25dPik6IFt1bmtub3duLCB1bmtub3duXVtdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZW50cmllcykuc29ydCgoZTEsIGUyKSA9PiB0aGlzLl9jb21wYXJlS2V5cyhlMVswXSwgZTJbMF0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbm9ybWFsaXplZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygc29tZSBsaXRlcmFsIHZhbHVlLlxuICAgICAqIEBwYXJhbSBmcm9tIC0gVGhlIGxpdGVyYWwgdmFsdWUgdG8gYmUgbm9ybWFsaXplZC5cbiAgICAgKiBAcmV0dXJucyBBIG5vcm1hbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFsLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbm9ybWFsaXplTGl0ZXJhbChmcm9tOiBzdHJpbmd8bnVtYmVyfGJpZ2ludHxib29sZWFufHN5bWJvbHx1bmRlZmluZWR8RGF0ZXxSZWdFeHB8bnVsbCk6IFJlc3VsdDxzdHJpbmc+IHtcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgZnJvbSkge1xuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tKTtcbiAgICAgICAgICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZChgJHt0eXBlb2YgZnJvbX06W1tbJHtTdHJpbmcoZnJvbSl9XV1dYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZyb20gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKCdvYmplY3Q6W1tbbnVsbF1dJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZyb20gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChgRGF0ZTpbW1ske1N0cmluZyhmcm9tLnZhbHVlT2YoKSl9XV1dYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICAgICAgaWYgKGZyb20gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGBSZWdFeHA6W1tbJHtmcm9tLnRvU3RyaW5nKCl9XV1dYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgcmV0dXJuIGZhaWwoYGNhbm5vdCBub3JtYWxpemUgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9XG59XG4iXX0=

@@ -0,9 +1,13 @@

export * from './brand';
export * from './converter';
export * as Converters from './converters';
export * as Csv from './csvHelpers';
export * from './extendedArray';
export * from './formatter';
export * as Hash from './hash';
export * from './rangeOf';
export * from './result';
export * from './utils';
import * as Converters from './converters';
import * as Csv from './csvHelpers';
import * as Hash from './hash';
import * as Validation from './validation';
export { Converters, Csv, Hash, Validation };
//# sourceMappingURL=index.d.ts.map
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {

@@ -25,3 +29,3 @@ if (k2 === undefined) k2 = k;

Object.defineProperty(exports, "__esModule", { value: true });
exports.Hash = exports.Csv = exports.Converters = void 0;
exports.Validation = exports.Hash = exports.Csv = exports.Converters = void 0;
/*

@@ -48,11 +52,17 @@ * Copyright (c) 2020 Erik Fortune

*/
__exportStar(require("./brand"), exports);
__exportStar(require("./converter"), exports);
exports.Converters = __importStar(require("./converters"));
exports.Csv = __importStar(require("./csvHelpers"));
__exportStar(require("./extendedArray"), exports);
__exportStar(require("./formatter"), exports);
exports.Hash = __importStar(require("./hash"));
__exportStar(require("./rangeOf"), exports);
__exportStar(require("./result"), exports);
__exportStar(require("./utils"), exports);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILDhDQUE0QjtBQUM1QiwyREFBMkM7QUFDM0Msb0RBQW9DO0FBQ3BDLGtEQUFnQztBQUNoQyw4Q0FBNEI7QUFDNUIsK0NBQStCO0FBQy9CLDRDQUEwQjtBQUMxQiwyQ0FBeUI7QUFDekIsMENBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlcic7XG5leHBvcnQgKiBhcyBDb252ZXJ0ZXJzIGZyb20gJy4vY29udmVydGVycyc7XG5leHBvcnQgKiBhcyBDc3YgZnJvbSAnLi9jc3ZIZWxwZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0ZW5kZWRBcnJheSc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm1hdHRlcic7XG5leHBvcnQgKiBhcyBIYXNoIGZyb20gJy4vaGFzaCc7XG5leHBvcnQgKiBmcm9tICcuL3JhbmdlT2YnO1xuZXhwb3J0ICogZnJvbSAnLi9yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG4iXX0=
const Converters = __importStar(require("./converters"));
exports.Converters = Converters;
const Csv = __importStar(require("./csvHelpers"));
exports.Csv = Csv;
const Hash = __importStar(require("./hash"));
exports.Hash = Hash;
const Validation = __importStar(require("./validation"));
exports.Validation = Validation;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCwwQ0FBd0I7QUFDeEIsOENBQTRCO0FBQzVCLGtEQUFnQztBQUNoQyw4Q0FBNEI7QUFDNUIsNENBQTBCO0FBQzFCLDJDQUF5QjtBQUN6QiwwQ0FBd0I7QUFFeEIseURBQTJDO0FBSWxDLGdDQUFVO0FBSG5CLGtEQUFvQztBQUdmLGtCQUFHO0FBRnhCLDZDQUErQjtBQUVMLG9CQUFJO0FBRDlCLHlEQUEyQztBQUNYLGdDQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5leHBvcnQgKiBmcm9tICcuL2JyYW5kJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0ZW5kZWRBcnJheSc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm1hdHRlcic7XG5leHBvcnQgKiBmcm9tICcuL3JhbmdlT2YnO1xuZXhwb3J0ICogZnJvbSAnLi9yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG5cbmltcG9ydCAqIGFzIENvbnZlcnRlcnMgZnJvbSAnLi9jb252ZXJ0ZXJzJztcbmltcG9ydCAqIGFzIENzdiBmcm9tICcuL2NzdkhlbHBlcnMnO1xuaW1wb3J0ICogYXMgSGFzaCBmcm9tICcuL2hhc2gnO1xuaW1wb3J0ICogYXMgVmFsaWRhdGlvbiBmcm9tICcuL3ZhbGlkYXRpb24nO1xuZXhwb3J0IHsgQ29udmVydGVycywgQ3N2LCBIYXNoLCBWYWxpZGF0aW9uIH07XG4iXX0=

@@ -25,7 +25,7 @@ import { Failure, Success } from './result';

export declare class InMemoryLogger extends LoggerBase {
get messages(): string[];
get silent(): string[];
protected _messages: string[];
protected _silent: string[];
constructor(logLevel?: LogLevel);
get messages(): string[];
get silent(): string[];
clear(): void;

@@ -38,1 +38,2 @@ protected _innerLog(message: string): Success<string | undefined>;

}
//# sourceMappingURL=logger.d.ts.map

@@ -115,2 +115,2 @@ "use strict";

exports.NoOpLogger = NoOpLogger;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxxQ0FBMkQ7QUFhM0QsTUFBc0IsVUFBVTtJQUc1QixZQUFtQixRQUFtQjtRQUYvQixhQUFRLEdBQWEsTUFBTSxDQUFDO1FBRy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxhQUFSLFFBQVEsY0FBUixRQUFRLEdBQUksTUFBTSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxNQUFNLENBQUMsT0FBaUIsRUFBRSxHQUFHLFVBQXFCO1FBQ3JELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztTQUN4QztRQUNELE9BQU8sSUFBQSxnQkFBTyxFQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxJQUFJLENBQUMsT0FBaUIsRUFBRSxHQUFHLFVBQXFCO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsRUFBRTtZQUM1RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsT0FBTyxJQUFBLGdCQUFPLEVBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVNLElBQUksQ0FBQyxPQUFpQixFQUFFLEdBQUcsVUFBcUI7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENB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SSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVTLFNBQVMsQ0FBQyxPQUFlO1FBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFUyxZQUFZLENBQUMsT0FBZTtRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixPQUFPLElBQUEsZ0JBQU8sRUFBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0o7QUF6QkQsd0NBeUJDO0FBRUQsTUFBYSxVQUFXLFNBQVEsVUFBVTtJQUM1QixTQUFTLENBQUMsT0FBZTtRQUMvQixRQUFRO1FBQ1IsT0FBTyxJQUFBLGdCQUFPLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNKO0FBTEQsZ0NBS0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7IEZhaWx1cmUsIFN1Y2Nlc3MsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XG5cbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gJ2RldGFpbCd8J2luZm8nfCd3YXJuaW5nJ3wnZXJyb3InfCdzaWxlbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gICAgbG9nKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+O1xuICAgIGRldGFpbChtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogU3VjY2VzczxzdHJpbmd8dW5kZWZpbmVkPjtcbiAgICBpbmZvKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+O1xuICAgIHdhcm4obWVzc2FnZT86IHVua25vd24sIC4uLnBhcmFtZXRlcnM6IHVua25vd25bXSk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD47XG4gICAgd2FybkFuZEZhaWw8VD4obWVzc2FnZT86IHVua25vd24sIC4uLnBhcmFtZXRlcnM6IHVua25vd25bXSk6IEZhaWx1cmU8VD47XG4gICAgZXJyb3I8VD4obWVzc2FnZT86IHVua25vd24sIC4uLnBhcmFtZXRlcnM6IHVua25vd25bXSk6IEZhaWx1cmU8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMb2dnZXJCYXNlIHtcbiAgICBwdWJsaWMgbG9nTGV2ZWw6IExvZ0xldmVsID0gJ2luZm8nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGxvZ0xldmVsPzogTG9nTGV2ZWwpIHtcbiAgICAgICAgdGhpcy5sb2dMZXZlbCA9IGxvZ0xldmVsID8/ICdpbmZvJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZGV0YWlsKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgaWYgKHRoaXMubG9nTGV2ZWwgPT09ICdkZXRhaWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2cobWVzc2FnZSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5mbyhtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogU3VjY2VzczxzdHJpbmd8dW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICgodGhpcy5sb2dMZXZlbCA9PT0gJ2RldGFpbCcpIHx8ICh0aGlzLmxvZ0xldmVsID09PSAnaW5mbycpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2cobWVzc2FnZSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2FybihtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogU3VjY2VzczxzdHJpbmd8dW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICgodGhpcy5sb2dMZXZlbCAhPT0gJ2Vycm9yJykgJiYgKHRoaXMubG9nTGV2ZWwgIT09ICdzaWxlbnQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9nKG1lc3NhZ2UsIHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdhcm5BbmRGYWlsPFQ+KG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBGYWlsdXJlPFQ+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5fZm9ybWF0KG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICBpZiAoKHRoaXMubG9nTGV2ZWwgIT09ICdlcnJvcicpICYmICh0aGlzLmxvZ0xldmVsICE9PSAnc2lsZW50JykpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubG9nKGZvcm1hdHRlZCk7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChyZXN1bHQudmFsdWUgPz8gZm9ybWF0dGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChmb3JtYXR0ZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlcnJvcjxUPihtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogRmFpbHVyZTxUPiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuX2Zvcm1hdChtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgaWYgKHRoaXMubG9nTGV2ZWwgIT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmxvZyhmb3JtYXR0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwocmVzdWx0LnZhbHVlID8/IGZvcm1hdHRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoZm9ybWF0dGVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9nKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZVN0cmluZyA9IHRoaXMuX2Zvcm1hdChtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgaWYgKHRoaXMubG9nTGV2ZWwgPT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW5uZXJTaWxlbnQobWVzc2FnZVN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyTG9nKG1lc3NhZ2VTdHJpbmcpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZm9ybWF0KG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByYXcgPSBbbWVzc2FnZSwgLi4ucGFyYW1ldGVyc107XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gcmF3LmZpbHRlcigobSk6IG0gaXMgc3RyaW5nID0+IChtICE9PSB1bmRlZmluZWQpKTtcbiAgICAgICAgY29uc3Qgc3RyaW5ncyA9IGZpbHRlcmVkLm1hcCgobSkgPT4gbS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3Qgam9pbmVkID0gc3RyaW5ncy5qb2luKCcnKTtcbiAgICAgICAgcmV0dXJuIGpvaW5lZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lubmVyU2lsZW50KF9tZXNzYWdlOiBzdHJpbmcpOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgX2lubmVyTG9nKG1lc3NhZ2U6IHN0cmluZyk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD47XG59XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeUxvZ2dlciBleHRlbmRzIExvZ2dlckJhc2Uge1xuICAgIHB1YmxpYyBnZXQgbWVzc2FnZXMoKTogc3RyaW5nW10geyByZXR1cm4gdGhpcy5fbWVzc2FnZXM7IH1cbiAgICBwdWJsaWMgZ2V0IHNpbGVudCgpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLl9zaWxlbnQ7IH1cblxuICAgIHByb3RlY3RlZCBfbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJvdGVjdGVkIF9zaWxlbnQ6IHN0cmluZ1tdID0gW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IobG9nTGV2ZWw/OiBMb2dMZXZlbCkge1xuICAgICAgICBzdXBlcihsb2dMZXZlbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9tZXNzYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLl9zaWxlbnQgPSBbXTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lubmVyTG9nKG1lc3NhZ2U6IHN0cmluZyk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD4ge1xuICAgICAgICB0aGlzLl9tZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gc3VjY2VlZChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lubmVyU2lsZW50KG1lc3NhZ2U6IHN0cmluZyk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD4ge1xuICAgICAgICB0aGlzLl9zaWxlbnQucHVzaChtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb09wTG9nZ2VyIGV4dGVuZHMgTG9nZ2VyQmFzZSB7XG4gICAgcHJvdGVjdGVkIF9pbm5lckxvZyhtZXNzYWdlOiBzdHJpbmcpOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgLy8gbm8tb3BcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQobWVzc2FnZSk7XG4gICAgfVxufVxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxxQ0FBMkQ7QUFhM0QsTUFBc0IsVUFBVTtJQUc1QixZQUFtQixRQUFtQjtRQUYvQixhQUFRLEdBQWEsTUFBTSxDQUFDO1FBRy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxhQUFSLFFBQVEsY0FBUixRQUFRLEdBQUksTUFBTSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxNQUFNLENBQUMsT0FBaUIsRUFBRSxHQUFHLFVBQXFCO1FBQ3JELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztTQUN4QztRQUNELE9BQU8sSUFBQSxnQkFBTyxFQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxJQUFJLENBQUMsT0FBaUIsRUFBRSxHQUFHLFVBQXFCO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsRUFBRTtZQUM1RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsT0FBTyxJQUFBLGdCQUFPLEVBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVNLElBQUksQ0FBQyxPQUFpQixFQUFFLEdBQUcsVUFBcUI7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENB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SSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVTLFNBQVMsQ0FBQyxPQUFlO1FBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFUyxZQUFZLENBQUMsT0FBZTtRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixPQUFPLElBQUEsZ0JBQU8sRUFBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0o7QUF6QkQsd0NBeUJDO0FBRUQsTUFBYSxVQUFXLFNBQVEsVUFBVTtJQUM1QixTQUFTLENBQUMsT0FBZTtRQUMvQixRQUFRO1FBQ1IsT0FBTyxJQUFBLGdCQUFPLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNKO0FBTEQsZ0NBS0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7IEZhaWx1cmUsIFN1Y2Nlc3MsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XG5cbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gJ2RldGFpbCd8J2luZm8nfCd3YXJuaW5nJ3wnZXJyb3InfCdzaWxlbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gICAgbG9nKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+O1xuICAgIGRldGFpbChtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogU3VjY2VzczxzdHJpbmd8dW5kZWZpbmVkPjtcbiAgICBpbmZvKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+O1xuICAgIHdhcm4obWVzc2FnZT86IHVua25vd24sIC4uLnBhcmFtZXRlcnM6IHVua25vd25bXSk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD47XG4gICAgd2FybkFuZEZhaWw8VD4obWVzc2FnZT86IHVua25vd24sIC4uLnBhcmFtZXRlcnM6IHVua25vd25bXSk6IEZhaWx1cmU8VD47XG4gICAgZXJyb3I8VD4obWVzc2FnZT86IHVua25vd24sIC4uLnBhcmFtZXRlcnM6IHVua25vd25bXSk6IEZhaWx1cmU8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMb2dnZXJCYXNlIHtcbiAgICBwdWJsaWMgbG9nTGV2ZWw6IExvZ0xldmVsID0gJ2luZm8nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGxvZ0xldmVsPzogTG9nTGV2ZWwpIHtcbiAgICAgICAgdGhpcy5sb2dMZXZlbCA9IGxvZ0xldmVsID8/ICdpbmZvJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZGV0YWlsKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgaWYgKHRoaXMubG9nTGV2ZWwgPT09ICdkZXRhaWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2cobWVzc2FnZSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5mbyhtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogU3VjY2VzczxzdHJpbmd8dW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICgodGhpcy5sb2dMZXZlbCA9PT0gJ2RldGFpbCcpIHx8ICh0aGlzLmxvZ0xldmVsID09PSAnaW5mbycpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2cobWVzc2FnZSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2FybihtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogU3VjY2VzczxzdHJpbmd8dW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICgodGhpcy5sb2dMZXZlbCAhPT0gJ2Vycm9yJykgJiYgKHRoaXMubG9nTGV2ZWwgIT09ICdzaWxlbnQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9nKG1lc3NhZ2UsIHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdhcm5BbmRGYWlsPFQ+KG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBGYWlsdXJlPFQ+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5fZm9ybWF0KG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICBpZiAoKHRoaXMubG9nTGV2ZWwgIT09ICdlcnJvcicpICYmICh0aGlzLmxvZ0xldmVsICE9PSAnc2lsZW50JykpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubG9nKGZvcm1hdHRlZCk7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChyZXN1bHQudmFsdWUgPz8gZm9ybWF0dGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChmb3JtYXR0ZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlcnJvcjxUPihtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogRmFpbHVyZTxUPiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuX2Zvcm1hdChtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgaWYgKHRoaXMubG9nTGV2ZWwgIT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmxvZyhmb3JtYXR0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwocmVzdWx0LnZhbHVlID8/IGZvcm1hdHRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoZm9ybWF0dGVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9nKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZVN0cmluZyA9IHRoaXMuX2Zvcm1hdChtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgaWYgKHRoaXMubG9nTGV2ZWwgPT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW5uZXJTaWxlbnQobWVzc2FnZVN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyTG9nKG1lc3NhZ2VTdHJpbmcpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZm9ybWF0KG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByYXcgPSBbbWVzc2FnZSwgLi4ucGFyYW1ldGVyc107XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gcmF3LmZpbHRlcigobSk6IG0gaXMgc3RyaW5nID0+IChtICE9PSB1bmRlZmluZWQpKTtcbiAgICAgICAgY29uc3Qgc3RyaW5ncyA9IGZpbHRlcmVkLm1hcCgobSkgPT4gbS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3Qgam9pbmVkID0gc3RyaW5ncy5qb2luKCcnKTtcbiAgICAgICAgcmV0dXJuIGpvaW5lZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lubmVyU2lsZW50KF9tZXNzYWdlOiBzdHJpbmcpOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgX2lubmVyTG9nKG1lc3NhZ2U6IHN0cmluZyk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD47XG59XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeUxvZ2dlciBleHRlbmRzIExvZ2dlckJhc2Uge1xuICAgIHByb3RlY3RlZCBfbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJvdGVjdGVkIF9zaWxlbnQ6IHN0cmluZ1tdID0gW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IobG9nTGV2ZWw/OiBMb2dMZXZlbCkge1xuICAgICAgICBzdXBlcihsb2dMZXZlbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtZXNzYWdlcygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLl9tZXNzYWdlczsgfVxuICAgIHB1YmxpYyBnZXQgc2lsZW50KCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMuX3NpbGVudDsgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9tZXNzYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLl9zaWxlbnQgPSBbXTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lubmVyTG9nKG1lc3NhZ2U6IHN0cmluZyk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD4ge1xuICAgICAgICB0aGlzLl9tZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gc3VjY2VlZChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lubmVyU2lsZW50KG1lc3NhZ2U6IHN0cmluZyk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD4ge1xuICAgICAgICB0aGlzLl9zaWxlbnQucHVzaChtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb09wTG9nZ2VyIGV4dGVuZHMgTG9nZ2VyQmFzZSB7XG4gICAgcHJvdGVjdGVkIF9pbm5lckxvZyhtZXNzYWdlOiBzdHJpbmcpOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgLy8gbm8tb3BcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQobWVzc2FnZSk7XG4gICAgfVxufVxuIl19
{
"name": "@fgv/ts-utils",
"version": "1.2.1",
"version": "1.3.0",
"description": "Assorted Typescript Utilities",
"main": "index.js",
"scripts": {
"api-extractor": "$(npm bin)/api-extractor run --local --verbose -c ./config/api-extractor.json",
"build": "rimraf dist && tsc && ./prep.sh",
"build-docs": "$(npm bin)/api-documenter markdown --input-folder ./temp --output-folder docs",
"build-all": "npm run build; npm run api-extractor; npm run build-docs",
"clean": "rimraf dist",

@@ -31,16 +34,17 @@ "test": "jest",

"devDependencies": {
"@microsoft/api-documenter": "^7.16.0",
"@microsoft/api-extractor": "^7.19.5",
"@types/jest": "^27.0.2",
"@types/luxon": "^2.0.4",
"@types/mustache": "^4.1.2",
"@types/node": "^15.0.1",
"@typescript-eslint/eslint-plugin": "^4.32.0",
"@typescript-eslint/parser": "^4.32.0",
"eslint": "^7.32.0",
"eslint-config-standard": "^16.0.3",
"@types/node": "^17.0.21",
"@typescript-eslint/eslint-plugin": "^5.15.0",
"@typescript-eslint/parser": "^5.15.0",
"eslint": "^8.11.0",
"eslint-config-standard": "^17.0.0-1",
"eslint-plugin-import": "^2.24.2",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^5.1.0",
"eslint-plugin-standard": "^5.0.0",
"eslint-plugin-promise": "^6.0.0",
"jest": "^27.2.4",
"jest-extended": "^0.11.5",
"jest-extended": "^2.0.0",
"jest-matcher-utils": "^27.2.4",

@@ -47,0 +51,0 @@ "rimraf": "^3.0.2",

import { Result } from './result';
/**
* Represents a generic range of some comparable type `<T>`.
* @public
*/
export interface RangeOfProperties<T> {

@@ -6,2 +10,8 @@ readonly min?: T;

}
/**
* Format strings (in mustache format) to
* use for both open-ended and complete
* {@link RangeOf | RangeOf<T>}.
* @public
*/
export interface RangeOfFormats {

@@ -12,2 +22,7 @@ minOnly: string;

}
/**
* Default {@link RangeOfFormats | formats} to use for both
* open-ended and complete {@link RangeOf | RangeOf<T>}.
* @public
*/
export declare const DEFAULT_RANGEOF_FORMATS: {

@@ -18,15 +33,96 @@ minOnly: string;

};
/**
* Simple implementation of a possibly open-ended range of some comparable
* type `<T>` with test and formatting.
* @public
*/
export declare class RangeOf<T> implements RangeOfProperties<T> {
/**
* Minimum extent of the range.
*/
readonly min?: T;
/**
* Maximum extent of the range.
*/
readonly max?: T;
/**
* Creates a new {@link RangeOf | RangeOf<T>}.
* @param min - Optional mininum extent of the range.
* @param max - Optional maximum extent of the range.
*/
constructor(min?: T, max?: T);
/**
* Static constructor for a {@link RangeOf | RangeOf<T>}.
* @param init - {@link RangeOfProperties | Range initializer}.
* @returns A new {@link RangeOf | RangeOf<T>}.
*/
static createRange<T>(init?: RangeOfProperties<T>): Result<RangeOf<T>>;
/**
* Gets a formatted description of a {@link RangeOfProperties | RangeOfProperties<T>} given an
* optional set of formats and 'empty' value to use.
* @param range - The {@link RangeOfProperties | RangeOfProperties<T>} to be formatted.
* @param formats - Optionas {@link RangeOfFormats | formats} to use. Default is
* {@link DEFAULT_RANGEOF_FORMATS | DEFAULT_RANGEOF_FORMATS}.
* @param emptyValue - Value which represents unbounded minimum or maximum for this range. Default is `undefined`.
* @returns A string representation of the range.
*/
static propertiesToString<T>(range: RangeOfProperties<T>, formats?: RangeOfFormats, emptyValue?: T): string | undefined;
/**
* Default comparison uses javascript built-in comparison.
* @param t1 - First value to be compared.
* @param t2 - Second value to be compared.
* @returns `'less'` if `t1` is less than `t2`, `'greater'` if `t1` is larger
* and `'equal'` if `t1` and `t2` are equal.
* @internal
*/
protected static _defaultCompare<T>(t1: T, t2: T): 'less' | 'equal' | 'greater';
/**
* Checks if a supplied value is within this range.
* @param t - The value to be tested.
* @returns `'included'` if `t` falls within the range, `'less'` if `t` falls
* below the minimum extent of the range and `'greater'` if `t` is above the
* maximum extent.
*/
check(t: T): 'less' | 'included' | 'greater';
/**
* Determines if a supplied value is within this range.
* @param t - The value to be tested.
* @returns Returns `true` if `t` falls within the range, `false` otherwise.
*/
includes(t: T): boolean;
/**
* Finds the transition value that would bring a supplied value `t` into
* range.
* @param t - The value to be tested.
* @returns The minimum extent of the range if `t` is below the range or
* the maximum extent of the range if `t` is above the range. Returns
* `undefined` if `t` already falls within the range.
*/
findTransition(t: T): T | undefined;
/**
* Formats the minimum and maximum values of this range.
* @param format - A format function used to format the values.
* @returns A {@link RangeOfProperties | RangeOfProperties<string>} contaning the
* formatted representation of the {@link RangeOf.min | minimum} and {@link RangeOf.max | maximum}
* extent of the range, or `undefined` for an extent that is not present.
*/
toFormattedProperties(format: (value: T) => string | undefined): RangeOfProperties<string>;
/**
* Formats this range using the supplied format function.
* @param format - Format function used to format minimum and maxiumum extent values.
* @param formats - The {@link RangeOfFormats | format strings} used to format the range
* (default {@link DEFAULT_RANGEOF_FORMATS}).
* @returns Returns a formatted representation of this range.
*/
format(format: (value: T) => string | undefined, formats?: RangeOfFormats): string | undefined;
/**
* Inner compare method can be overriden by a derived class.
* @param t1 - First value to compare.
* @param t2 - Second value to compare.
* @returns `'less'` if `t1` is less than `t2`, `'greater'` if `t1` is larger
* and `'equal'` if `t1` and `t2` are equal.
* @internal
*/
protected _compare(t1: T, t2: T): 'less' | 'equal' | 'greater';
}
//# sourceMappingURL=rangeOf.d.ts.map

@@ -30,2 +30,7 @@ "use strict";

const mustache_1 = __importDefault(require("mustache"));
/**
* Default {@link RangeOfFormats | formats} to use for both
* open-ended and complete {@link RangeOf | RangeOf<T>}.
* @public
*/
exports.DEFAULT_RANGEOF_FORMATS = {

@@ -36,3 +41,13 @@ minOnly: '{{min}}-',

};
/**
* Simple implementation of a possibly open-ended range of some comparable
* type `<T>` with test and formatting.
* @public
*/
class RangeOf {
/**
* Creates a new {@link RangeOf | RangeOf<T>}.
* @param min - Optional mininum extent of the range.
* @param max - Optional maximum extent of the range.
*/
constructor(min, max) {

@@ -46,5 +61,19 @@ if (((min !== undefined) && (max !== undefined)) &&

}
/**
* Static constructor for a {@link RangeOf | RangeOf<T>}.
* @param init - {@link RangeOfProperties | Range initializer}.
* @returns A new {@link RangeOf | RangeOf<T>}.
*/
static createRange(init) {
return (0, result_1.captureResult)(() => new RangeOf(init === null || init === void 0 ? void 0 : init.min, init === null || init === void 0 ? void 0 : init.max));
}
/**
* Gets a formatted description of a {@link RangeOfProperties | RangeOfProperties<T>} given an
* optional set of formats and 'empty' value to use.
* @param range - The {@link RangeOfProperties | RangeOfProperties<T>} to be formatted.
* @param formats - Optionas {@link RangeOfFormats | formats} to use. Default is
* {@link DEFAULT_RANGEOF_FORMATS | DEFAULT_RANGEOF_FORMATS}.
* @param emptyValue - Value which represents unbounded minimum or maximum for this range. Default is `undefined`.
* @returns A string representation of the range.
*/
static propertiesToString(range, formats, emptyValue) {

@@ -65,2 +94,10 @@ formats = formats !== null && formats !== void 0 ? formats : exports.DEFAULT_RANGEOF_FORMATS;

}
/**
* Default comparison uses javascript built-in comparison.
* @param t1 - First value to be compared.
* @param t2 - Second value to be compared.
* @returns `'less'` if `t1` is less than `t2`, `'greater'` if `t1` is larger
* and `'equal'` if `t1` and `t2` are equal.
* @internal
*/
static _defaultCompare(t1, t2) {

@@ -75,2 +112,9 @@ if (t1 < t2) {

}
/**
* Checks if a supplied value is within this range.
* @param t - The value to be tested.
* @returns `'included'` if `t` falls within the range, `'less'` if `t` falls
* below the minimum extent of the range and `'greater'` if `t` is above the
* maximum extent.
*/
check(t) {

@@ -85,5 +129,18 @@ if ((this.min !== undefined) && (this._compare(t, this.min) === 'less')) {

}
/**
* Determines if a supplied value is within this range.
* @param t - The value to be tested.
* @returns Returns `true` if `t` falls within the range, `false` otherwise.
*/
includes(t) {
return this.check(t) === 'included';
}
/**
* Finds the transition value that would bring a supplied value `t` into
* range.
* @param t - The value to be tested.
* @returns The minimum extent of the range if `t` is below the range or
* the maximum extent of the range if `t` is above the range. Returns
* `undefined` if `t` already falls within the range.
*/
findTransition(t) {

@@ -98,2 +155,9 @@ switch (this.check(t)) {

}
/**
* Formats the minimum and maximum values of this range.
* @param format - A format function used to format the values.
* @returns A {@link RangeOfProperties | RangeOfProperties<string>} contaning the
* formatted representation of the {@link RangeOf.min | minimum} and {@link RangeOf.max | maximum}
* extent of the range, or `undefined` for an extent that is not present.
*/
toFormattedProperties(format) {

@@ -105,5 +169,20 @@ return {

}
/**
* Formats this range using the supplied format function.
* @param format - Format function used to format minimum and maxiumum extent values.
* @param formats - The {@link RangeOfFormats | format strings} used to format the range
* (default {@link DEFAULT_RANGEOF_FORMATS}).
* @returns Returns a formatted representation of this range.
*/
format(format, formats) {
return RangeOf.propertiesToString(this.toFormattedProperties(format), formats);
}
/**
* Inner compare method can be overriden by a derived class.
* @param t1 - First value to compare.
* @param t2 - Second value to compare.
* @returns `'less'` if `t1` is less than `t2`, `'greater'` if `t1` is larger
* and `'equal'` if `t1` and `t2` are equal.
* @internal
*/
_compare(t1, t2) {

@@ -114,2 +193,2 @@ return RangeOf._defaultCompare(t1, t2);

exports.RangeOf = RangeOf;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2VPZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yYW5nZU9mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7OztBQUVILHFDQUFpRDtBQUNqRCx3REFBZ0M7QUFhbkIsUUFBQSx1QkFBdUIsR0FBRztJQUNuQyxPQUFPLEVBQUUsVUFBVTtJQUNuQixPQUFPLEVBQUUsVUFBVTtJQUNuQixNQUFNLEVBQUUsaUJBQWlCO0NBQzVCLENBQUM7QUFFRixNQUFhLE9BQU87SUFJaEIsWUFBbUIsR0FBTyxFQUFFLEdBQU87UUFDL0IsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2pHO1FBQ0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBRU0sTUFBTSxDQUFDLFdBQVcsQ0FBSSxJQUEyQjtRQUNwRCxPQUFPLElBQUEsc0JBQWEsRUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBSSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsR0FBRyxFQUFFLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTSxNQUFNLENBQUMsa0JBQWtCLENBQUksS0FBMkIsRUFBRSxPQUF3QixFQUFFLFVBQWM7UUFDckcsT0FBTyxH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LENBQUM7SUFDbkYsQ0FBQztJQUVTLFFBQVEsQ0FBQyxFQUFLLEVBQUUsRUFBSztRQUMzQixPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDSjtBQWpGRCwwQkFpRkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHsgUmVzdWx0LCBjYXB0dXJlUmVzdWx0IH0gZnJvbSAnLi9yZXN1bHQnO1xuaW1wb3J0IE11c3RhY2hlIGZyb20gJ211c3RhY2hlJztcblxuZXhwb3J0IGludGVyZmFjZSBSYW5nZU9mUHJvcGVydGllczxUPiB7XG4gICAgcmVhZG9ubHkgbWluPzogVDtcbiAgICByZWFkb25seSBtYXg/OiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlT2ZGb3JtYXRzIHtcbiAgICBtaW5Pbmx5OiBzdHJpbmc7XG4gICAgbWF4T25seTogc3RyaW5nO1xuICAgIG1pbk1heDogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9SQU5HRU9GX0ZPUk1BVFMgPSB7XG4gICAgbWluT25seTogJ3t7bWlufX0tJyxcbiAgICBtYXhPbmx5OiAnLXt7bWF4fX0nLFxuICAgIG1pbk1heDogJ3t7bWlufX0te3ttYXh9fScsXG59O1xuXG5leHBvcnQgY2xhc3MgUmFuZ2VPZjxUPiBpbXBsZW1lbnRzIFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWluPzogVDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWF4PzogVDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihtaW4/OiBULCBtYXg/OiBUKSB7XG4gICAgICAgIGlmICgoKG1pbiAhPT0gdW5kZWZpbmVkKSAmJiAobWF4ICE9PSB1bmRlZmluZWQpKSAmJlxuICAgICAgICAgICAgdGhpcy5fY29tcGFyZShtaW4sIG1heCkgPT09ICdncmVhdGVyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZlcnRlZCByYW5nZSAtICR7SlNPTi5zdHJpbmdpZnkobWluKX0gbXVzdCBiZSA8PSAke0pTT04uc3RyaW5naWZ5KG1heCl9LmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJhbmdlPFQ+KGluaXQ/OiBSYW5nZU9mUHJvcGVydGllczxUPik6IFJlc3VsdDxSYW5nZU9mPFQ+PiB7XG4gICAgICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IG5ldyBSYW5nZU9mPFQ+KGluaXQ/Lm1pbiwgaW5pdD8ubWF4KSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwcm9wZXJ0aWVzVG9TdHJpbmc8VD4ocmFuZ2U6IFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+LCBmb3JtYXRzPzogUmFuZ2VPZkZvcm1hdHMsIGVtcHR5VmFsdWU/OiBUKTogc3RyaW5nfHVuZGVmaW5lZCB7XG4gICAgICAgIGZvcm1hdHMgPSBmb3JtYXRzID8/IERFRkFVTFRfUkFOR0VPRl9GT1JNQVRTO1xuICAgICAgICBpZiAoKHJhbmdlLm1pbiAhPT0gdW5kZWZpbmVkKSAmJiAocmFuZ2UubWluICE9PSBlbXB0eVZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKChyYW5nZS5tYXggIT09IHVuZGVmaW5lZCkgJiYgKHJhbmdlLm1heCAhPT0gZW1wdHlWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTXVzdGFjaGUucmVuZGVyKGZvcm1hdHMubWluTWF4LCByYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTXVzdGFjaGUucmVuZGVyKGZvcm1hdHMubWluT25seSwgcmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChyYW5nZS5tYXggIT09IHVuZGVmaW5lZCkgJiYgKHJhbmdlLm1heCAhPT0gZW1wdHlWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoZm9ybWF0cy5tYXhPbmx5LCByYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9kZWZhdWx0Q29tcGFyZTxUPih0MTogVCwgdDI6IFQpOiAnbGVzcyd8J2VxdWFsJ3wnZ3JlYXRlcicge1xuICAgICAgICBpZiAodDEgPCB0Mikge1xuICAgICAgICAgICAgcmV0dXJuICdsZXNzJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0MSA+IHQyKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2dyZWF0ZXInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnZXF1YWwnO1xuICAgIH1cblxuICAgIHB1YmxpYyBjaGVjayh0OiBUKTogJ2xlc3MnfCdpbmNsdWRlZCd8J2dyZWF0ZXInIHtcbiAgICAgICAgaWYgKCh0aGlzLm1pbiAhPT0gdW5kZWZpbmVkKSAmJiAodGhpcy5fY29tcGFyZSh0LCB0aGlzLm1pbikgPT09ICdsZXNzJykpIHtcbiAgICAgICAgICAgIHJldHVybiAnbGVzcyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0aGlzLm1heCAhPT0gdW5kZWZpbmVkKSAmJiAodGhpcy5fY29tcGFyZSh0LCB0aGlzLm1heCkgIT09ICdsZXNzJykpIHtcbiAgICAgICAgICAgIHJldHVybiAnZ3JlYXRlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdpbmNsdWRlZCc7XG4gICAgfVxuXG4gICAgcHVibGljIGluY2x1ZGVzKHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2sodCkgPT09ICdpbmNsdWRlZCc7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmRUcmFuc2l0aW9uKHQ6IFQpOiBUfHVuZGVmaW5lZCB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5jaGVjayh0KSkge1xuICAgICAgICAgICAgY2FzZSAnbGVzcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWluO1xuICAgICAgICAgICAgY2FzZSAnaW5jbHVkZWQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1heDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0Zvcm1hdHRlZFByb3BlcnRpZXMoZm9ybWF0OiAodmFsdWU6IFQpID0+IHN0cmluZ3x1bmRlZmluZWQpOiBSYW5nZU9mUHJvcGVydGllczxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1pbjogKHRoaXMubWluICE9PSB1bmRlZmluZWQpID8gZm9ybWF0KHRoaXMubWluKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG1heDogKHRoaXMubWF4ICE9PSB1bmRlZmluZWQpID8gZm9ybWF0KHRoaXMubWF4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9ybWF0KGZvcm1hdDogKHZhbHVlOiBUKSA9PiBzdHJpbmd8dW5kZWZpbmVkLCBmb3JtYXRzPzogUmFuZ2VPZkZvcm1hdHMpOiBzdHJpbmd8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlT2YucHJvcGVydGllc1RvU3RyaW5nKHRoaXMudG9Gb3JtYXR0ZWRQcm9wZXJ0aWVzKGZvcm1hdCksIGZvcm1hdHMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY29tcGFyZSh0MTogVCwgdDI6IFQpOiAnbGVzcyd8J2VxdWFsJ3wnZ3JlYXRlcicge1xuICAgICAgICByZXR1cm4gUmFuZ2VPZi5fZGVmYXVsdENvbXBhcmUodDEsIHQyKTtcbiAgICB9XG59XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2VPZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yYW5nZU9mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7OztBQUVILHFDQUFpRDtBQUNqRCx3REFBZ0M7QUF1QmhDOzs7O0dBSUc7QUFDVSxRQUFBLHVCQUF1QixHQUFHO0lBQ25DLE9BQU8sRUFBRSxVQUFVO0lBQ25CLE9BQU8sRUFBRSxVQUFVO0lBQ25CLE1BQU0sRUFBRSxpQkFBaUI7Q0FDNUIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFhLE9BQU87SUFVaEI7Ozs7T0FJRztJQUNILFlBQW1CLEdBQU8sRUFBRSxHQUFPO1FBQy9CLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNqRztRQUNELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUFJLElBQTJCO1FBQ3BELE9BQU8sSUFBQSxzQkFBYSxFQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFJLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxHQUFHLEVBQUUsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7Ozs7OztP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QUMsQ0FBQyxTQUFTO1NBQy9ELENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLE1BQXNDLEVBQUUsT0FBd0I7UUFDMUUsT0FBTyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ08sUUFBUSxDQUFDLEVBQUssRUFBRSxFQUFLO1FBQzNCLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztDQUNKO0FBNUpELDBCQTRKQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgeyBSZXN1bHQsIGNhcHR1cmVSZXN1bHQgfSBmcm9tICcuL3Jlc3VsdCc7XG5pbXBvcnQgTXVzdGFjaGUgZnJvbSAnbXVzdGFjaGUnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBnZW5lcmljIHJhbmdlIG9mIHNvbWUgY29tcGFyYWJsZSB0eXBlIGA8VD5gLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+IHtcbiAgICByZWFkb25seSBtaW4/OiBUO1xuICAgIHJlYWRvbmx5IG1heD86IFQ7XG59XG5cbi8qKlxuICogRm9ybWF0IHN0cmluZ3MgKGluIG11c3RhY2hlIGZvcm1hdCkgdG9cbiAqIHVzZSBmb3IgYm90aCBvcGVuLWVuZGVkIGFuZCBjb21wbGV0ZVxuICoge0BsaW5rIFJhbmdlT2YgfCBSYW5nZU9mPFQ+fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZU9mRm9ybWF0cyB7XG4gICAgbWluT25seTogc3RyaW5nO1xuICAgIG1heE9ubHk6IHN0cmluZztcbiAgICBtaW5NYXg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IHtAbGluayBSYW5nZU9mRm9ybWF0cyB8IGZvcm1hdHN9IHRvIHVzZSBmb3IgYm90aFxuICogb3Blbi1lbmRlZCBhbmQgY29tcGxldGUge0BsaW5rIFJhbmdlT2YgfCBSYW5nZU9mPFQ+fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkFOR0VPRl9GT1JNQVRTID0ge1xuICAgIG1pbk9ubHk6ICd7e21pbn19LScsXG4gICAgbWF4T25seTogJy17e21heH19JyxcbiAgICBtaW5NYXg6ICd7e21pbn19LXt7bWF4fX0nLFxufTtcblxuLyoqXG4gKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgYSBwb3NzaWJseSBvcGVuLWVuZGVkIHJhbmdlIG9mIHNvbWUgY29tcGFyYWJsZVxuICogdHlwZSBgPFQ+YCB3aXRoIHRlc3QgYW5kIGZvcm1hdHRpbmcuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW5nZU9mPFQ+IGltcGxlbWVudHMgUmFuZ2VPZlByb3BlcnRpZXM8VD4ge1xuICAgIC8qKlxuICAgICAqIE1pbmltdW0gZXh0ZW50IG9mIHRoZSByYW5nZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbWluPzogVDtcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIGV4dGVudCBvZiB0aGUgcmFuZ2UuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IG1heD86IFQ7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBSYW5nZU9mIHwgUmFuZ2VPZjxUPn0uXG4gICAgICogQHBhcmFtIG1pbiAtIE9wdGlvbmFsIG1pbmludW0gZXh0ZW50IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0gbWF4IC0gT3B0aW9uYWwgbWF4aW11bSBleHRlbnQgb2YgdGhlIHJhbmdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihtaW4/OiBULCBtYXg/OiBUKSB7XG4gICAgICAgIGlmICgoKG1pbiAhPT0gdW5kZWZpbmVkKSAmJiAobWF4ICE9PSB1bmRlZmluZWQpKSAmJlxuICAgICAgICAgICAgdGhpcy5fY29tcGFyZShtaW4sIG1heCkgPT09ICdncmVhdGVyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZlcnRlZCByYW5nZSAtICR7SlNPTi5zdHJpbmdpZnkobWluKX0gbXVzdCBiZSA8PSAke0pTT04uc3RyaW5naWZ5KG1heCl9LmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdGF0aWMgY29uc3RydWN0b3IgZm9yIGEge0BsaW5rIFJhbmdlT2YgfCBSYW5nZU9mPFQ+fS5cbiAgICAgKiBAcGFyYW0gaW5pdCAtIHtAbGluayBSYW5nZU9mUHJvcGVydGllcyB8IFJhbmdlIGluaXRpYWxpemVyfS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgUmFuZ2VPZiB8IFJhbmdlT2Y8VD59LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUmFuZ2U8VD4oaW5pdD86IFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+KTogUmVzdWx0PFJhbmdlT2Y8VD4+IHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gbmV3IFJhbmdlT2Y8VD4oaW5pdD8ubWluLCBpbml0Py5tYXgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgZm9ybWF0dGVkIGRlc2NyaXB0aW9uIG9mIGEge0BsaW5rIFJhbmdlT2ZQcm9wZXJ0aWVzIHwgUmFuZ2VPZlByb3BlcnRpZXM8VD59IGdpdmVuIGFuXG4gICAgICogb3B0aW9uYWwgc2V0IG9mIGZvcm1hdHMgYW5kICdlbXB0eScgdmFsdWUgdG8gdXNlLlxuICAgICAqIEBwYXJhbSByYW5nZSAtIFRoZSB7QGxpbmsgUmFuZ2VPZlByb3BlcnRpZXMgfCBSYW5nZU9mUHJvcGVydGllczxUPn0gdG8gYmUgZm9ybWF0dGVkLlxuICAgICAqIEBwYXJhbSBmb3JtYXRzIC0gT3B0aW9uYXMge0BsaW5rIFJhbmdlT2ZGb3JtYXRzIHwgZm9ybWF0c30gdG8gdXNlLiBEZWZhdWx0IGlzXG4gICAgICoge0BsaW5rIERFRkFVTFRfUkFOR0VPRl9GT1JNQVRTIHwgREVGQVVMVF9SQU5HRU9GX0ZPUk1BVFN9LlxuICAgICAqIEBwYXJhbSBlbXB0eVZhbHVlIC0gVmFsdWUgd2hpY2ggcmVwcmVzZW50cyB1bmJvdW5kZWQgbWluaW11bSBvciBtYXhpbXVtIGZvciB0aGlzIHJhbmdlLiBEZWZhdWx0IGlzIGB1bmRlZmluZWRgLlxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHByb3BlcnRpZXNUb1N0cmluZzxUPihyYW5nZTogUmFuZ2VPZlByb3BlcnRpZXM8VD4sIGZvcm1hdHM/OiBSYW5nZU9mRm9ybWF0cywgZW1wdHlWYWx1ZT86IFQpOiBzdHJpbmd8dW5kZWZpbmVkIHtcbiAgICAgICAgZm9ybWF0cyA9IGZvcm1hdHMgPz8gREVGQVVMVF9SQU5HRU9GX0ZPUk1BVFM7XG4gICAgICAgIGlmICgocmFuZ2UubWluICE9PSB1bmRlZmluZWQpICYmIChyYW5nZS5taW4gIT09IGVtcHR5VmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAoKHJhbmdlLm1heCAhPT0gdW5kZWZpbmVkKSAmJiAocmFuZ2UubWF4ICE9PSBlbXB0eVZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoZm9ybWF0cy5taW5NYXgsIHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoZm9ybWF0cy5taW5Pbmx5LCByYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHJhbmdlLm1heCAhPT0gdW5kZWZpbmVkKSAmJiAocmFuZ2UubWF4ICE9PSBlbXB0eVZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE11c3RhY2hlLnJlbmRlcihmb3JtYXRzLm1heE9ubHksIHJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgY29tcGFyaXNvbiB1c2VzIGphdmFzY3JpcHQgYnVpbHQtaW4gY29tcGFyaXNvbi5cbiAgICAgKiBAcGFyYW0gdDEgLSBGaXJzdCB2YWx1ZSB0byBiZSBjb21wYXJlZC5cbiAgICAgKiBAcGFyYW0gdDIgLSBTZWNvbmQgdmFsdWUgdG8gYmUgY29tcGFyZWQuXG4gICAgICogQHJldHVybnMgYCdsZXNzJ2AgaWYgYHQxYCBpcyBsZXNzIHRoYW4gYHQyYCwgYCdncmVhdGVyJ2AgaWYgYHQxYCBpcyBsYXJnZXJcbiAgICAgKiBhbmQgYCdlcXVhbCdgIGlmIGB0MWAgYW5kIGB0MmAgYXJlIGVxdWFsLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX2RlZmF1bHRDb21wYXJlPFQ+KHQxOiBULCB0MjogVCk6ICdsZXNzJ3wnZXF1YWwnfCdncmVhdGVyJyB7XG4gICAgICAgIGlmICh0MSA8IHQyKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2xlc3MnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHQxID4gdDIpIHtcbiAgICAgICAgICAgIHJldHVybiAnZ3JlYXRlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdlcXVhbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3VwcGxpZWQgdmFsdWUgaXMgd2l0aGluIHRoaXMgcmFuZ2UuXG4gICAgICogQHBhcmFtIHQgLSBUaGUgdmFsdWUgdG8gYmUgdGVzdGVkLlxuICAgICAqIEByZXR1cm5zIGAnaW5jbHVkZWQnYCBpZiBgdGAgZmFsbHMgd2l0aGluIHRoZSByYW5nZSwgYCdsZXNzJ2AgaWYgYHRgIGZhbGxzXG4gICAgICogYmVsb3cgdGhlIG1pbmltdW0gZXh0ZW50IG9mIHRoZSByYW5nZSBhbmQgYCdncmVhdGVyJ2AgaWYgYHRgIGlzIGFib3ZlIHRoZVxuICAgICAqIG1heGltdW0gZXh0ZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBjaGVjayh0OiBUKTogJ2xlc3MnfCdpbmNsdWRlZCd8J2dyZWF0ZXInIHtcbiAgICAgICAgaWYgKCh0aGlzLm1pbiAhPT0gdW5kZWZpbmVkKSAmJiAodGhpcy5fY29tcGFyZSh0LCB0aGlzLm1pbikgPT09ICdsZXNzJykpIHtcbiAgICAgICAgICAgIHJldHVybiAnbGVzcyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0aGlzLm1heCAhPT0gdW5kZWZpbmVkKSAmJiAodGhpcy5fY29tcGFyZSh0LCB0aGlzLm1heCkgIT09ICdsZXNzJykpIHtcbiAgICAgICAgICAgIHJldHVybiAnZ3JlYXRlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdpbmNsdWRlZCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIHN1cHBsaWVkIHZhbHVlIGlzIHdpdGhpbiB0aGlzIHJhbmdlLlxuICAgICAqIEBwYXJhbSB0IC0gVGhlIHZhbHVlIHRvIGJlIHRlc3RlZC5cbiAgICAgKiBAcmV0dXJucyBSZXR1cm5zIGB0cnVlYCBpZiBgdGAgZmFsbHMgd2l0aGluIHRoZSByYW5nZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGluY2x1ZGVzKHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2sodCkgPT09ICdpbmNsdWRlZCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIHRyYW5zaXRpb24gdmFsdWUgdGhhdCB3b3VsZCBicmluZyBhIHN1cHBsaWVkIHZhbHVlIGB0YCBpbnRvXG4gICAgICogcmFuZ2UuXG4gICAgICogQHBhcmFtIHQgLSBUaGUgdmFsdWUgdG8gYmUgdGVzdGVkLlxuICAgICAqIEByZXR1cm5zIFRoZSBtaW5pbXVtIGV4dGVudCBvZiB0aGUgcmFuZ2UgaWYgYHRgIGlzIGJlbG93IHRoZSByYW5nZSBvclxuICAgICAqIHRoZSBtYXhpbXVtIGV4dGVudCBvZiB0aGUgcmFuZ2UgaWYgYHRgIGlzIGFib3ZlIHRoZSByYW5nZS4gIFJldHVybnNcbiAgICAgKiBgdW5kZWZpbmVkYCBpZiBgdGAgYWxyZWFkeSBmYWxscyB3aXRoaW4gdGhlIHJhbmdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kVHJhbnNpdGlvbih0OiBUKTogVHx1bmRlZmluZWQge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY2hlY2sodCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2xlc3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1pbjtcbiAgICAgICAgICAgIGNhc2UgJ2luY2x1ZGVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBvZiB0aGlzIHJhbmdlLlxuICAgICAqIEBwYXJhbSBmb3JtYXQgLSBBIGZvcm1hdCBmdW5jdGlvbiB1c2VkIHRvIGZvcm1hdCB0aGUgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIEEge0BsaW5rIFJhbmdlT2ZQcm9wZXJ0aWVzIHwgUmFuZ2VPZlByb3BlcnRpZXM8c3RyaW5nPn0gY29udGFuaW5nIHRoZVxuICAgICAqIGZvcm1hdHRlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUge0BsaW5rIFJhbmdlT2YubWluIHwgbWluaW11bX0gYW5kIHtAbGluayBSYW5nZU9mLm1heCB8IG1heGltdW19XG4gICAgICogZXh0ZW50IG9mIHRoZSByYW5nZSwgb3IgYHVuZGVmaW5lZGAgZm9yIGFuIGV4dGVudCB0aGF0IGlzIG5vdCBwcmVzZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyB0b0Zvcm1hdHRlZFByb3BlcnRpZXMoZm9ybWF0OiAodmFsdWU6IFQpID0+IHN0cmluZ3x1bmRlZmluZWQpOiBSYW5nZU9mUHJvcGVydGllczxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1pbjogKHRoaXMubWluICE9PSB1bmRlZmluZWQpID8gZm9ybWF0KHRoaXMubWluKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG1heDogKHRoaXMubWF4ICE9PSB1bmRlZmluZWQpID8gZm9ybWF0KHRoaXMubWF4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIHRoaXMgcmFuZ2UgdXNpbmcgdGhlIHN1cHBsaWVkIGZvcm1hdCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0gZm9ybWF0IC0gRm9ybWF0IGZ1bmN0aW9uIHVzZWQgdG8gZm9ybWF0IG1pbmltdW0gYW5kIG1heGl1bXVtIGV4dGVudCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIGZvcm1hdHMgLSBUaGUge0BsaW5rIFJhbmdlT2ZGb3JtYXRzIHwgZm9ybWF0IHN0cmluZ3N9IHVzZWQgdG8gZm9ybWF0IHRoZSByYW5nZVxuICAgICAqIChkZWZhdWx0IHtAbGluayBERUZBVUxUX1JBTkdFT0ZfRk9STUFUU30pLlxuICAgICAqIEByZXR1cm5zIFJldHVybnMgYSBmb3JtYXR0ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyByYW5nZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9ybWF0KGZvcm1hdDogKHZhbHVlOiBUKSA9PiBzdHJpbmd8dW5kZWZpbmVkLCBmb3JtYXRzPzogUmFuZ2VPZkZvcm1hdHMpOiBzdHJpbmd8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlT2YucHJvcGVydGllc1RvU3RyaW5nKHRoaXMudG9Gb3JtYXR0ZWRQcm9wZXJ0aWVzKGZvcm1hdCksIGZvcm1hdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElubmVyIGNvbXBhcmUgbWV0aG9kIGNhbiBiZSBvdmVycmlkZW4gYnkgYSBkZXJpdmVkIGNsYXNzLlxuICAgICAqIEBwYXJhbSB0MSAtIEZpcnN0IHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHQyIC0gU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMgYCdsZXNzJ2AgaWYgYHQxYCBpcyBsZXNzIHRoYW4gYHQyYCwgYCdncmVhdGVyJ2AgaWYgYHQxYCBpcyBsYXJnZXJcbiAgICAgKiBhbmQgYCdlcXVhbCdgIGlmIGB0MWAgYW5kIGB0MmAgYXJlIGVxdWFsLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY29tcGFyZSh0MTogVCwgdDI6IFQpOiAnbGVzcyd8J2VxdWFsJ3wnZ3JlYXRlcicge1xuICAgICAgICByZXR1cm4gUmFuZ2VPZi5fZGVmYXVsdENvbXBhcmUodDEsIHQyKTtcbiAgICB9XG59XG4iXX0=

@@ -24,2 +24,3 @@ <div align="center">

- [Installation](#installation)
- [API Documentation](#api-documentation)
- [Overview](#overview)

@@ -44,2 +45,5 @@ - [The Result Pattern](#the-result-pattern)

## API Documentation
Extracted API documentation is [here](./docs/ts-utils.md).
## Overview

@@ -46,0 +50,0 @@ ### The Result Pattern

@@ -0,122 +1,474 @@

/**
* Represents the {@link IResult | result} of some operation or sequence of operations.
* @remarks
* {@link Success | Success<T>} and {@link Failure | Failure<T>} share the common
* contract {@link IResult}, enabling comingled discriminated usage.
* @public
*/
export declare type Result<T> = Success<T> | Failure<T>;
/**
* Continuation callback to be called in the event that an
* {@link Result} is successful.
* @public
*/
export declare type SuccessContinuation<T, TN> = (value: T) => Result<TN>;
/**
* Continuation callback to be called in the event that an
* {@link Result} fails.
* @public
*/
export declare type FailureContinuation<T> = (message: string) => Result<T>;
/**
* Type inference to determine the result type of an {@link Result}.
* @beta
*/
export declare type ResultValueType<T> = T extends Result<infer TV> ? TV : never;
/**
* Simple logger interface used by {@link IResult.getValueOrThrow}.
* @public
*/
export interface IResultLogger {
/**
* Log an error message.
* @param message - The message to be logged.
*/
error(message: string): void;
}
/**
* Represents the result of some operation of sequence of operations.
* @remarks
* This common contract enables comingled discriminated usage of {@link Success | Success<T>}
* and {@link Failure | Failure<T>}.
* @public
*/
export interface IResult<T> {
/**
* Indicates whether the operation was successful.
*/
readonly success: boolean;
/**
* Indicates whether this operation was successful. Functions
* as a type guard for {@link Success | Success<T>}.
*/
isSuccess(): this is Success<T>;
/**
* Indicates whether this operation failed. Functions
* as a type guard for {@link Failure | Failure<T>}.
*/
isFailure(): this is Failure<T>;
/**
* Gets the value associated with a successful {@link IResult | result},
* or throws the error message if the corresponding operation failed.
* @param logger - An optional {@link IResultLogger | logger} to which the
* error will also be reported.
* @returns The return value, if the operation was successful.
* @throws The error message if the operation failed.
*/
getValueOrThrow(logger?: IResultLogger): T;
/**
* Gets the value associated with a successful {@link IResult | result},
* or a default value if the corresponding operation failed.
* @param dflt - The value to be returned if the operation failed (default is
* `undefined`).
* @returns The return value, if the operation was successful. Returns
* the supplied default value or `undefined` if no default is supplied.
*/
getValueOrDefault(dflt?: T): T | undefined;
/**
* Calls a supplied {@link SuccessContinuation | success continuation} if
* the operation was a success.
* @remarks
* The {@link SuccessContinuation | success continuation} might return a
* different result type than {@link IResult} on which it is invoked. This
* enables chaining of operations with heterogenous return types.
*
* @param cb - The {@link SuccessContinuation | success continuation} to
* be called in the event of success.
* @returns If this operation was successful, returns the value returned
* by the {@link SuccessContinuation | success continuation}. If this result
* failed, propagates the error message from this failure.
*/
onSuccess<TN>(cb: SuccessContinuation<T, TN>): Result<TN>;
/**
* Calls a supplied {@link FailureContinuation | failed continuation} if
* the operation failed.
* @param cb - The {@link FailureContinuation | failure continuation} to
* be called in the event of failure.
* @returns If this operation failed, returns the value returned by the
* {@link FailureContinuation | failure continuation}. If this result
* was successful, propagates the result value from the successful event.
*/
onFailure(cb: FailureContinuation<T>): Result<T>;
/**
* Converts a {@link IResult | IResult<T>} to a {@link DetailedResult | DetailedResult<T, TD>},
* adding a supplied detail if the operation failed.
* @param detail - The detail to be added if this operation failed.
* @returns A new {@link DetailedResult | DetailedResult<T, TD>} with either
* the success result or the error message from this {@link IResult}, with
* the supplied detail (if this event failed) or detail `undefined` (if
* this result succeeded).
*/
withFailureDetail<TD>(detail: TD): DetailedResult<T, TD>;
/**
* Converts a {@link IResult | IResult<T>} to a {@link DetailedResult | DetailedResult<T, TD>},
* adding supplied details.
* @param detail - The default detail to be added to the new {@link DetailedResult}.
* @param successDetail - An optional detail to be added if this result was successful.
* @returns A new {@link DetailedResult | DetailedResult<T, TD>} with either
* the success result or the error message from this {@link IResult} and the
* appopriate added detail.
*/
withDetail<TD>(detail: TD, successDetail?: TD): DetailedResult<T, TD>;
}
/**
* Reports a successful {@link IResult | result} from some operation and the
* corresponding value.
* @public
*/
export declare class Success<T> implements IResult<T> {
/**
* {@inheritdoc IResult.success}
*/
readonly success = true;
/**
* @internal
*/
private readonly _value;
/**
* Constructs a {@link Success} with the supplied value.
* @param value - The value to be returned.
*/
constructor(value: T);
/**
* The result value returned by the successful operation.
*/
get value(): T;
/**
* {@inheritdoc IResult.isSuccess}
*/
isSuccess(): this is Success<T>;
/**
* {@inheritdoc IResult.isFailure}
*/
isFailure(): this is Failure<T>;
get value(): T;
/**
* {@inheritdoc IResult.getValueOrThrow}
*/
getValueOrThrow(_logger?: IResultLogger): T;
/**
* {@inheritdoc IResult.getValueOrDefault}
*/
getValueOrDefault(dflt?: T): T | undefined;
/**
* {@inheritdoc IResult.onSuccess}
*/
onSuccess<TN>(cb: SuccessContinuation<T, TN>): Result<TN>;
/**
* {@inheritdoc IResult.onFailure}
*/
onFailure(_: FailureContinuation<T>): Result<T>;
/**
* {@inheritdoc IResult.withFailureDetail}
*/
withFailureDetail<TD>(_detail: TD): DetailedResult<T, TD>;
/**
* {@inheritdoc IResult.withDetail}
*/
withDetail<TD>(detail: TD, successDetail?: TD): DetailedResult<T, TD>;
}
/**
* Reports a failed {@link IResult | result} from some operation, with an error message.
* @public
*/
export declare class Failure<T> implements IResult<T> {
/**
* {@inheritdoc IResult.success}
*/
readonly success = false;
/**
* @internal
*/
private readonly _message;
/**
* Constructs a {@link Failure} with the supplied message.
* @param message - Error message to be reported.
*/
constructor(message: string);
/**
* Gets the error message associated with this error.
*/
get message(): string;
/**
* {@inheritdoc IResult.isSuccess}
*/
isSuccess(): this is Success<T>;
/**
* {@inheritdoc IResult.isFailure}
*/
isFailure(): this is Failure<T>;
get message(): string;
/**
* {@inheritdoc IResult.getValueOrThrow}
*/
getValueOrThrow(logger?: IResultLogger): never;
/**
* {@inheritdoc IResult.getValueOrDefault}
*/
getValueOrDefault(dflt?: T): T | undefined;
/**
* {@inheritdoc IResult.onSuccess}
*/
onSuccess<TN>(_: SuccessContinuation<T, TN>): Result<TN>;
/**
* {@inheritdoc IResult.onFailure}
*/
onFailure(cb: FailureContinuation<T>): Result<T>;
/**
* {@inheritdoc IResult.withFailureDetail}
*/
withFailureDetail<TD>(detail: TD): DetailedResult<T, TD>;
/**
* {@inheritdoc IResult.withDetail}
*/
withDetail<TD>(detail: TD, _successDetail?: TD): DetailedResult<T, TD>;
/**
* Get a 'friendly' string representation of this object.
* @remarks
* The string representation of a {@link Failure} value is the error message.
* @returns A string representing this object.
*/
toString(): string;
}
/**
* Helper function for successful return
* @param val The value to be returned
* Returns {@link Success | Success<T>} with the supplied result value.
* @param value - The successful result value to be returned
* @public
*/
export declare function succeed<T>(val: T): Success<T>;
export declare function succeed<T>(value: T): Success<T>;
/**
* Helper function for error return
* @param message Error message to be returned
* Returns {@link Failure | Failure<T>} with the supplied error message.
* @param message - Error message to be returned.
* @public
*/
export declare function fail<T>(message: string): Failure<T>;
/**
* Callback to be called when a {@link DetailedResult} encounters success.
* @remarks
* A success callback can return a different result type than it receives, allowing
* success results to chain through intermediate result types.
* @public
*/
export declare type DetailedSuccessContinuation<T, TD, TN> = (value: T, detail?: TD) => DetailedResult<TN, TD>;
/**
* Callback to be called when a {@link DetailedResult} encounters a failure.
* @remarks
* A failure callback can change {@link Failure} to {@link Success} (e.g. by returning a default value)
* or it can change or embellish the error message, but it cannot change the success return type.
* @public
*/
export declare type DetailedFailureContinuation<T, TD> = (message: string, detail: TD) => DetailedResult<T, TD>;
/**
* A {@link DetailedSuccess} extends {@link Success} to report optional success details in
* addition to the error message.
* @public
*/
export declare class DetailedSuccess<T, TD> extends Success<T> {
/**
* @internal
*/
protected _detail?: TD;
/**
* Constructs a new {@link DetailedSuccess | DetailedSuccess<T, TD>} with the supplied
* value and detail.
* @param value - The value to be returned.
* @param detail - An optional successful detail to be returned. If omitted, detail
* will be `undefined`.
*/
constructor(value: T, detail?: TD);
/**
* The success detail associated with this {@link DetailedSuccess}, or `undefined` if
* no detail was supplied.
*/
get detail(): TD | undefined;
/**
* Reports that this {@link DetailedSuccess} is a success.
* @remarks
* Always true for {@link DetailedSuccess} but can be used as type guard
* to discriminate {@link DetailedSuccess} from {@link DetailedFailure} in
* a {@link DetailedResult}.
* @returns `true`
*/
isSuccess(): this is DetailedSuccess<T, TD>;
/**
* Invokes the supplied {@link DetailedSuccessContinuation | success callback} and propagates
* its returned {@link DetailedResult | DetailedResult<TN, TD>}.
* @remarks
* The success callback mutates the return type from `<T>` to `<TN>`.
* @param cb - The {@link DetailedSuccessContinuation | success callback} to be invoked.
* @returns The {@link DetailedResult | DetailedResult<T, TD>} returned by the success callback.
*/
onSuccess<TN>(cb: DetailedSuccessContinuation<T, TD, TN>): DetailedResult<TN, TD>;
/**
* Propagates this {@link DetailedSuccess}.
* @remarks
* Failure does not mutate return type so we can return this event directly.
* @param _cb - {@link DetailedFailureContinuation | Failure callback} to be called
* on a {@link DetailedResult} in case of failure (ignored).
* @returns `this`
*/
onFailure(_cb: DetailedFailureContinuation<T, TD>): DetailedResult<T, TD>;
}
/**
* A DetailedFailure reports optional failure details in addition
* to the standard failure message.
* A {@link DetailedFailure} extends {@link Failure} to report optional failure details in
* addition to the error message.
* @public
*/
export declare class DetailedFailure<T, TD> extends Failure<T> {
/**
* @internal
*/
protected _detail: TD;
/**
* Constructs a new {@link DetailedFailure | DetailedFailure<T, TD>} with the supplied
* message and detail.
* @param message - The message to be returned.
* @param detail - The error detail to be returned.
*/
constructor(message: string, detail: TD);
/**
* The error detail associated with this {@link DetailedFailure}.
*/
get detail(): TD;
/**
* Reports that this {@link DetailedFailure} is a failure.
* @remarks
* Always true for {@link DetailedFailure} but can be used as type guard
* to discriminate {@link DetailedSuccess} from {@link DetailedFailure} in
* a {@link DetailedResult}.
* @returns `true`
*/
isFailure(): this is DetailedFailure<T, TD>;
/**
* Propagates the error message and detail from this result.
* @remarks
* Mutates the success type as the success callback would have, but does not
* call the success callback.
* @param _cb - {@link DetailedSuccessContinuation | Success callback} to be called
* on a {@link DetailedResult} in case of success (ignored).
* @returns A new {@link DetailedFailure | DetailedFailure<TN, TD>} which contains
* the error message and detail from this one.
*/
onSuccess<TN>(_cb: DetailedSuccessContinuation<T, TD, TN>): DetailedResult<TN, TD>;
/**
* Invokes the supplied {@link DetailedFailureContinuation | failure callback} and propagates
* its returned {@link DetailedResult | DetailedResult<T, TD>}.
* @param cb - The {@link DetailedFailureContinuation | failure callback} to be invoked.
* @returns The {@link DetailedResult | DetailedResult<T, TD>} returned by the failure callback.
*/
onFailure(cb: DetailedFailureContinuation<T, TD>): DetailedResult<T, TD>;
}
/**
* Type inference to determine the result type `T` of a {@link DetailedResult | DetailedResult<T, TD>}.
* @beta
*/
export declare type DetailedResult<T, TD> = DetailedSuccess<T, TD> | DetailedFailure<T, TD>;
/**
* Type inference to determine the detail type `TD` of a {@link DetailedResult | DetailedResult<T, TD>}.
* @beta
*/
export declare type ResultDetailType<T> = T extends DetailedResult<unknown, infer TD> ? TD : never;
/**
* Returns {@link DetailedSuccess | DetailedSuccess<T, TD>} with a supplied value and optional
* detail.
* @param value - The value of type `<T>` to be returned.
* @param detail - An optional detail of type `<TD>` to be returned.
* @returns A {@link DetailedSuccess | DetailedSuccess<T, TD>} with the supplied value
* and detail, if supplied.
* @public
*/
export declare function succeedWithDetail<T, TD>(value: T, detail?: TD): DetailedSuccess<T, TD>;
/**
* Returns {@link DetailedFailure | DetailedFailure<T, TD>} with a supplied error message and detail.
* @param message - The error message to be returned.
* @param detail - The event detail to be returned.
* @returns An {@link DetailedFailure | DetailedFailure<T, TD>} with the supplied error
* message and detail.
* @public
*/
export declare function failWithDetail<T, TD>(message: string, detail: TD): DetailedFailure<T, TD>;
/**
* Propagates a {@link Success} or {@link Failure} {@link Result}, adding supplied
* event details as appropriate.
* @param result - The {@link Result} to be propagated.
* @param detail - The event detail (type `<TD>`) to be added to the {@link Result | result}.
* @param successDetail - An optional distinct event detail to be added to {@link Success} results. If `successDetail`
* is omitted or `undefined`, then `detail` will be applied to {@link Success} results.
* @returns A new {@link DetailedResult | DetailedResult<T, TD>} with the success value or error
* message from the original `result` but with the specified detail added.
* @public
*/
export declare function propagateWithDetail<T, TD>(result: Result<T>, detail: TD, successDetail?: TD): DetailedResult<T, TD>;
/**
* Wraps a function which returns a value of type <T> or throws
* to produce Success<T> or Failure<T>
* @param func The method to be captured
* Wraps a function which might throw to convert exception results
* to {@link Failure}.
* @param func - The function to be captured.
* @returns Returns {@link Success} with a value of type `<T>` on
* success , or {@link Failure} with the thrown error message if
* `func` throws an `Error`.
* @public
*/
export declare function captureResult<T>(func: () => T): Result<T>;
/**
* Maps an array of Result<T> to an array of <T>, if all results are
* successful. If any results fail, returns failure with a concatenated
* summary of all failure messages.
* @param resultsIn The results to be mapped.
* Aggregates sucessful result values from a collection of {@link Result | Result<T>}.
* @param results - The collection of {@link Result | Result<T>} to be mapped.
* @returns If all {@link Result | results} are successful, returns {@link Success} with an
* array containing all returned values. If any {@link Result | results} failed, returns
* {@link Failure} with a concatenated summary of all error messages.
* @public
*/
export declare function mapResults<T>(resultsIn: Iterable<Result<T>>): Result<T[]>;
export declare function mapResults<T>(results: Iterable<Result<T>>): Result<T[]>;
/**
* Maps an array of DetailedResult<T, TD> to an array of <T>, if all results are
* successful or yield ignorable errors. If any results fail with an error that
* cannot be ignored, returns failure with a concatenated summary of all failure messages.
* @param resultsIn The results to be mapped.
* @param ignore Error detail values that should be ignored
* Aggregates sucessful results from a collection of {@link DetailedResult | DetailedResult<T, TD>},
* optionally ignoring certain error details.
* @param results - The collection of {@link DetailedResult | DetailedResult<T, TD>} to be mapped.
* @param ignore - An array of error detail values (of type `<TD>`) that should be ignored.
* @returns {@link Success} with an array containing all successful results if all results either
* suceeded or returned error details listed in `ignore`. If any results failed with details
* that cannot be ignored, returns {@link Failure} with an concatenated summary of all non-ignorable
* error mesasges.
* @public
*/
export declare function mapDetailedResults<T, TD>(resultsIn: Iterable<DetailedResult<T, TD>>, ignore: TD[]): Result<T[]>;
export declare function mapDetailedResults<T, TD>(results: Iterable<DetailedResult<T, TD>>, ignore: TD[]): Result<T[]>;
/**
* Maps an array of Result<T> to an array of <T>, omitting any error
* results. If no results were successful, returns failure with a
* concatenated summary of all failure messages.
* Aggregates successful results from a a collection of {@link Result | Result<T>}.
* @param results - An `Iterable` of {@link Result | Result<T>} from which success
* results are to be aggregated.
* @returns {@link Success} with an array of `<T>` if any results were successful. If
* all {@link Result | results} failed, returns {@link Failure} with a concatenated
* summary of all error messages.
* @public
*/
export declare function mapSuccess<T>(resultsIn: Iterable<Result<T>>): Result<T[]>;
export declare function mapSuccess<T>(results: Iterable<Result<T>>): Result<T[]>;
/**
* Maps an array of Result<T> to an array of strings consisting of all
* error messages returned by results in the source array. Ignores
* success results and returns an empty array if there were no errors.
* @param resultsIn results to be reported
* Aggregates error messages from a collection of {@link Result | Result<T>}.
* @param results - An interable collection of {@link Result | Result<T>} for which
* error messages are aggregated.
* @returns An array of strings consisting of all error messages returned by
* {@link Result | results} in the source collection. Ignores {@link Success}
* results and returns an empty array if there were no errors.
* @public
*/
export declare function mapFailures<T>(resultsIn: Iterable<Result<T>>): string[];
export declare function mapFailures<T>(results: Iterable<Result<T>>): string[];
/**
* Returns success with true if all results are successful. If any are unsuccessful,
* returns failure with a concatenated summary of all failure messages.
* @param results The results to be tested.
* Determines if an iterable collection of {@link Result | Result<T>} were all successful.
* @param results - The collection of {@link Result | Result<T>} to be tested.
* @returns Returns {@link Success} with `true` if all {@link Result | results} are successful.
* If any are unsuccessful, returns {@link Failure} with a concatenated summary the error
* messages from all failed elements.
* @public
*/
export declare function allSucceed<T>(results: Iterable<Result<unknown>>, successValue: T): Result<T>;
/**
* String-keyed record of initialization functions to be passed to {@link populateObject}.
* @public
*/
export declare type FieldInitializers<T> = {

@@ -126,8 +478,10 @@ [key in keyof T]: (state: Partial<T>) => Result<T[key]>;

/**
* Populates an an object based on a prototype full of field initializers that return Result<T[key]>.
* Returns success with the populated object if all initializers succeed, or failure with a
* concatenated list of all failure messages.
* @param initializers An object with the shape of the target but with initializer functions for
* Populates an an object based on a prototype full of field initializers that return {@link Result | Result<T[key]>}.
* Returns {@link Success} with the populated object if all initializers succeed, or {@link Failure} with a
* concatenated list of all error messages.
* @param initializers - An object with the shape of the target but with initializer functions for
* each property.
* @public
*/
export declare function populateObject<T>(initializers: FieldInitializers<T>, order?: (keyof T)[]): Result<T>;
//# sourceMappingURL=result.d.ts.map

@@ -25,18 +25,46 @@ "use strict";

exports.populateObject = exports.allSucceed = exports.mapFailures = exports.mapSuccess = exports.mapDetailedResults = exports.mapResults = exports.captureResult = exports.propagateWithDetail = exports.failWithDetail = exports.succeedWithDetail = exports.DetailedFailure = exports.DetailedSuccess = exports.fail = exports.succeed = exports.Failure = exports.Success = void 0;
/**
* Reports a successful {@link IResult | result} from some operation and the
* corresponding value.
* @public
*/
class Success {
/**
* Constructs a {@link Success} with the supplied value.
* @param value - The value to be returned.
*/
constructor(value) {
/**
* {@inheritdoc IResult.success}
*/
this.success = true;
this._value = value;
}
/**
* The result value returned by the successful operation.
*/
get value() {
return this._value;
}
/**
* {@inheritdoc IResult.isSuccess}
*/
isSuccess() {
return true;
}
/**
* {@inheritdoc IResult.isFailure}
*/
isFailure() {
return false;
}
get value() {
return this._value;
}
/**
* {@inheritdoc IResult.getValueOrThrow}
*/
getValueOrThrow(_logger) {
return this._value;
}
/**
* {@inheritdoc IResult.getValueOrDefault}
*/
getValueOrDefault(dflt) {

@@ -46,11 +74,23 @@ var _a;

}
/**
* {@inheritdoc IResult.onSuccess}
*/
onSuccess(cb) {
return cb(this.value);
}
/**
* {@inheritdoc IResult.onFailure}
*/
onFailure(_) {
return this;
}
/**
* {@inheritdoc IResult.withFailureDetail}
*/
withFailureDetail(_detail) {
return succeedWithDetail(this.value);
}
/**
* {@inheritdoc IResult.withDetail}
*/
withDetail(detail, successDetail) {

@@ -61,15 +101,39 @@ return succeedWithDetail(this.value, successDetail !== null && successDetail !== void 0 ? successDetail : detail);

exports.Success = Success;
/**
* Reports a failed {@link IResult | result} from some operation, with an error message.
* @public
*/
class Failure {
/**
* Constructs a {@link Failure} with the supplied message.
* @param message - Error message to be reported.
*/
constructor(message) {
/**
* {@inheritdoc IResult.success}
*/
this.success = false;
this._message = message;
}
/**
* Gets the error message associated with this error.
*/
get message() {
return this._message;
}
/**
* {@inheritdoc IResult.isSuccess}
*/
isSuccess() {
return false;
}
/**
* {@inheritdoc IResult.isFailure}
*/
isFailure() {
return true;
}
get message() {
return this._message;
}
/**
* {@inheritdoc IResult.getValueOrThrow}
*/
getValueOrThrow(logger) {

@@ -81,17 +145,38 @@ if (logger !== undefined) {

}
/**
* {@inheritdoc IResult.getValueOrDefault}
*/
getValueOrDefault(dflt) {
return dflt;
}
/**
* {@inheritdoc IResult.onSuccess}
*/
onSuccess(_) {
return new Failure(this.message);
}
/**
* {@inheritdoc IResult.onFailure}
*/
onFailure(cb) {
return cb(this.message);
}
/**
* {@inheritdoc IResult.withFailureDetail}
*/
withFailureDetail(detail) {
return failWithDetail(this.message, detail);
}
/**
* {@inheritdoc IResult.withDetail}
*/
withDetail(detail, _successDetail) {
return failWithDetail(this.message, detail);
}
/**
* Get a 'friendly' string representation of this object.
* @remarks
* The string representation of a {@link Failure} value is the error message.
* @returns A string representing this object.
*/
toString() {

@@ -103,12 +188,14 @@ return this.message;

/**
* Helper function for successful return
* @param val The value to be returned
* Returns {@link Success | Success<T>} with the supplied result value.
* @param value - The successful result value to be returned
* @public
*/
function succeed(val) {
return new Success(val);
function succeed(value) {
return new Success(value);
}
exports.succeed = succeed;
/**
* Helper function for error return
* @param message Error message to be returned
* Returns {@link Failure | Failure<T>} with the supplied error message.
* @param message - Error message to be returned.
* @public
*/

@@ -119,3 +206,15 @@ function fail(message) {

exports.fail = fail;
/**
* A {@link DetailedSuccess} extends {@link Success} to report optional success details in
* addition to the error message.
* @public
*/
class DetailedSuccess extends Success {
/**
* Constructs a new {@link DetailedSuccess | DetailedSuccess<T, TD>} with the supplied
* value and detail.
* @param value - The value to be returned.
* @param detail - An optional successful detail to be returned. If omitted, detail
* will be `undefined`.
*/
constructor(value, detail) {

@@ -125,11 +224,39 @@ super(value);

}
/**
* The success detail associated with this {@link DetailedSuccess}, or `undefined` if
* no detail was supplied.
*/
get detail() {
return this._detail;
}
/**
* Reports that this {@link DetailedSuccess} is a success.
* @remarks
* Always true for {@link DetailedSuccess} but can be used as type guard
* to discriminate {@link DetailedSuccess} from {@link DetailedFailure} in
* a {@link DetailedResult}.
* @returns `true`
*/
isSuccess() {
return true;
}
/**
* Invokes the supplied {@link DetailedSuccessContinuation | success callback} and propagates
* its returned {@link DetailedResult | DetailedResult<TN, TD>}.
* @remarks
* The success callback mutates the return type from `<T>` to `<TN>`.
* @param cb - The {@link DetailedSuccessContinuation | success callback} to be invoked.
* @returns The {@link DetailedResult | DetailedResult<T, TD>} returned by the success callback.
*/
onSuccess(cb) {
return cb(this.value, this._detail);
}
/**
* Propagates this {@link DetailedSuccess}.
* @remarks
* Failure does not mutate return type so we can return this event directly.
* @param _cb - {@link DetailedFailureContinuation | Failure callback} to be called
* on a {@link DetailedResult} in case of failure (ignored).
* @returns `this`
*/
onFailure(_cb) {

@@ -141,6 +268,13 @@ return this;

/**
* A DetailedFailure reports optional failure details in addition
* to the standard failure message.
* A {@link DetailedFailure} extends {@link Failure} to report optional failure details in
* addition to the error message.
* @public
*/
class DetailedFailure extends Failure {
/**
* Constructs a new {@link DetailedFailure | DetailedFailure<T, TD>} with the supplied
* message and detail.
* @param message - The message to be returned.
* @param detail - The error detail to be returned.
*/
constructor(message, detail) {

@@ -150,11 +284,38 @@ super(message);

}
/**
* The error detail associated with this {@link DetailedFailure}.
*/
get detail() {
return this._detail;
}
/**
* Reports that this {@link DetailedFailure} is a failure.
* @remarks
* Always true for {@link DetailedFailure} but can be used as type guard
* to discriminate {@link DetailedSuccess} from {@link DetailedFailure} in
* a {@link DetailedResult}.
* @returns `true`
*/
isFailure() {
return true;
}
/**
* Propagates the error message and detail from this result.
* @remarks
* Mutates the success type as the success callback would have, but does not
* call the success callback.
* @param _cb - {@link DetailedSuccessContinuation | Success callback} to be called
* on a {@link DetailedResult} in case of success (ignored).
* @returns A new {@link DetailedFailure | DetailedFailure<TN, TD>} which contains
* the error message and detail from this one.
*/
onSuccess(_cb) {
return new DetailedFailure(this.message, this._detail);
}
/**
* Invokes the supplied {@link DetailedFailureContinuation | failure callback} and propagates
* its returned {@link DetailedResult | DetailedResult<T, TD>}.
* @param cb - The {@link DetailedFailureContinuation | failure callback} to be invoked.
* @returns The {@link DetailedResult | DetailedResult<T, TD>} returned by the failure callback.
*/
onFailure(cb) {

@@ -165,2 +326,11 @@ return cb(this.message, this._detail);

exports.DetailedFailure = DetailedFailure;
/**
* Returns {@link DetailedSuccess | DetailedSuccess<T, TD>} with a supplied value and optional
* detail.
* @param value - The value of type `<T>` to be returned.
* @param detail - An optional detail of type `<TD>` to be returned.
* @returns A {@link DetailedSuccess | DetailedSuccess<T, TD>} with the supplied value
* and detail, if supplied.
* @public
*/
function succeedWithDetail(value, detail) {

@@ -170,2 +340,10 @@ return new DetailedSuccess(value, detail);

exports.succeedWithDetail = succeedWithDetail;
/**
* Returns {@link DetailedFailure | DetailedFailure<T, TD>} with a supplied error message and detail.
* @param message - The error message to be returned.
* @param detail - The event detail to be returned.
* @returns An {@link DetailedFailure | DetailedFailure<T, TD>} with the supplied error
* message and detail.
* @public
*/
function failWithDetail(message, detail) {

@@ -175,2 +353,13 @@ return new DetailedFailure(message, detail);

exports.failWithDetail = failWithDetail;
/**
* Propagates a {@link Success} or {@link Failure} {@link Result}, adding supplied
* event details as appropriate.
* @param result - The {@link Result} to be propagated.
* @param detail - The event detail (type `<TD>`) to be added to the {@link Result | result}.
* @param successDetail - An optional distinct event detail to be added to {@link Success} results. If `successDetail`
* is omitted or `undefined`, then `detail` will be applied to {@link Success} results.
* @returns A new {@link DetailedResult | DetailedResult<T, TD>} with the success value or error
* message from the original `result` but with the specified detail added.
* @public
*/
function propagateWithDetail(result, detail, successDetail) {

@@ -183,5 +372,9 @@ return result.isSuccess()

/**
* Wraps a function which returns a value of type <T> or throws
* to produce Success<T> or Failure<T>
* @param func The method to be captured
* Wraps a function which might throw to convert exception results
* to {@link Failure}.
* @param func - The function to be captured.
* @returns Returns {@link Success} with a value of type `<T>` on
* success , or {@link Failure} with the thrown error message if
* `func` throws an `Error`.
* @public
*/

@@ -198,11 +391,13 @@ function captureResult(func) {

/**
* Maps an array of Result<T> to an array of <T>, if all results are
* successful. If any results fail, returns failure with a concatenated
* summary of all failure messages.
* @param resultsIn The results to be mapped.
* Aggregates sucessful result values from a collection of {@link Result | Result<T>}.
* @param results - The collection of {@link Result | Result<T>} to be mapped.
* @returns If all {@link Result | results} are successful, returns {@link Success} with an
* array containing all returned values. If any {@link Result | results} failed, returns
* {@link Failure} with a concatenated summary of all error messages.
* @public
*/
function mapResults(resultsIn) {
function mapResults(results) {
const errors = [];
const elements = [];
for (const result of resultsIn) {
for (const result of results) {
if (result.isSuccess()) {

@@ -222,12 +417,16 @@ elements.push(result.value);

/**
* Maps an array of DetailedResult<T, TD> to an array of <T>, if all results are
* successful or yield ignorable errors. If any results fail with an error that
* cannot be ignored, returns failure with a concatenated summary of all failure messages.
* @param resultsIn The results to be mapped.
* @param ignore Error detail values that should be ignored
* Aggregates sucessful results from a collection of {@link DetailedResult | DetailedResult<T, TD>},
* optionally ignoring certain error details.
* @param results - The collection of {@link DetailedResult | DetailedResult<T, TD>} to be mapped.
* @param ignore - An array of error detail values (of type `<TD>`) that should be ignored.
* @returns {@link Success} with an array containing all successful results if all results either
* suceeded or returned error details listed in `ignore`. If any results failed with details
* that cannot be ignored, returns {@link Failure} with an concatenated summary of all non-ignorable
* error mesasges.
* @public
*/
function mapDetailedResults(resultsIn, ignore) {
function mapDetailedResults(results, ignore) {
const errors = [];
const elements = [];
for (const result of resultsIn) {
for (const result of results) {
if (result.isSuccess()) {

@@ -247,10 +446,14 @@ elements.push(result.value);

/**
* Maps an array of Result<T> to an array of <T>, omitting any error
* results. If no results were successful, returns failure with a
* concatenated summary of all failure messages.
* Aggregates successful results from a a collection of {@link Result | Result<T>}.
* @param results - An `Iterable` of {@link Result | Result<T>} from which success
* results are to be aggregated.
* @returns {@link Success} with an array of `<T>` if any results were successful. If
* all {@link Result | results} failed, returns {@link Failure} with a concatenated
* summary of all error messages.
* @public
*/
function mapSuccess(resultsIn) {
function mapSuccess(results) {
const errors = [];
const elements = [];
for (const result of resultsIn) {
for (const result of results) {
if (result.isSuccess()) {

@@ -270,10 +473,13 @@ elements.push(result.value);

/**
* Maps an array of Result<T> to an array of strings consisting of all
* error messages returned by results in the source array. Ignores
* success results and returns an empty array if there were no errors.
* @param resultsIn results to be reported
* Aggregates error messages from a collection of {@link Result | Result<T>}.
* @param results - An interable collection of {@link Result | Result<T>} for which
* error messages are aggregated.
* @returns An array of strings consisting of all error messages returned by
* {@link Result | results} in the source collection. Ignores {@link Success}
* results and returns an empty array if there were no errors.
* @public
*/
function mapFailures(resultsIn) {
function mapFailures(results) {
const errors = [];
for (const result of resultsIn) {
for (const result of results) {
if (result.isFailure()) {

@@ -287,5 +493,8 @@ errors.push(result.message);

/**
* Returns success with true if all results are successful. If any are unsuccessful,
* returns failure with a concatenated summary of all failure messages.
* @param results The results to be tested.
* Determines if an iterable collection of {@link Result | Result<T>} were all successful.
* @param results - The collection of {@link Result | Result<T>} to be tested.
* @returns Returns {@link Success} with `true` if all {@link Result | results} are successful.
* If any are unsuccessful, returns {@link Failure} with a concatenated summary the error
* messages from all failed elements.
* @public
*/

@@ -309,7 +518,8 @@ function allSucceed(results, successValue) {

/**
* Populates an an object based on a prototype full of field initializers that return Result<T[key]>.
* Returns success with the populated object if all initializers succeed, or failure with a
* concatenated list of all failure messages.
* @param initializers An object with the shape of the target but with initializer functions for
* Populates an an object based on a prototype full of field initializers that return {@link Result | Result<T[key]>}.
* Returns {@link Success} with the populated object if all initializers succeed, or {@link Failure} with a
* concatenated list of all error messages.
* @param initializers - An object with the shape of the target but with initializer functions for
* each property.
* @public
*/

@@ -348,2 +558,2 @@ function populateObject(initializers, order) {

exports.populateObject = populateObject;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Jlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUF1QkgsTUFBYSxPQUFPO0lBR2hCLFlBQVksS0FBUTtRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRU0sU0FBUztRQUNaLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxTQUFTO1FBQ1osT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELElBQVcsS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRU0sZUFBZSxDQUFDLE9BQXVCO1FBQzFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRU0saUJBQWlCLENBQUMsSUFBUTs7UUFDN0IsT0FBTyxNQUFBLElBQUksQ0FBQyxNQUFNLG1DQUFJLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRU0sU0FBUyxDQUFLLEVBQThCO1FBQy9DLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRU0sU0FBUyxDQUFDLENBQXlCO1FBQ3RDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxpQkFBaUIsQ0FBSyxPQUFXO1FBQ3BDLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTSxVQUFVLENBQUssTUFBVSxFQUFFLGFBQWtCO1FBQ2hELE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLGFBQWIsYUFBYSxjQUFiLGFBQWEsR0FBSSxNQUFNLENBQUMsQ0FBQztJQUNsRSxDQUFDO0NBQ0o7QUExQ0QsMEJBMENDO0FBRUQsTUFBYSxPQUFPO0lBR2hCLFlBQVksT0FBZTtRQUN2QixJQUFJLENB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RCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMvQjtTQUNKO2FBQ0k7WUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLG9DQUFvQyxDQUFDLENBQUM7U0FDL0U7S0FDSjtJQUVELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDbkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ2xDO0lBQ0QsT0FBTyxPQUFPLENBQUMsS0FBVSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQWpDRCx3Q0FpQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbmV4cG9ydCB0eXBlIFJlc3VsdDxUPiA9IFN1Y2Nlc3M8VD4gfCBGYWlsdXJlPFQ+O1xuZXhwb3J0IHR5cGUgU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBUTj4gPSAodmFsdWU6IFQpID0+IFJlc3VsdDxUTj47XG5leHBvcnQgdHlwZSBGYWlsdXJlQ29udGludWF0aW9uPFQ+ID0gKG1lc3NhZ2U6IHN0cmluZykgPT4gUmVzdWx0PFQ+O1xuZXhwb3J0IHR5cGUgUmVzdWx0VmFsdWVUeXBlPFQ+ID0gVCBleHRlbmRzIFJlc3VsdDxpbmZlciBUVj4gPyBUViA6IG5ldmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZXN1bHRMb2dnZXIge1xuICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlc3VsdDxUPiB7XG4gICAgaXNTdWNjZXNzKCk6IHRoaXMgaXMgU3VjY2VzczxUPjtcbiAgICBpc0ZhaWx1cmUoKTogdGhpcyBpcyBGYWlsdXJlPFQ+O1xuICAgIGdldFZhbHVlT3JUaHJvdyhsb2dnZXI/OiBJUmVzdWx0TG9nZ2VyKTogVDtcbiAgICBnZXRWYWx1ZU9yRGVmYXVsdChkZmx0PzogVCk6IFR8dW5kZWZpbmVkO1xuICAgIG9uU3VjY2VzczxUTj4oY2I6IFN1Y2Nlc3NDb250aW51YXRpb248VCwgVE4+KTogUmVzdWx0PFROPjtcbiAgICBvbkZhaWx1cmUoY2I6IEZhaWx1cmVDb250aW51YXRpb248VD4pOiBSZXN1bHQ8VD47XG4gICAgd2l0aEZhaWx1cmVEZXRhaWw8VEQ+KGRldGFpbDogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD47XG4gICAgd2l0aERldGFpbDxURD4oZGV0YWlsOiBURCwgc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+O1xufVxuXG5leHBvcnQgY2xhc3MgU3VjY2VzczxUPiBpbXBsZW1lbnRzIElSZXN1bHQ8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ZhbHVlOiBUO1xuXG4gICAgY29uc3RydWN0b3IodmFsdWU6IFQpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTdWNjZXNzKCk6IHRoaXMgaXMgU3VjY2VzczxUPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ZhaWx1cmUoKTogdGhpcyBpcyBGYWlsdXJlPFQ+IHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VmFsdWVPclRocm93KF9sb2dnZXI/OiBJUmVzdWx0TG9nZ2VyKTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VmFsdWVPckRlZmF1bHQoZGZsdD86IFQpOiBUfHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZSA/PyBkZmx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBvblN1Y2Nlc3M8VE4+KGNiOiBTdWNjZXNzQ29udGludWF0aW9uPFQsIFROPik6IFJlc3VsdDxUTj4ge1xuICAgICAgICByZXR1cm4gY2IodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRmFpbHVyZShfOiBGYWlsdXJlQ29udGludWF0aW9uPFQ+KTogUmVzdWx0PFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhGYWlsdXJlRGV0YWlsPFREPihfZGV0YWlsOiBURCk6IERldGFpbGVkUmVzdWx0PFQsIFREPiB7XG4gICAgICAgIHJldHVybiBzdWNjZWVkV2l0aERldGFpbCh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERldGFpbDxURD4oZGV0YWlsOiBURCwgc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWRXaXRoRGV0YWlsKHRoaXMudmFsdWUsIHN1Y2Nlc3NEZXRhaWwgPz8gZGV0YWlsKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGYWlsdXJlPFQ+IGltcGxlbWVudHMgSVJlc3VsdDxUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWVzc2FnZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1N1Y2Nlc3MoKTogdGhpcyBpcyBTdWNjZXNzPFQ+IHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ZhaWx1cmUoKTogdGhpcyBpcyBGYWlsdXJlPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRWYWx1ZU9yVGhyb3cobG9nZ2VyPzogSVJlc3VsdExvZ2dlcik6IG5ldmVyIHtcbiAgICAgICAgaWYgKGxvZ2dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IodGhpcy5fbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuX21lc3NhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRWYWx1ZU9yRGVmYXVsdChkZmx0PzogVCk6IFR8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGRmbHQ7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU3VjY2VzczxUTj4oXzogU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBUTj4pOiBSZXN1bHQ8VE4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWlsdXJlKHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRmFpbHVyZShjYjogRmFpbHVyZUNvbnRpbnVhdGlvbjxUPik6IFJlc3VsdDxUPiB7XG4gICAgICAgIHJldHVybiBjYih0aGlzLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRmFpbHVyZURldGFpbDxURD4oZGV0YWlsOiBURCk6IERldGFpbGVkUmVzdWx0PFQsIFREPiB7XG4gICAgICAgIHJldHVybiBmYWlsV2l0aERldGFpbCh0aGlzLm1lc3NhZ2UsIGRldGFpbCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEZXRhaWw8VEQ+KGRldGFpbDogVEQsIF9zdWNjZXNzRGV0YWlsPzogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gZmFpbFdpdGhEZXRhaWwodGhpcy5tZXNzYWdlLCBkZXRhaWwpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHN1Y2Nlc3NmdWwgcmV0dXJuXG4gKiBAcGFyYW0gdmFsIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VjY2VlZDxUPih2YWw6IFQpOiBTdWNjZXNzPFQ+IHtcbiAgICByZXR1cm4gbmV3IFN1Y2Nlc3M8VD4odmFsKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGVycm9yIHJldHVyblxuICogQHBhcmFtIG1lc3NhZ2UgRXJyb3IgbWVzc2FnZSB0byBiZSByZXR1cm5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFpbDxUPihtZXNzYWdlOiBzdHJpbmcpOiBGYWlsdXJlPFQ+IHtcbiAgICByZXR1cm4gbmV3IEZhaWx1cmU8VD4obWVzc2FnZSk7XG59XG5cbmV4cG9ydCB0eXBlIERldGFpbGVkU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBURCwgVE4+ID0gKHZhbHVlOiBULCBkZXRhaWw/OiBURCkgPT4gRGV0YWlsZWRSZXN1bHQ8VE4sIFREPjtcbmV4cG9ydCB0eXBlIERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbjxULCBURD4gPSAobWVzc2FnZTogc3RyaW5nLCBkZXRhaWw6IFREKSA9PiBEZXRhaWxlZFJlc3VsdDxULCBURD47XG5cbmV4cG9ydCBjbGFzcyBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+IGV4dGVuZHMgU3VjY2VzczxUPiB7XG4gICAgcHJvdGVjdGVkIF9kZXRhaWw/OiBURDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih2YWx1ZTogVCwgZGV0YWlsPzogVEQpIHtcbiAgICAgICAgc3VwZXIodmFsdWUpO1xuICAgICAgICB0aGlzLl9kZXRhaWwgPSBkZXRhaWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZXRhaWwoKTogVER8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RldGFpbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTdWNjZXNzKCk6IHRoaXMgaXMgRGV0YWlsZWRTdWNjZXNzPFQsIFREPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblN1Y2Nlc3M8VE4+KGNiOiBEZXRhaWxlZFN1Y2Nlc3NDb250aW51YXRpb248VCwgVEQsIFROPik6IERldGFpbGVkUmVzdWx0PFROLCBURD4ge1xuICAgICAgICByZXR1cm4gY2IodGhpcy52YWx1ZSwgdGhpcy5fZGV0YWlsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25GYWlsdXJlKF9jYjogRGV0YWlsZWRGYWlsdXJlQ29udGludWF0aW9uPFQsIFREPik6IERldGFpbGVkUmVzdWx0PFQsIFREPiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIERldGFpbGVkRmFpbHVyZSByZXBvcnRzIG9wdGlvbmFsIGZhaWx1cmUgZGV0YWlscyBpbiBhZGRpdGlvblxuICogdG8gdGhlIHN0YW5kYXJkIGZhaWx1cmUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIERldGFpbGVkRmFpbHVyZTxULCBURD4gZXh0ZW5kcyBGYWlsdXJlPFQ+IHtcbiAgICBwcm90ZWN0ZWQgX2RldGFpbDogVEQ7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBkZXRhaWw6IFREKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLl9kZXRhaWwgPSBkZXRhaWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZXRhaWwoKTogVEQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGV0YWlsO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ZhaWx1cmUoKTogdGhpcyBpcyBEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU3VjY2VzczxUTj4oX2NiOiBEZXRhaWxlZFN1Y2Nlc3NDb250aW51YXRpb248VCwgVEQsIFROPik6IERldGFpbGVkUmVzdWx0PFROLCBURD4ge1xuICAgICAgICByZXR1cm4gbmV3IERldGFpbGVkRmFpbHVyZTxUTiwgVEQ+KHRoaXMubWVzc2FnZSwgdGhpcy5fZGV0YWlsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25GYWlsdXJlKGNiOiBEZXRhaWxlZEZhaWx1cmVDb250aW51YXRpb248VCwgVEQ+KTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIGNiKHRoaXMubWVzc2FnZSwgdGhpcy5fZGV0YWlsKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIERldGFpbGVkUmVzdWx0PFQsIFREPiA9IERldGFpbGVkU3VjY2VzczxULCBURD58RGV0YWlsZWRGYWlsdXJlPFQsIFREPjtcbmV4cG9ydCB0eXBlIFJlc3VsdERldGFpbFR5cGU8VD4gPSBUIGV4dGVuZHMgRGV0YWlsZWRSZXN1bHQ8dW5rbm93biwgaW5mZXIgVEQ+ID8gVEQgOiBuZXZlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN1Y2NlZWRXaXRoRGV0YWlsPFQsIFREPih2YWx1ZTogVCwgZGV0YWlsPzogVEQpOiBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+IHtcbiAgICByZXR1cm4gbmV3IERldGFpbGVkU3VjY2VzczxULCBURD4odmFsdWUsIGRldGFpbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmYWlsV2l0aERldGFpbDxULCBURD4obWVzc2FnZTogc3RyaW5nLCBkZXRhaWw6IFREKTogRGV0YWlsZWRGYWlsdXJlPFQsIFREPiB7XG4gICAgcmV0dXJuIG5ldyBEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+KG1lc3NhZ2UsIGRldGFpbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wYWdhdGVXaXRoRGV0YWlsPFQsIFREPihyZXN1bHQ6IFJlc3VsdDxUPiwgZGV0YWlsOiBURCwgc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICByZXR1cm4gcmVzdWx0LmlzU3VjY2VzcygpXG4gICAgICAgID8gc3VjY2VlZFdpdGhEZXRhaWwocmVzdWx0LnZhbHVlLCBzdWNjZXNzRGV0YWlsID8/IGRldGFpbClcbiAgICAgICAgOiBmYWlsV2l0aERldGFpbChyZXN1bHQubWVzc2FnZSwgZGV0YWlsKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSB2YWx1ZSBvZiB0eXBlIDxUPiBvciB0aHJvd3NcbiAqIHRvIHByb2R1Y2UgU3VjY2VzczxUPiBvciBGYWlsdXJlPFQ+XG4gKiBAcGFyYW0gZnVuYyBUaGUgbWV0aG9kIHRvIGJlIGNhcHR1cmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlUmVzdWx0PFQ+KGZ1bmM6ICgpID0+IFQpOiBSZXN1bHQ8VD4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzdWNjZWVkKGZ1bmMoKSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoKGVyciBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIE1hcHMgYW4gYXJyYXkgb2YgUmVzdWx0PFQ+IHRvIGFuIGFycmF5IG9mIDxUPiwgaWYgYWxsIHJlc3VsdHMgYXJlXG4gKiBzdWNjZXNzZnVsLiAgSWYgYW55IHJlc3VsdHMgZmFpbCwgcmV0dXJucyBmYWlsdXJlIHdpdGggYSBjb25jYXRlbmF0ZWRcbiAqIHN1bW1hcnkgb2YgYWxsIGZhaWx1cmUgbWVzc2FnZXMuXG4gKiBAcGFyYW0gcmVzdWx0c0luIFRoZSByZXN1bHRzIHRvIGJlIG1hcHBlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFJlc3VsdHM8VD4ocmVzdWx0c0luOiBJdGVyYWJsZTxSZXN1bHQ8VD4+KTogUmVzdWx0PFRbXT4ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBlbGVtZW50czogVFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzSW4pIHtcbiAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgZWxlbWVudHMucHVzaChyZXN1bHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKGVsZW1lbnRzKTtcbn1cblxuLyoqXG4gKiBNYXBzIGFuIGFycmF5IG9mIERldGFpbGVkUmVzdWx0PFQsIFREPiB0byBhbiBhcnJheSBvZiA8VD4sIGlmIGFsbCByZXN1bHRzIGFyZVxuICogc3VjY2Vzc2Z1bCBvciB5aWVsZCBpZ25vcmFibGUgZXJyb3JzLiAgSWYgYW55IHJlc3VsdHMgZmFpbCB3aXRoIGFuIGVycm9yIHRoYXRcbiAqIGNhbm5vdCBiZSBpZ25vcmVkLCByZXR1cm5zIGZhaWx1cmUgd2l0aCBhIGNvbmNhdGVuYXRlZCBzdW1tYXJ5IG9mIGFsbCBmYWlsdXJlIG1lc3NhZ2VzLlxuICogQHBhcmFtIHJlc3VsdHNJbiBUaGUgcmVzdWx0cyB0byBiZSBtYXBwZWQuXG4gKiBAcGFyYW0gaWdub3JlIEVycm9yIGRldGFpbCB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgaWdub3JlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwRGV0YWlsZWRSZXN1bHRzPFQsIFREPihyZXN1bHRzSW46IEl0ZXJhYmxlPERldGFpbGVkUmVzdWx0PFQsIFREPj4sIGlnbm9yZTogVERbXSk6IFJlc3VsdDxUW10+IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZWxlbWVudHM6IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0c0luKSB7XG4gICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaWdub3JlLmluY2x1ZGVzKHJlc3VsdC5kZXRhaWwpKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoZWxlbWVudHMpO1xufVxuXG4vKipcbiAqIE1hcHMgYW4gYXJyYXkgb2YgUmVzdWx0PFQ+IHRvIGFuIGFycmF5IG9mIDxUPiwgb21pdHRpbmcgYW55IGVycm9yXG4gKiByZXN1bHRzLiAgSWYgbm8gcmVzdWx0cyB3ZXJlIHN1Y2Nlc3NmdWwsIHJldHVybnMgZmFpbHVyZSB3aXRoIGFcbiAqIGNvbmNhdGVuYXRlZCBzdW1tYXJ5IG9mIGFsbCBmYWlsdXJlIG1lc3NhZ2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwU3VjY2VzczxUPihyZXN1bHRzSW46IEl0ZXJhYmxlPFJlc3VsdDxUPj4pOiBSZXN1bHQ8VFtdPiB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGVsZW1lbnRzOiBUW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHNJbikge1xuICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgJiYgKGVycm9ycy5sZW5ndGggPiAwKSkge1xuICAgICAgICByZXR1cm4gZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VlZChlbGVtZW50cyk7XG59XG5cbi8qKlxuICogTWFwcyBhbiBhcnJheSBvZiBSZXN1bHQ8VD4gdG8gYW4gYXJyYXkgb2Ygc3RyaW5ncyBjb25zaXN0aW5nIG9mIGFsbFxuICogZXJyb3IgbWVzc2FnZXMgcmV0dXJuZWQgYnkgcmVzdWx0cyBpbiB0aGUgc291cmNlIGFycmF5LiBJZ25vcmVzXG4gKiBzdWNjZXNzIHJlc3VsdHMgYW5kIHJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgd2VyZSBubyBlcnJvcnMuXG4gKiBAcGFyYW0gcmVzdWx0c0luIHJlc3VsdHMgdG8gYmUgcmVwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcEZhaWx1cmVzPFQ+KHJlc3VsdHNJbjogSXRlcmFibGU8UmVzdWx0PFQ+Pik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0c0luKSB7XG4gICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuXG4vKipcbiAqIFJldHVybnMgc3VjY2VzcyB3aXRoIHRydWUgaWYgYWxsIHJlc3VsdHMgYXJlIHN1Y2Nlc3NmdWwuICBJZiBhbnkgYXJlIHVuc3VjY2Vzc2Z1bCxcbiAqIHJldHVybnMgZmFpbHVyZSB3aXRoIGEgY29uY2F0ZW5hdGVkIHN1bW1hcnkgb2YgYWxsIGZhaWx1cmUgbWVzc2FnZXMuXG4gKiBAcGFyYW0gcmVzdWx0cyBUaGUgcmVzdWx0cyB0byBiZSB0ZXN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGxTdWNjZWVkPFQ+KHJlc3VsdHM6IEl0ZXJhYmxlPFJlc3VsdDx1bmtub3duPj4sIHN1Y2Nlc3NWYWx1ZTogVCk6IFJlc3VsdDxUPiB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICBpZiAocmVzdWx0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoc3VjY2Vzc1ZhbHVlKTtcbn1cblxuZXhwb3J0IHR5cGUgRmllbGRJbml0aWFsaXplcnM8VD4gPSB7IFsga2V5IGluIGtleW9mIFQgXTogKHN0YXRlOiBQYXJ0aWFsPFQ+KSA9PiBSZXN1bHQ8VFtrZXldPiB9O1xuXG4vKipcbiAqIFBvcHVsYXRlcyBhbiBhbiBvYmplY3QgYmFzZWQgb24gYSBwcm90b3R5cGUgZnVsbCBvZiBmaWVsZCBpbml0aWFsaXplcnMgdGhhdCByZXR1cm4gUmVzdWx0PFRba2V5XT4uXG4gKiBSZXR1cm5zIHN1Y2Nlc3Mgd2l0aCB0aGUgcG9wdWxhdGVkIG9iamVjdCBpZiBhbGwgaW5pdGlhbGl6ZXJzIHN1Y2NlZWQsIG9yIGZhaWx1cmUgd2l0aCBhXG4gKiBjb25jYXRlbmF0ZWQgbGlzdCBvZiBhbGwgZmFpbHVyZSBtZXNzYWdlcy5cbiAqIEBwYXJhbSBpbml0aWFsaXplcnMgQW4gb2JqZWN0IHdpdGggdGhlIHNoYXBlIG9mIHRoZSB0YXJnZXQgYnV0IHdpdGggaW5pdGlhbGl6ZXIgZnVuY3Rpb25zIGZvclxuICogZWFjaCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvcHVsYXRlT2JqZWN0PFQ+KGluaXRpYWxpemVyczogRmllbGRJbml0aWFsaXplcnM8VD4sIG9yZGVyPzogKGtleW9mIFQpW10pOiBSZXN1bHQ8VD4ge1xuICAgIGNvbnN0IHN0YXRlID0ge30gYXMgeyBba2V5IGluIGtleW9mIFRdOiBUW2tleV0gfTtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qga2V5czogKGtleW9mIFQpW10gPSBBcnJheS5mcm9tKG9yZGVyID8/IFtdKTtcbiAgICBjb25zdCBmb3VuZEtleXMgPSBuZXcgU2V0PGtleW9mIFQ+KG9yZGVyKTtcblxuICAgIC8vIHN0YXJ0IHdpdGggdGhlIHN1cHBsaWVkIG9yZGVyIHRoZW4gYXBwZW5kIGFueXRoaW5nIGVsc2Ugd2UgZmluZFxuICAgIGZvciAoY29uc3Qga2V5IGluIGluaXRpYWxpemVycykge1xuICAgICAgICBpZiAoIWZvdW5kS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICBmb3VuZEtleXMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGlmIChpbml0aWFsaXplcnNba2V5XSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gaW5pdGlhbGl6ZXJzW2tleV0oc3RhdGUpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgIHN0YXRlW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChgcG9wdWxhdGVPYmplY3Q6IEtleSAke2tleX0gaXMgcHJlc2VudCBidXQgaGFzIG5vIGluaXRpYWxpemVyYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoc3RhdGUgYXMgVCk7XG59XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Jlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUF3SUg7Ozs7R0FJRztBQUNILE1BQWEsT0FBTztJQVVoQjs7O09BR0c7SUFDSCxZQUFZLEtBQVE7UUFicEI7O1dBRUc7UUFDYSxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBVzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ1osT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNaLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxPQUF1QjtRQUMxQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCLENBQUMsSUFBUTs7UUFDN0IsT0FBTyxNQUFBLElBQUksQ0FBQyxNQUFNLG1DQUFJLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTLENBQUssRUFBOEI7UUFDL0MsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBQyxDQUF5QjtRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUIsQ0FBSyxPQUFXO1FBQ3BDLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBSyxNQUFVLEVBQUUsYUFBa0I7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Z2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qKlxuICogUmVwcmVzZW50cyB0aGUge0BsaW5rIElSZXN1bHQgfCByZXN1bHR9IG9mIHNvbWUgb3BlcmF0aW9uIG9yIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMuXG4gKiBAcmVtYXJrc1xuICoge0BsaW5rIFN1Y2Nlc3MgfCBTdWNjZXNzPFQ+fSBhbmQge0BsaW5rIEZhaWx1cmUgfCBGYWlsdXJlPFQ+fSBzaGFyZSB0aGUgY29tbW9uXG4gKiBjb250cmFjdCB7QGxpbmsgSVJlc3VsdH0sIGVuYWJsaW5nIGNvbWluZ2xlZCBkaXNjcmltaW5hdGVkIHVzYWdlLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBSZXN1bHQ8VD4gPSBTdWNjZXNzPFQ+IHwgRmFpbHVyZTxUPjtcbi8qKlxuICogQ29udGludWF0aW9uIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBpbiB0aGUgZXZlbnQgdGhhdCBhblxuICoge0BsaW5rIFJlc3VsdH0gaXMgc3VjY2Vzc2Z1bC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBUTj4gPSAodmFsdWU6IFQpID0+IFJlc3VsdDxUTj47XG4vKipcbiAqIENvbnRpbnVhdGlvbiBjYWxsYmFjayB0byBiZSBjYWxsZWQgaW4gdGhlIGV2ZW50IHRoYXQgYW5cbiAqIHtAbGluayBSZXN1bHR9IGZhaWxzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBGYWlsdXJlQ29udGludWF0aW9uPFQ+ID0gKG1lc3NhZ2U6IHN0cmluZykgPT4gUmVzdWx0PFQ+O1xuLyoqXG4gKiBUeXBlIGluZmVyZW5jZSB0byBkZXRlcm1pbmUgdGhlIHJlc3VsdCB0eXBlIG9mIGFuIHtAbGluayBSZXN1bHR9LlxuICogQGJldGFcbiAqL1xuZXhwb3J0IHR5cGUgUmVzdWx0VmFsdWVUeXBlPFQ+ID0gVCBleHRlbmRzIFJlc3VsdDxpbmZlciBUVj4gPyBUViA6IG5ldmVyO1xuXG4vKipcbiAqIFNpbXBsZSBsb2dnZXIgaW50ZXJmYWNlIHVzZWQgYnkge0BsaW5rIElSZXN1bHQuZ2V0VmFsdWVPclRocm93fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUmVzdWx0TG9nZ2VyIHtcbiAgICAvKipcbiAgICAgKiBMb2cgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKi9cbiAgICBlcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBzb21lIG9wZXJhdGlvbiBvZiBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zLlxuICogQHJlbWFya3NcbiAqIFRoaXMgY29tbW9uIGNvbnRyYWN0IGVuYWJsZXMgY29taW5nbGVkIGRpc2NyaW1pbmF0ZWQgdXNhZ2Ugb2Yge0BsaW5rIFN1Y2Nlc3MgfCBTdWNjZXNzPFQ+fVxuICogYW5kIHtAbGluayBGYWlsdXJlIHwgRmFpbHVyZTxUPn0uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVJlc3VsdDxUPiB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAgICAgKi9cbiAgICByZWFkb25seSBzdWNjZXNzOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuICBGdW5jdGlvbnNcbiAgICAgKiBhcyBhIHR5cGUgZ3VhcmQgZm9yIHtAbGluayBTdWNjZXNzIHwgU3VjY2VzczxUPn0uXG4gICAgICovXG4gICAgaXNTdWNjZXNzKCk6IHRoaXMgaXMgU3VjY2VzczxUPjtcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIGZhaWxlZC4gIEZ1bmN0aW9uc1xuICAgICAqIGFzIGEgdHlwZSBndWFyZCBmb3Ige0BsaW5rIEZhaWx1cmUgfCBGYWlsdXJlPFQ+fS5cbiAgICAgKi9cbiAgICBpc0ZhaWx1cmUoKTogdGhpcyBpcyBGYWlsdXJlPFQ+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgc3VjY2Vzc2Z1bCB7QGxpbmsgSVJlc3VsdCB8IHJlc3VsdH0sXG4gICAgICogb3IgdGhyb3dzIHRoZSBlcnJvciBtZXNzYWdlIGlmIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBmYWlsZWQuXG4gICAgICogQHBhcmFtIGxvZ2dlciAtIEFuIG9wdGlvbmFsIHtAbGluayBJUmVzdWx0TG9nZ2VyIHwgbG9nZ2VyfSB0byB3aGljaCB0aGVcbiAgICAgKiBlcnJvciB3aWxsIGFsc28gYmUgcmVwb3J0ZWQuXG4gICAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSwgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAgICAgKiBAdGhyb3dzIFRoZSBlcnJvciBtZXNzYWdlIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkLlxuICAgICAqL1xuICAgIGdldFZhbHVlT3JUaHJvdyhsb2dnZXI/OiBJUmVzdWx0TG9nZ2VyKTogVDtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHN1Y2Nlc3NmdWwge0BsaW5rIElSZXN1bHQgfCByZXN1bHR9LFxuICAgICAqIG9yIGEgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gZmFpbGVkLlxuICAgICAqIEBwYXJhbSBkZmx0IC0gVGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkIChkZWZhdWx0IGlzXG4gICAgICogYHVuZGVmaW5lZGApLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUsIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuICBSZXR1cm5zXG4gICAgICogdGhlIHN1cHBsaWVkIGRlZmF1bHQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgaWYgbm8gZGVmYXVsdCBpcyBzdXBwbGllZC5cbiAgICAgKi9cbiAgICBnZXRWYWx1ZU9yRGVmYXVsdChkZmx0PzogVCk6IFR8dW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgYSBzdXBwbGllZCB7QGxpbmsgU3VjY2Vzc0NvbnRpbnVhdGlvbiB8IHN1Y2Nlc3MgY29udGludWF0aW9ufSBpZlxuICAgICAqIHRoZSBvcGVyYXRpb24gd2FzIGEgc3VjY2Vzcy5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSB7QGxpbmsgU3VjY2Vzc0NvbnRpbnVhdGlvbiB8IHN1Y2Nlc3MgY29udGludWF0aW9ufSBtaWdodCByZXR1cm4gYVxuICAgICAqIGRpZmZlcmVudCByZXN1bHQgdHlwZSB0aGFuIHtAbGluayBJUmVzdWx0fSBvbiB3aGljaCBpdCBpcyBpbnZva2VkLiBUaGlzXG4gICAgICogZW5hYmxlcyBjaGFpbmluZyBvZiBvcGVyYXRpb25zIHdpdGggaGV0ZXJvZ2Vub3VzIHJldHVybiB0eXBlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYiAtIFRoZSB7QGxpbmsgU3VjY2Vzc0NvbnRpbnVhdGlvbiB8IHN1Y2Nlc3MgY29udGludWF0aW9ufSB0b1xuICAgICAqIGJlIGNhbGxlZCBpbiB0aGUgZXZlbnQgb2Ygc3VjY2Vzcy5cbiAgICAgKiBAcmV0dXJucyBJZiB0aGlzIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgcmV0dXJucyB0aGUgdmFsdWUgcmV0dXJuZWRcbiAgICAgKiBieSB0aGUge0BsaW5rIFN1Y2Nlc3NDb250aW51YXRpb24gfCBzdWNjZXNzIGNvbnRpbnVhdGlvbn0uICBJZiB0aGlzIHJlc3VsdFxuICAgICAqIGZhaWxlZCwgcHJvcGFnYXRlcyB0aGUgZXJyb3IgbWVzc2FnZSBmcm9tIHRoaXMgZmFpbHVyZS5cbiAgICAgKi9cbiAgICBvblN1Y2Nlc3M8VE4+KGNiOiBTdWNjZXNzQ29udGludWF0aW9uPFQsIFROPik6IFJlc3VsdDxUTj47XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBhIHN1cHBsaWVkIHtAbGluayBGYWlsdXJlQ29udGludWF0aW9uIHwgZmFpbGVkIGNvbnRpbnVhdGlvbn0gaWZcbiAgICAgKiB0aGUgb3BlcmF0aW9uIGZhaWxlZC5cbiAgICAgKiBAcGFyYW0gY2IgLSBUaGUge0BsaW5rIEZhaWx1cmVDb250aW51YXRpb24gfCBmYWlsdXJlIGNvbnRpbnVhdGlvbn0gdG9cbiAgICAgKiBiZSBjYWxsZWQgaW4gdGhlIGV2ZW50IG9mIGZhaWx1cmUuXG4gICAgICogQHJldHVybnMgSWYgdGhpcyBvcGVyYXRpb24gZmFpbGVkLCByZXR1cm5zIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGVcbiAgICAgKiB7QGxpbmsgRmFpbHVyZUNvbnRpbnVhdGlvbiB8IGZhaWx1cmUgY29udGludWF0aW9ufS4gIElmIHRoaXMgcmVzdWx0XG4gICAgICogd2FzIHN1Y2Nlc3NmdWwsIHByb3BhZ2F0ZXMgdGhlIHJlc3VsdCB2YWx1ZSBmcm9tIHRoZSBzdWNjZXNzZnVsIGV2ZW50LlxuICAgICAqL1xuICAgIG9uRmFpbHVyZShjYjogRmFpbHVyZUNvbnRpbnVhdGlvbjxUPik6IFJlc3VsdDxUPjtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEge0BsaW5rIElSZXN1bHQgfCBJUmVzdWx0PFQ+fSB0byBhIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0sXG4gICAgICogYWRkaW5nIGEgc3VwcGxpZWQgZGV0YWlsIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgLSBUaGUgZGV0YWlsIHRvIGJlIGFkZGVkIGlmIHRoaXMgb3BlcmF0aW9uIGZhaWxlZC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHdpdGggZWl0aGVyXG4gICAgICogdGhlIHN1Y2Nlc3MgcmVzdWx0IG9yIHRoZSBlcnJvciBtZXNzYWdlIGZyb20gdGhpcyB7QGxpbmsgSVJlc3VsdH0sIHdpdGhcbiAgICAgKiB0aGUgc3VwcGxpZWQgZGV0YWlsIChpZiB0aGlzIGV2ZW50IGZhaWxlZCkgb3IgZGV0YWlsIGB1bmRlZmluZWRgIChpZlxuICAgICAqIHRoaXMgcmVzdWx0IHN1Y2NlZWRlZCkuXG4gICAgICovXG4gICAgd2l0aEZhaWx1cmVEZXRhaWw8VEQ+KGRldGFpbDogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD47XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIHtAbGluayBJUmVzdWx0IHwgSVJlc3VsdDxUPn0gdG8gYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59LFxuICAgICAqIGFkZGluZyBzdXBwbGllZCBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgLSBUaGUgZGVmYXVsdCBkZXRhaWwgdG8gYmUgYWRkZWQgdG8gdGhlIG5ldyB7QGxpbmsgRGV0YWlsZWRSZXN1bHR9LlxuICAgICAqIEBwYXJhbSBzdWNjZXNzRGV0YWlsIC0gQW4gb3B0aW9uYWwgZGV0YWlsIHRvIGJlIGFkZGVkIGlmIHRoaXMgcmVzdWx0IHdhcyBzdWNjZXNzZnVsLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0gd2l0aCBlaXRoZXJcbiAgICAgKiB0aGUgc3VjY2VzcyByZXN1bHQgb3IgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGlzIHtAbGluayBJUmVzdWx0fSBhbmQgdGhlXG4gICAgICogYXBwb3ByaWF0ZSBhZGRlZCBkZXRhaWwuXG4gICAgICovXG4gICAgd2l0aERldGFpbDxURD4oZGV0YWlsOiBURCwgc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+O1xufVxuXG4vKipcbiAqIFJlcG9ydHMgYSBzdWNjZXNzZnVsIHtAbGluayBJUmVzdWx0IHwgcmVzdWx0fSBmcm9tIHNvbWUgb3BlcmF0aW9uIGFuZCB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgdmFsdWUuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBTdWNjZXNzPFQ+IGltcGxlbWVudHMgSVJlc3VsdDxUPiB7XG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuc3VjY2Vzc31cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc3VjY2VzcyA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdmFsdWU6IFQ7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHN1cHBsaWVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogVCkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSByZXN1bHQgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5pc1N1Y2Nlc3N9XG4gICAgICovXG4gICAgcHVibGljIGlzU3VjY2VzcygpOiB0aGlzIGlzIFN1Y2Nlc3M8VD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5pc0ZhaWx1cmV9XG4gICAgICovXG4gICAgcHVibGljIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuZ2V0VmFsdWVPclRocm93fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZU9yVGhyb3coX2xvZ2dlcj86IElSZXN1bHRMb2dnZXIpOiBUIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmdldFZhbHVlT3JEZWZhdWx0fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZU9yRGVmYXVsdChkZmx0PzogVCk6IFR8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlID8/IGRmbHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQub25TdWNjZXNzfVxuICAgICAqL1xuICAgIHB1YmxpYyBvblN1Y2Nlc3M8VE4+KGNiOiBTdWNjZXNzQ29udGludWF0aW9uPFQsIFROPik6IFJlc3VsdDxUTj4ge1xuICAgICAgICByZXR1cm4gY2IodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQub25GYWlsdXJlfVxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZhaWx1cmUoXzogRmFpbHVyZUNvbnRpbnVhdGlvbjxUPik6IFJlc3VsdDxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LndpdGhGYWlsdXJlRGV0YWlsfVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRmFpbHVyZURldGFpbDxURD4oX2RldGFpbDogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gc3VjY2VlZFdpdGhEZXRhaWwodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQud2l0aERldGFpbH1cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aERldGFpbDxURD4oZGV0YWlsOiBURCwgc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWRXaXRoRGV0YWlsKHRoaXMudmFsdWUsIHN1Y2Nlc3NEZXRhaWwgPz8gZGV0YWlsKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVwb3J0cyBhIGZhaWxlZCB7QGxpbmsgSVJlc3VsdCB8IHJlc3VsdH0gZnJvbSBzb21lIG9wZXJhdGlvbiwgd2l0aCBhbiBlcnJvciBtZXNzYWdlLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRmFpbHVyZTxUPiBpbXBsZW1lbnRzIElSZXN1bHQ8VD4ge1xuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LnN1Y2Nlc3N9XG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX21lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSB7QGxpbmsgRmFpbHVyZX0gd2l0aCB0aGUgc3VwcGxpZWQgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UgdG8gYmUgcmVwb3J0ZWQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVycm9yIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3IuXG4gICAgICovXG4gICAgcHVibGljIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmlzU3VjY2Vzc31cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdWNjZXNzKCk6IHRoaXMgaXMgU3VjY2VzczxUPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5pc0ZhaWx1cmV9XG4gICAgICovXG4gICAgcHVibGljIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5nZXRWYWx1ZU9yVGhyb3d9XG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVlT3JUaHJvdyhsb2dnZXI/OiBJUmVzdWx0TG9nZ2VyKTogbmV2ZXIge1xuICAgICAgICBpZiAobG9nZ2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcih0aGlzLl9tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5fbWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuZ2V0VmFsdWVPckRlZmF1bHR9XG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVlT3JEZWZhdWx0KGRmbHQ/OiBUKTogVHx1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gZGZsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5vblN1Y2Nlc3N9XG4gICAgICovXG4gICAgcHVibGljIG9uU3VjY2VzczxUTj4oXzogU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBUTj4pOiBSZXN1bHQ8VE4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBGYWlsdXJlKHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQub25GYWlsdXJlfVxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZhaWx1cmUoY2I6IEZhaWx1cmVDb250aW51YXRpb248VD4pOiBSZXN1bHQ8VD4ge1xuICAgICAgICByZXR1cm4gY2IodGhpcy5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC53aXRoRmFpbHVyZURldGFpbH1cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEZhaWx1cmVEZXRhaWw8VEQ+KGRldGFpbDogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gZmFpbFdpdGhEZXRhaWwodGhpcy5tZXNzYWdlLCBkZXRhaWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LndpdGhEZXRhaWx9XG4gICAgICovXG4gICAgcHVibGljIHdpdGhEZXRhaWw8VEQ+KGRldGFpbDogVEQsIF9zdWNjZXNzRGV0YWlsPzogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gZmFpbFdpdGhEZXRhaWwodGhpcy5tZXNzYWdlLCBkZXRhaWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhICdmcmllbmRseScgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBGYWlsdXJlfSB2YWx1ZSBpcyB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMge0BsaW5rIFN1Y2Nlc3MgfCBTdWNjZXNzPFQ+fSB3aXRoIHRoZSBzdXBwbGllZCByZXN1bHQgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgc3VjY2Vzc2Z1bCByZXN1bHQgdmFsdWUgdG8gYmUgcmV0dXJuZWRcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1Y2NlZWQ8VD4odmFsdWU6IFQpOiBTdWNjZXNzPFQ+IHtcbiAgICByZXR1cm4gbmV3IFN1Y2Nlc3M8VD4odmFsdWUpO1xufVxuXG4vKipcbiAqIFJldHVybnMge0BsaW5rIEZhaWx1cmUgfCBGYWlsdXJlPFQ+fSB3aXRoIHRoZSBzdXBwbGllZCBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGJlIHJldHVybmVkLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmFpbDxUPihtZXNzYWdlOiBzdHJpbmcpOiBGYWlsdXJlPFQ+IHtcbiAgICByZXR1cm4gbmV3IEZhaWx1cmU8VD4obWVzc2FnZSk7XG59XG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHR9IGVuY291bnRlcnMgc3VjY2Vzcy5cbiAqIEByZW1hcmtzXG4gKiBBIHN1Y2Nlc3MgY2FsbGJhY2sgY2FuIHJldHVybiBhIGRpZmZlcmVudCByZXN1bHQgdHlwZSB0aGFuIGl0IHJlY2VpdmVzLCBhbGxvd2luZ1xuICogc3VjY2VzcyByZXN1bHRzIHRvIGNoYWluIHRocm91Z2ggaW50ZXJtZWRpYXRlIHJlc3VsdCB0eXBlcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uPFQsIFRELCBUTj4gPSAodmFsdWU6IFQsIGRldGFpbD86IFREKSA9PiBEZXRhaWxlZFJlc3VsdDxUTiwgVEQ+O1xuXG4vKipcbiAqIENhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEge0BsaW5rIERldGFpbGVkUmVzdWx0fSBlbmNvdW50ZXJzIGEgZmFpbHVyZS5cbiAqIEByZW1hcmtzXG4gKiBBIGZhaWx1cmUgY2FsbGJhY2sgY2FuIGNoYW5nZSB7QGxpbmsgRmFpbHVyZX0gdG8ge0BsaW5rIFN1Y2Nlc3N9IChlLmcuIGJ5IHJldHVybmluZyBhIGRlZmF1bHQgdmFsdWUpXG4gKiBvciBpdCBjYW4gY2hhbmdlIG9yIGVtYmVsbGlzaCB0aGUgZXJyb3IgbWVzc2FnZSwgYnV0IGl0IGNhbm5vdCBjaGFuZ2UgdGhlIHN1Y2Nlc3MgcmV0dXJuIHR5cGUuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbjxULCBURD4gPSAobWVzc2FnZTogc3RyaW5nLCBkZXRhaWw6IFREKSA9PiBEZXRhaWxlZFJlc3VsdDxULCBURD47XG5cbi8qKlxuICogQSB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzfSBleHRlbmRzIHtAbGluayBTdWNjZXNzfSB0byByZXBvcnQgb3B0aW9uYWwgc3VjY2VzcyBkZXRhaWxzIGluXG4gKiBhZGRpdGlvbiB0byB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERldGFpbGVkU3VjY2VzczxULCBURD4gZXh0ZW5kcyBTdWNjZXNzPFQ+IHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2RldGFpbD86IFREO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzIHwgRGV0YWlsZWRTdWNjZXNzPFQsIFREPn0gd2l0aCB0aGUgc3VwcGxpZWRcbiAgICAgKiB2YWx1ZSBhbmQgZGV0YWlsLlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIC0gQW4gb3B0aW9uYWwgc3VjY2Vzc2Z1bCBkZXRhaWwgdG8gYmUgcmV0dXJuZWQuICBJZiBvbWl0dGVkLCBkZXRhaWxcbiAgICAgKiB3aWxsIGJlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih2YWx1ZTogVCwgZGV0YWlsPzogVEQpIHtcbiAgICAgICAgc3VwZXIodmFsdWUpO1xuICAgICAgICB0aGlzLl9kZXRhaWwgPSBkZXRhaWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN1Y2Nlc3MgZGV0YWlsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3N9LCBvciBgdW5kZWZpbmVkYCBpZlxuICAgICAqIG5vIGRldGFpbCB3YXMgc3VwcGxpZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBkZXRhaWwoKTogVER8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RldGFpbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIHRoYXQgdGhpcyB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzfSBpcyBhIHN1Y2Nlc3MuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbHdheXMgdHJ1ZSBmb3Ige0BsaW5rIERldGFpbGVkU3VjY2Vzc30gYnV0IGNhbiBiZSB1c2VkIGFzIHR5cGUgZ3VhcmRcbiAgICAgKiB0byBkaXNjcmltaW5hdGUge0BsaW5rIERldGFpbGVkU3VjY2Vzc30gZnJvbSB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfSBpblxuICAgICAqIGEge0BsaW5rIERldGFpbGVkUmVzdWx0fS5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWBcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdWNjZXNzKCk6IHRoaXMgaXMgRGV0YWlsZWRTdWNjZXNzPFQsIFREPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHN1cHBsaWVkIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3NDb250aW51YXRpb24gfCBzdWNjZXNzIGNhbGxiYWNrfSBhbmQgcHJvcGFnYXRlc1xuICAgICAqIGl0cyByZXR1cm5lZCB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxUTiwgVEQ+fS5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBzdWNjZXNzIGNhbGxiYWNrIG11dGF0ZXMgdGhlIHJldHVybiB0eXBlIGZyb20gYDxUPmAgdG8gYDxUTj5gLlxuICAgICAqIEBwYXJhbSBjYiAtIFRoZSB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uIHwgc3VjY2VzcyBjYWxsYmFja30gdG8gYmUgaW52b2tlZC5cbiAgICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSByZXR1cm5lZCBieSB0aGUgc3VjY2VzcyBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25TdWNjZXNzPFROPihjYjogRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uPFQsIFRELCBUTj4pOiBEZXRhaWxlZFJlc3VsdDxUTiwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIGNiKHRoaXMudmFsdWUsIHRoaXMuX2RldGFpbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvcGFnYXRlcyB0aGlzIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3N9LlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRmFpbHVyZSBkb2VzIG5vdCBtdXRhdGUgcmV0dXJuIHR5cGUgc28gd2UgY2FuIHJldHVybiB0aGlzIGV2ZW50IGRpcmVjdGx5LlxuICAgICAqIEBwYXJhbSBfY2IgLSB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlQ29udGludWF0aW9uIHwgRmFpbHVyZSBjYWxsYmFja30gdG8gYmUgY2FsbGVkXG4gICAgICogb24gYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHR9IGluIGNhc2Ugb2YgZmFpbHVyZSAoaWdub3JlZCkuXG4gICAgICogQHJldHVybnMgYHRoaXNgXG4gICAgICovXG4gICAgcHVibGljIG9uRmFpbHVyZShfY2I6IERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbjxULCBURD4pOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfSBleHRlbmRzIHtAbGluayBGYWlsdXJlfSB0byByZXBvcnQgb3B0aW9uYWwgZmFpbHVyZSBkZXRhaWxzIGluXG4gKiBhZGRpdGlvbiB0byB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERldGFpbGVkRmFpbHVyZTxULCBURD4gZXh0ZW5kcyBGYWlsdXJlPFQ+IHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2RldGFpbDogVEQ7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBEZXRhaWxlZEZhaWx1cmUgfCBEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+fSB3aXRoIHRoZSBzdXBwbGllZFxuICAgICAqIG1lc3NhZ2UgYW5kIGRldGFpbC5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGJlIHJldHVybmVkLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgLSBUaGUgZXJyb3IgZGV0YWlsIHRvIGJlIHJldHVybmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGRldGFpbDogVEQpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuX2RldGFpbCA9IGRldGFpbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgZGV0YWlsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHtAbGluayBEZXRhaWxlZEZhaWx1cmV9LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGV0YWlsKCk6IFREIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RldGFpbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIHRoYXQgdGhpcyB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfSBpcyBhIGZhaWx1cmUuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbHdheXMgdHJ1ZSBmb3Ige0BsaW5rIERldGFpbGVkRmFpbHVyZX0gYnV0IGNhbiBiZSB1c2VkIGFzIHR5cGUgZ3VhcmRcbiAgICAgKiB0byBkaXNjcmltaW5hdGUge0BsaW5rIERldGFpbGVkU3VjY2Vzc30gZnJvbSB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfSBpblxuICAgICAqIGEge0BsaW5rIERldGFpbGVkUmVzdWx0fS5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWBcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRGV0YWlsZWRGYWlsdXJlPFQsIFREPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3BhZ2F0ZXMgdGhlIGVycm9yIG1lc3NhZ2UgYW5kIGRldGFpbCBmcm9tIHRoaXMgcmVzdWx0LlxuICAgICAqIEByZW1hcmtzXG4gICAgICogTXV0YXRlcyB0aGUgc3VjY2VzcyB0eXBlIGFzIHRoZSBzdWNjZXNzIGNhbGxiYWNrIHdvdWxkIGhhdmUsIGJ1dCBkb2VzIG5vdFxuICAgICAqIGNhbGwgdGhlIHN1Y2Nlc3MgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIF9jYiAtIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3NDb250aW51YXRpb24gfCBTdWNjZXNzIGNhbGxiYWNrfSB0byBiZSBjYWxsZWRcbiAgICAgKiBvbiBhIHtAbGluayBEZXRhaWxlZFJlc3VsdH0gaW4gY2FzZSBvZiBzdWNjZXNzIChpZ25vcmVkKS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlIHwgRGV0YWlsZWRGYWlsdXJlPFROLCBURD59IHdoaWNoIGNvbnRhaW5zXG4gICAgICogdGhlIGVycm9yIG1lc3NhZ2UgYW5kIGRldGFpbCBmcm9tIHRoaXMgb25lLlxuICAgICAqL1xuICAgIHB1YmxpYyBvblN1Y2Nlc3M8VE4+KF9jYjogRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uPFQsIFRELCBUTj4pOiBEZXRhaWxlZFJlc3VsdDxUTiwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZXRhaWxlZEZhaWx1cmU8VE4sIFREPih0aGlzLm1lc3NhZ2UsIHRoaXMuX2RldGFpbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgc3VwcGxpZWQge0BsaW5rIERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbiB8IGZhaWx1cmUgY2FsbGJhY2t9IGFuZCBwcm9wYWdhdGVzXG4gICAgICogaXRzIHJldHVybmVkIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0uXG4gICAgICogQHBhcmFtIGNiIC0gVGhlIHtAbGluayBEZXRhaWxlZEZhaWx1cmVDb250aW51YXRpb24gfCBmYWlsdXJlIGNhbGxiYWNrfSB0byBiZSBpbnZva2VkLlxuICAgICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHJldHVybmVkIGJ5IHRoZSBmYWlsdXJlIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZhaWx1cmUoY2I6IERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbjxULCBURD4pOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gY2IodGhpcy5tZXNzYWdlLCB0aGlzLl9kZXRhaWwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUeXBlIGluZmVyZW5jZSB0byBkZXRlcm1pbmUgdGhlIHJlc3VsdCB0eXBlIGBUYCBvZiBhIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0uXG4gKiBAYmV0YVxuICovXG5leHBvcnQgdHlwZSBEZXRhaWxlZFJlc3VsdDxULCBURD4gPSBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+fERldGFpbGVkRmFpbHVyZTxULCBURD47XG5cbi8qKlxuICogVHlwZSBpbmZlcmVuY2UgdG8gZGV0ZXJtaW5lIHRoZSBkZXRhaWwgdHlwZSBgVERgIG9mIGEge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fS5cbiAqIEBiZXRhXG4gKi9cbmV4cG9ydCB0eXBlIFJlc3VsdERldGFpbFR5cGU8VD4gPSBUIGV4dGVuZHMgRGV0YWlsZWRSZXN1bHQ8dW5rbm93biwgaW5mZXIgVEQ+ID8gVEQgOiBuZXZlcjtcblxuLyoqXG4gKiBSZXR1cm5zIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3MgfCBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+fSB3aXRoIGEgc3VwcGxpZWQgdmFsdWUgYW5kIG9wdGlvbmFsXG4gKiBkZXRhaWwuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgb2YgdHlwZSBgPFQ+YCB0byBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBkZXRhaWwgLSBBbiBvcHRpb25hbCBkZXRhaWwgb2YgdHlwZSBgPFREPmAgdG8gYmUgcmV0dXJuZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3MgfCBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+fSB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZVxuICogYW5kIGRldGFpbCwgaWYgc3VwcGxpZWQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWNjZWVkV2l0aERldGFpbDxULCBURD4odmFsdWU6IFQsIGRldGFpbD86IFREKTogRGV0YWlsZWRTdWNjZXNzPFQsIFREPiB7XG4gICAgcmV0dXJuIG5ldyBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+KHZhbHVlLCBkZXRhaWwpO1xufVxuXG4vKipcbiAqIFJldHVybnMge0BsaW5rIERldGFpbGVkRmFpbHVyZSB8IERldGFpbGVkRmFpbHVyZTxULCBURD59IHdpdGggYSBzdXBwbGllZCBlcnJvciBtZXNzYWdlIGFuZCBkZXRhaWwuXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIGJlIHJldHVybmVkLlxuICogQHBhcmFtIGRldGFpbCAtIFRoZSBldmVudCBkZXRhaWwgdG8gYmUgcmV0dXJuZWQuXG4gKiBAcmV0dXJucyBBbiB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlIHwgRGV0YWlsZWRGYWlsdXJlPFQsIFREPn0gd2l0aCB0aGUgc3VwcGxpZWQgZXJyb3JcbiAqIG1lc3NhZ2UgYW5kIGRldGFpbC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhaWxXaXRoRGV0YWlsPFQsIFREPihtZXNzYWdlOiBzdHJpbmcsIGRldGFpbDogVEQpOiBEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+IHtcbiAgICByZXR1cm4gbmV3IERldGFpbGVkRmFpbHVyZTxULCBURD4obWVzc2FnZSwgZGV0YWlsKTtcbn1cblxuLyoqXG4gKiBQcm9wYWdhdGVzIGEge0BsaW5rIFN1Y2Nlc3N9IG9yIHtAbGluayBGYWlsdXJlfSB7QGxpbmsgUmVzdWx0fSwgYWRkaW5nIHN1cHBsaWVkXG4gKiBldmVudCBkZXRhaWxzIGFzIGFwcHJvcHJpYXRlLlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSB7QGxpbmsgUmVzdWx0fSB0byBiZSBwcm9wYWdhdGVkLlxuICogQHBhcmFtIGRldGFpbCAtIFRoZSBldmVudCBkZXRhaWwgKHR5cGUgYDxURD5gKSB0byBiZSBhZGRlZCB0byB0aGUge0BsaW5rIFJlc3VsdCB8IHJlc3VsdH0uXG4gKiBAcGFyYW0gc3VjY2Vzc0RldGFpbCAtIEFuIG9wdGlvbmFsIGRpc3RpbmN0IGV2ZW50IGRldGFpbCB0byBiZSBhZGRlZCB0byB7QGxpbmsgU3VjY2Vzc30gcmVzdWx0cy4gIElmIGBzdWNjZXNzRGV0YWlsYFxuICogaXMgb21pdHRlZCBvciBgdW5kZWZpbmVkYCwgdGhlbiBgZGV0YWlsYCB3aWxsIGJlIGFwcGxpZWQgdG8ge0BsaW5rIFN1Y2Nlc3N9IHJlc3VsdHMuXG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHdpdGggdGhlIHN1Y2Nlc3MgdmFsdWUgb3IgZXJyb3JcbiAqIG1lc3NhZ2UgZnJvbSB0aGUgb3JpZ2luYWwgYHJlc3VsdGAgYnV0IHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwgYWRkZWQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wYWdhdGVXaXRoRGV0YWlsPFQsIFREPihyZXN1bHQ6IFJlc3VsdDxUPiwgZGV0YWlsOiBURCwgc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICByZXR1cm4gcmVzdWx0LmlzU3VjY2VzcygpXG4gICAgICAgID8gc3VjY2VlZFdpdGhEZXRhaWwocmVzdWx0LnZhbHVlLCBzdWNjZXNzRGV0YWlsID8/IGRldGFpbClcbiAgICAgICAgOiBmYWlsV2l0aERldGFpbChyZXN1bHQubWVzc2FnZSwgZGV0YWlsKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIGZ1bmN0aW9uIHdoaWNoIG1pZ2h0IHRocm93IHRvIGNvbnZlcnQgZXhjZXB0aW9uIHJlc3VsdHNcbiAqIHRvIHtAbGluayBGYWlsdXJlfS5cbiAqIEBwYXJhbSBmdW5jIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhcHR1cmVkLlxuICogQHJldHVybnMgUmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhIHZhbHVlIG9mIHR5cGUgYDxUPmAgb25cbiAqIHN1Y2Nlc3MgLCBvciB7QGxpbmsgRmFpbHVyZX0gd2l0aCB0aGUgdGhyb3duIGVycm9yIG1lc3NhZ2UgaWZcbiAqIGBmdW5jYCB0aHJvd3MgYW4gYEVycm9yYC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVSZXN1bHQ8VD4oZnVuYzogKCkgPT4gVCk6IFJlc3VsdDxUPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZnVuYygpKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gZmFpbCgoZXJyIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQWdncmVnYXRlcyBzdWNlc3NmdWwgcmVzdWx0IHZhbHVlcyBmcm9tIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFQ+fS5cbiAqIEBwYXJhbSByZXN1bHRzIC0gVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0gdG8gYmUgbWFwcGVkLlxuICogQHJldHVybnMgIElmIGFsbCB7QGxpbmsgUmVzdWx0IHwgcmVzdWx0c30gYXJlIHN1Y2Nlc3NmdWwsIHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYW5cbiAqIGFycmF5IGNvbnRhaW5pbmcgYWxsIHJldHVybmVkIHZhbHVlcy4gIElmIGFueSB7QGxpbmsgUmVzdWx0IHwgcmVzdWx0c30gZmFpbGVkLCByZXR1cm5zXG4gKiB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhIGNvbmNhdGVuYXRlZCBzdW1tYXJ5IG9mIGFsbCBlcnJvciBtZXNzYWdlcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFJlc3VsdHM8VD4ocmVzdWx0czogSXRlcmFibGU8UmVzdWx0PFQ+Pik6IFJlc3VsdDxUW10+IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZWxlbWVudHM6IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoZWxlbWVudHMpO1xufVxuXG4vKipcbiAqIEFnZ3JlZ2F0ZXMgc3VjZXNzZnVsIHJlc3VsdHMgZnJvbSBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSxcbiAqIG9wdGlvbmFsbHkgaWdub3JpbmcgY2VydGFpbiBlcnJvciBkZXRhaWxzLlxuICogQHBhcmFtIHJlc3VsdHMgLSBUaGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHRvIGJlIG1hcHBlZC5cbiAqIEBwYXJhbSBpZ25vcmUgLSBBbiBhcnJheSBvZiBlcnJvciBkZXRhaWwgdmFsdWVzIChvZiB0eXBlIGA8VEQ+YCkgdGhhdCBzaG91bGQgYmUgaWdub3JlZC5cbiAqIEByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHN1Y2Nlc3NmdWwgcmVzdWx0cyBpZiBhbGwgcmVzdWx0cyBlaXRoZXJcbiAqIHN1Y2VlZGVkIG9yIHJldHVybmVkIGVycm9yIGRldGFpbHMgbGlzdGVkIGluIGBpZ25vcmVgLiAgSWYgYW55IHJlc3VsdHMgZmFpbGVkIHdpdGggZGV0YWlsc1xuICogdGhhdCBjYW5ub3QgYmUgaWdub3JlZCwgcmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBjb25jYXRlbmF0ZWQgc3VtbWFyeSBvZiBhbGwgbm9uLWlnbm9yYWJsZVxuICogZXJyb3IgbWVzYXNnZXMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBEZXRhaWxlZFJlc3VsdHM8VCwgVEQ+KHJlc3VsdHM6IEl0ZXJhYmxlPERldGFpbGVkUmVzdWx0PFQsIFREPj4sIGlnbm9yZTogVERbXSk6IFJlc3VsdDxUW10+IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZWxlbWVudHM6IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlnbm9yZS5pbmNsdWRlcyhyZXN1bHQuZGV0YWlsKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKGVsZW1lbnRzKTtcbn1cblxuLyoqXG4gKiBBZ2dyZWdhdGVzIHN1Y2Nlc3NmdWwgcmVzdWx0cyBmcm9tIGEgYSBjb2xsZWN0aW9uIG9mIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VD59LlxuICogQHBhcmFtIHJlc3VsdHMgLSBBbiBgSXRlcmFibGVgIG9mIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VD59IGZyb20gd2hpY2ggc3VjY2Vzc1xuICogcmVzdWx0cyBhcmUgdG8gYmUgYWdncmVnYXRlZC5cbiAqIEByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGFuIGFycmF5IG9mIGA8VD5gIGlmIGFueSByZXN1bHRzIHdlcmUgc3VjY2Vzc2Z1bC4gSWZcbiAqIGFsbCB7QGxpbmsgUmVzdWx0IHwgcmVzdWx0c30gZmFpbGVkLCByZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgY29uY2F0ZW5hdGVkXG4gKiBzdW1tYXJ5IG9mIGFsbCBlcnJvciBtZXNzYWdlcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFN1Y2Nlc3M8VD4ocmVzdWx0czogSXRlcmFibGU8UmVzdWx0PFQ+Pik6IFJlc3VsdDxUW10+IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZWxlbWVudHM6IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgJiYgKGVycm9ycy5sZW5ndGggPiAwKSkge1xuICAgICAgICByZXR1cm4gZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VlZChlbGVtZW50cyk7XG59XG5cbi8qKlxuICogQWdncmVnYXRlcyBlcnJvciBtZXNzYWdlcyBmcm9tIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFQ+fS5cbiAqIEBwYXJhbSByZXN1bHRzIC0gQW4gaW50ZXJhYmxlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0gZm9yIHdoaWNoXG4gKiBlcnJvciBtZXNzYWdlcyBhcmUgYWdncmVnYXRlZC5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MgY29uc2lzdGluZyBvZiBhbGwgZXJyb3IgbWVzc2FnZXMgcmV0dXJuZWQgYnlcbiAqIHtAbGluayBSZXN1bHQgfCByZXN1bHRzfSBpbiB0aGUgc291cmNlIGNvbGxlY3Rpb24uIElnbm9yZXMge0BsaW5rIFN1Y2Nlc3N9XG4gKiByZXN1bHRzIGFuZCByZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIHdlcmUgbm8gZXJyb3JzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwRmFpbHVyZXM8VD4ocmVzdWx0czogSXRlcmFibGU8UmVzdWx0PFQ+Pik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGFuIGl0ZXJhYmxlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0gd2VyZSBhbGwgc3VjY2Vzc2Z1bC5cbiAqIEBwYXJhbSByZXN1bHRzIC0gVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0gdG8gYmUgdGVzdGVkLlxuICogQHJldHVybnMgUmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBgdHJ1ZWAgaWYgYWxsIHtAbGluayBSZXN1bHQgfCByZXN1bHRzfSBhcmUgc3VjY2Vzc2Z1bC5cbiAqIElmIGFueSBhcmUgdW5zdWNjZXNzZnVsLCByZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgY29uY2F0ZW5hdGVkIHN1bW1hcnkgdGhlIGVycm9yXG4gKiBtZXNzYWdlcyBmcm9tIGFsbCBmYWlsZWQgZWxlbWVudHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGxTdWNjZWVkPFQ+KHJlc3VsdHM6IEl0ZXJhYmxlPFJlc3VsdDx1bmtub3duPj4sIHN1Y2Nlc3NWYWx1ZTogVCk6IFJlc3VsdDxUPiB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICBpZiAocmVzdWx0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoc3VjY2Vzc1ZhbHVlKTtcbn1cblxuLyoqXG4gKiBTdHJpbmcta2V5ZWQgcmVjb3JkIG9mIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyB0byBiZSBwYXNzZWQgdG8ge0BsaW5rIHBvcHVsYXRlT2JqZWN0fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRmllbGRJbml0aWFsaXplcnM8VD4gPSB7IFsga2V5IGluIGtleW9mIFQgXTogKHN0YXRlOiBQYXJ0aWFsPFQ+KSA9PiBSZXN1bHQ8VFtrZXldPiB9O1xuXG4vKipcbiAqIFBvcHVsYXRlcyBhbiBhbiBvYmplY3QgYmFzZWQgb24gYSBwcm90b3R5cGUgZnVsbCBvZiBmaWVsZCBpbml0aWFsaXplcnMgdGhhdCByZXR1cm4ge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUW2tleV0+fS5cbiAqIFJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHBvcHVsYXRlZCBvYmplY3QgaWYgYWxsIGluaXRpYWxpemVycyBzdWNjZWVkLCBvciB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhXG4gKiBjb25jYXRlbmF0ZWQgbGlzdCBvZiBhbGwgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gaW5pdGlhbGl6ZXJzIC0gQW4gb2JqZWN0IHdpdGggdGhlIHNoYXBlIG9mIHRoZSB0YXJnZXQgYnV0IHdpdGggaW5pdGlhbGl6ZXIgZnVuY3Rpb25zIGZvclxuICogZWFjaCBwcm9wZXJ0eS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvcHVsYXRlT2JqZWN0PFQ+KGluaXRpYWxpemVyczogRmllbGRJbml0aWFsaXplcnM8VD4sIG9yZGVyPzogKGtleW9mIFQpW10pOiBSZXN1bHQ8VD4ge1xuICAgIGNvbnN0IHN0YXRlID0ge30gYXMgeyBba2V5IGluIGtleW9mIFRdOiBUW2tleV0gfTtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qga2V5czogKGtleW9mIFQpW10gPSBBcnJheS5mcm9tKG9yZGVyID8/IFtdKTtcbiAgICBjb25zdCBmb3VuZEtleXMgPSBuZXcgU2V0PGtleW9mIFQ+KG9yZGVyKTtcblxuICAgIC8vIHN0YXJ0IHdpdGggdGhlIHN1cHBsaWVkIG9yZGVyIHRoZW4gYXBwZW5kIGFueXRoaW5nIGVsc2Ugd2UgZmluZFxuICAgIGZvciAoY29uc3Qga2V5IGluIGluaXRpYWxpemVycykge1xuICAgICAgICBpZiAoIWZvdW5kS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICBmb3VuZEtleXMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGlmIChpbml0aWFsaXplcnNba2V5XSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gaW5pdGlhbGl6ZXJzW2tleV0oc3RhdGUpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgIHN0YXRlW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChgcG9wdWxhdGVPYmplY3Q6IEtleSAke2tleX0gaXMgcHJlc2VudCBidXQgaGFzIG5vIGluaXRpYWxpemVyYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoc3RhdGUgYXMgVCk7XG59XG4iXX0=
import { Result } from './result';
/**
* Helper type-guard function to report whether a specified key is present in
* a supplied object.
* @param key - The key to be tested.
* @param item - The object to be tested.
* @returns Returns `true` if the key is present, `false` otherwise.
* @public
*/
export declare function isKeyOf<T extends object>(key: string | number | symbol, item: T): key is keyof T;
/**
* Type for factory methods which convert a key-value pair to a new unique value.
* @public
*/
declare type KeyedThingFactory<TS, TD, TK extends string = string> = (key: TK, thing: TS) => Result<TD>;
/**
* Applies a factory method to convert a Record<TK, TS> into a Map<TK, TD>
* @param src The Record object to be converted
* @param factory The factory method used to convert elements
* @returns Success with the resulting map, or Failure if an error occurs
* Applies a factory method to convert a `Record<TK, TS>` into a `Map<TK, TD>`.
* @param src - The `Record` to be converted.
* @param factory - The factory method used to convert elements.
* @returns {@link Success} with the resulting map on success, or {@link Failure} with a
* message if an error occurs.
* @public
*/
export declare function recordToMap<TS, TD, TK extends string = string>(src: Record<TK, TS>, factory: KeyedThingFactory<TS, TD, TK>): Result<Map<TK, TD>>;
/**
* Applies a factory method to convert an optional Record<TK, TS> into a Map<TK, TD> or undefined
* @param src The Record object to be converted or undefined
* @param factory The factory method used to convert elements
* @returns Success with the resulting map if conversion succeeds, or success with undefined if src is undefined. Returns Failure with
* a message if an error occurs.
* Applies a factory method to convert an optional `Record<TK, TS>` into a `Map<TK, TD>`, or `undefined`.
* @param src - The `Record` to be converted, or undefined.
* @param factory - The factory method used to convert elements.
* @returns {@link Success} with the resulting map if conversion succeeds, or {@link Success} with `undefined`
* if `src` is `undefined`. Returns {@link Failure} with a message if an error occurs.
* @public
*/
export declare function optionalRecordToMap<TS, TD, TK extends string = string>(src: Record<TK, TS> | undefined, factory: KeyedThingFactory<TS, TD, TK>): Result<Map<TK, TD> | undefined>;
/**
* Applies a factory method to convert an optional Record<TK, TS> into a Map<TK, TD>
* @param src The Record object to be converted or undefined
* @param factory The factory method used to convert elements
* @returns Success with the resulting map (empty if src is undefined) if conversion succeeds. Returns Failure with
* a message if an error occurs.
* Applies a factory method to convert an optional `Record<TK, TS>` into a `Map<TK, TD>`
* @param src - The `Record` to be converted, or `undefined`.
* @param factory - The factory method used to convert elements.
* @returns {@link Success} with the resulting map (empty if `src` is `undefined`) if conversion succeeds.
* Returns {@link Failure} with a message if an error occurs.
* @public
*/
export declare function optionalRecordToPossiblyEmptyMap<TS, TD, TK extends string = string>(src: Record<TK, TS> | undefined, factory: KeyedThingFactory<TS, TD, TK>): Result<Map<TK, TD>>;
/**
* Applies a factory method to convert a Map<TK, TS> into a Record<TK, TD>
* @param src The Map object to be converted
* @param factory The factory method used to convert elements
* Applies a factory method to convert a `Map<TK, TS>` into a `Record<TK, TD>`.
* @param src - The `Map` object to be converted.
* @param factory - The factory method used to convert elements.
* @returns {@link Success} with the resulting `Record<TK, TD>` if conversion succeeds, or
* {@link Failure} with an error message if an error occurs.
* @public
*/
export declare function mapToRecord<TS, TD, TK extends string = string>(src: Map<TK, TS>, factory: KeyedThingFactory<TS, TD, TK>): Result<Record<TK, TD>>;
/**
* Applies a factory method to convert an optional Map<string, TS> into a Record<string, TD> or undefined
* @param src The Map object to be converted or undefined
* @param factory The factory method used to convert elements
* @returns Success with the resulting record if conversion succeeds, or success with undefined if src is undefined. Returns Failure with
* a message if an error occurs.
* Applies a factory method to convert an optional `Map<string, TS>` into a `Record<string, TD>` or `undefined`.
* @param src - The `Map` object to be converted, or `undefined`.
* @param factory - The factory method used to convert elements.
* @returns {@link Success} with the resulting record if conversion succeeds, or {@link Success} with `undefined` if
* `src` is `undefined`. Returns {@link Failure} with a message if an error occurs.
* @public
*/
export declare function optionalMapToRecord<TS, TD, TK extends string = string>(src: Map<TK, TS> | undefined, factory: KeyedThingFactory<TS, TD, TK>): Result<Record<TK, TD> | undefined>;
/**
* Applies a factory method to convert an optional Map<string, TS> into a Record<string, TD>
* @param src The Map object to be converted or undefined
* @param factory The factory method used to convert elements
* @returns Success with the resulting record (empty if src is undefined) if conversion succeeds. Returns Failure with
* a message if an error occurs.
* Applies a factory method to convert an optional `Map<string, TS>` into a `Record<string, TD>`
* @param src - The `Map` object to be converted, or `undefined`.
* @param factory - The factory method used to convert elements.
* @returns {@link Success} with the resulting record (empty if `src` is `undefined`) if conversion succeeds.
* Returns {@link Failure} with a message if an error occurs.
* @public
*/
export declare function optionalMapToPossiblyEmptyRecord<TS, TD, TK extends string = string>(src: Map<TK, TS> | undefined, factory: KeyedThingFactory<TS, TD, TK>): Result<Record<TK, TD>>;
export {};
//# sourceMappingURL=utils.d.ts.map

@@ -26,2 +26,10 @@ "use strict";

const result_1 = require("./result");
/**
* Helper type-guard function to report whether a specified key is present in
* a supplied object.
* @param key - The key to be tested.
* @param item - The object to be tested.
* @returns Returns `true` if the key is present, `false` otherwise.
* @public
*/
// eslint-disable-next-line @typescript-eslint/ban-types

@@ -33,6 +41,8 @@ function isKeyOf(key, item) {

/**
* Applies a factory method to convert a Record<TK, TS> into a Map<TK, TD>
* @param src The Record object to be converted
* @param factory The factory method used to convert elements
* @returns Success with the resulting map, or Failure if an error occurs
* Applies a factory method to convert a `Record<TK, TS>` into a `Map<TK, TD>`.
* @param src - The `Record` to be converted.
* @param factory - The factory method used to convert elements.
* @returns {@link Success} with the resulting map on success, or {@link Failure} with a
* message if an error occurs.
* @public
*/

@@ -56,7 +66,8 @@ function recordToMap(src, factory) {

/**
* Applies a factory method to convert an optional Record<TK, TS> into a Map<TK, TD> or undefined
* @param src The Record object to be converted or undefined
* @param factory The factory method used to convert elements
* @returns Success with the resulting map if conversion succeeds, or success with undefined if src is undefined. Returns Failure with
* a message if an error occurs.
* Applies a factory method to convert an optional `Record<TK, TS>` into a `Map<TK, TD>`, or `undefined`.
* @param src - The `Record` to be converted, or undefined.
* @param factory - The factory method used to convert elements.
* @returns {@link Success} with the resulting map if conversion succeeds, or {@link Success} with `undefined`
* if `src` is `undefined`. Returns {@link Failure} with a message if an error occurs.
* @public
*/

@@ -68,7 +79,8 @@ function optionalRecordToMap(src, factory) {

/**
* Applies a factory method to convert an optional Record<TK, TS> into a Map<TK, TD>
* @param src The Record object to be converted or undefined
* @param factory The factory method used to convert elements
* @returns Success with the resulting map (empty if src is undefined) if conversion succeeds. Returns Failure with
* a message if an error occurs.
* Applies a factory method to convert an optional `Record<TK, TS>` into a `Map<TK, TD>`
* @param src - The `Record` to be converted, or `undefined`.
* @param factory - The factory method used to convert elements.
* @returns {@link Success} with the resulting map (empty if `src` is `undefined`) if conversion succeeds.
* Returns {@link Failure} with a message if an error occurs.
* @public
*/

@@ -80,5 +92,8 @@ function optionalRecordToPossiblyEmptyMap(src, factory) {

/**
* Applies a factory method to convert a Map<TK, TS> into a Record<TK, TD>
* @param src The Map object to be converted
* @param factory The factory method used to convert elements
* Applies a factory method to convert a `Map<TK, TS>` into a `Record<TK, TD>`.
* @param src - The `Map` object to be converted.
* @param factory - The factory method used to convert elements.
* @returns {@link Success} with the resulting `Record<TK, TD>` if conversion succeeds, or
* {@link Failure} with an error message if an error occurs.
* @public
*/

@@ -102,7 +117,8 @@ function mapToRecord(src, factory) {

/**
* Applies a factory method to convert an optional Map<string, TS> into a Record<string, TD> or undefined
* @param src The Map object to be converted or undefined
* @param factory The factory method used to convert elements
* @returns Success with the resulting record if conversion succeeds, or success with undefined if src is undefined. Returns Failure with
* a message if an error occurs.
* Applies a factory method to convert an optional `Map<string, TS>` into a `Record<string, TD>` or `undefined`.
* @param src - The `Map` object to be converted, or `undefined`.
* @param factory - The factory method used to convert elements.
* @returns {@link Success} with the resulting record if conversion succeeds, or {@link Success} with `undefined` if
* `src` is `undefined`. Returns {@link Failure} with a message if an error occurs.
* @public
*/

@@ -114,7 +130,8 @@ function optionalMapToRecord(src, factory) {

/**
* Applies a factory method to convert an optional Map<string, TS> into a Record<string, TD>
* @param src The Map object to be converted or undefined
* @param factory The factory method used to convert elements
* @returns Success with the resulting record (empty if src is undefined) if conversion succeeds. Returns Failure with
* a message if an error occurs.
* Applies a factory method to convert an optional `Map<string, TS>` into a `Record<string, TD>`
* @param src - The `Map` object to be converted, or `undefined`.
* @param factory - The factory method used to convert elements.
* @returns {@link Success} with the resulting record (empty if `src` is `undefined`) if conversion succeeds.
* Returns {@link Failure} with a message if an error occurs.
* @public
*/

@@ -125,2 +142,2 @@ function optionalMapToPossiblyEmptyRecord(src, factory) {

exports.optionalMapToPossiblyEmptyRecord = optionalMapToPossiblyEmptyRecord;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgscUNBQWlEO0FBRWpELHdEQUF3RDtBQUN4RCxTQUFnQixPQUFPLENBQW1CLEdBQXlCLEVBQUUsSUFBTztJQUN4RSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUZELDBCQUVDO0FBSUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixXQUFXLENBQXFDLEdBQW1CLEVBQUUsT0FBc0M7SUFDdkgsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM5QixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDeEIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDeEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xDO2lCQUNJO2dCQUNELE9BQU8sSUFBQSxhQUFJLEVBQUMsR0FBRyxHQUFHLEtBQUssVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7YUFDaEQ7U0FDSjtLQUNKO0lBQ0QsT0FBTyxJQUFBLGdCQUFPLEVBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQWRELGtDQWNDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQXFDLEdBQTZCLEVBQUUsT0FBc0M7SUFDekksT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnQkFBTyxFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFGRCxrREFFQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLGdDQUFnQyxDQUFxQyxHQUE2QixFQUFFLE9BQXNDO0lBQ3RKLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0JBQU8sRUFBQyxJQUFJLEdBQUcsRUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEYsQ0FBQztBQUZELDRFQUVDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFdBQVcsQ0FBcUMsR0FBZ0IsRUFBRSxPQUFzQztJQUNwSCxNQUFNLE1BQU0sR0FBbUIsRUFBb0IsQ0FBQztJQUNwRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDdEIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7YUFDckM7aUJBQ0k7Z0JBQ0QsT0FBTyxJQUFBLGFBQUksRUFBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUNuRDtTQUNKO0tBQ0o7SUFDRCxPQUFPLElBQUEsZ0JBQU8sRUFBQyxNQUFNLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBZEQsa0NBY0M7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBcUMsR0FBMEIsRUFBRSxPQUFzQztJQUN0SSxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGdCQUFPLEVBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUZELGtEQUVDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZ0NBQWdDLENBQXFDLEdBQTBCLEVBQUUsT0FBc0M7SUFDbkosT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnQkFBTyxFQUFDLEVBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMzRixDQUFDO0FBRkQsNEVBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXHJcbiAqXHJcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcclxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxyXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXHJcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcclxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXHJcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAqXHJcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxyXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4gKlxyXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxyXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcclxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxyXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxyXG4gKiBTT0ZUV0FSRS5cclxuICovXHJcblxyXG5pbXBvcnQgeyBSZXN1bHQsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xyXG5leHBvcnQgZnVuY3Rpb24gaXNLZXlPZjxUIGV4dGVuZHMgb2JqZWN0PihrZXk6IHN0cmluZ3xudW1iZXJ8c3ltYm9sLCBpdGVtOiBUKToga2V5IGlzIGtleW9mIFQge1xyXG4gICAgcmV0dXJuIGl0ZW0uaGFzT3duUHJvcGVydHkoa2V5KTtcclxufVxyXG5cclxudHlwZSBLZXllZFRoaW5nRmFjdG9yeTxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IChrZXk6IFRLLCB0aGluZzogVFMpID0+IFJlc3VsdDxURD47XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYSBSZWNvcmQ8VEssIFRTPiBpbnRvIGEgTWFwPFRLLCBURD5cclxuICogQHBhcmFtIHNyYyBUaGUgUmVjb3JkIG9iamVjdCB0byBiZSBjb252ZXJ0ZWRcclxuICogQHBhcmFtIGZhY3RvcnkgVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50c1xyXG4gKiBAcmV0dXJucyBTdWNjZXNzIHdpdGggdGhlIHJlc3VsdGluZyBtYXAsIG9yIEZhaWx1cmUgaWYgYW4gZXJyb3Igb2NjdXJzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkVG9NYXA8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBSZWNvcmQ8VEssIFRTPiwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8TWFwPFRLLCBURD4+IHtcclxuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8VEssIFREPigpO1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gc3JjKSB7XHJcbiAgICAgICAgaWYgKHNyY1trZXldICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbVJlc3VsdCA9IGZhY3Rvcnkoa2V5LCBzcmNba2V5XSk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtUmVzdWx0LmlzU3VjY2VzcygpKSB7XHJcbiAgICAgICAgICAgICAgICBtYXAuc2V0KGtleSwgaXRlbVJlc3VsdC52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtrZXl9OiAke2l0ZW1SZXN1bHQubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZWVkKG1hcCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhbiBvcHRpb25hbCBSZWNvcmQ8VEssIFRTPiBpbnRvIGEgTWFwPFRLLCBURD4gb3IgdW5kZWZpbmVkXHJcbiAqIEBwYXJhbSBzcmMgVGhlIFJlY29yZCBvYmplY3QgdG8gYmUgY29udmVydGVkIG9yIHVuZGVmaW5lZFxyXG4gKiBAcGFyYW0gZmFjdG9yeSBUaGUgZmFjdG9yeSBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGVsZW1lbnRzXHJcbiAqIEByZXR1cm5zIFN1Y2Nlc3Mgd2l0aCB0aGUgcmVzdWx0aW5nIG1hcCBpZiBjb252ZXJzaW9uIHN1Y2NlZWRzLCBvciBzdWNjZXNzIHdpdGggdW5kZWZpbmVkIGlmIHNyYyBpcyB1bmRlZmluZWQuIFJldHVybnMgRmFpbHVyZSB3aXRoXHJcbiAqIGEgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxSZWNvcmRUb01hcDxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihzcmM6IFJlY29yZDxUSywgVFM+fHVuZGVmaW5lZCwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8TWFwPFRLLCBURD58dW5kZWZpbmVkPiB7XHJcbiAgICByZXR1cm4gKHNyYyA9PT0gdW5kZWZpbmVkKSA/IHN1Y2NlZWQodW5kZWZpbmVkKSA6IHJlY29yZFRvTWFwKHNyYywgZmFjdG9yeSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhbiBvcHRpb25hbCBSZWNvcmQ8VEssIFRTPiBpbnRvIGEgTWFwPFRLLCBURD5cclxuICogQHBhcmFtIHNyYyBUaGUgUmVjb3JkIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQgb3IgdW5kZWZpbmVkXHJcbiAqIEBwYXJhbSBmYWN0b3J5IFRoZSBmYWN0b3J5IG1ldGhvZCB1c2VkIHRvIGNvbnZlcnQgZWxlbWVudHNcclxuICogQHJldHVybnMgU3VjY2VzcyB3aXRoIHRoZSByZXN1bHRpbmcgbWFwIChlbXB0eSBpZiBzcmMgaXMgdW5kZWZpbmVkKSBpZiBjb252ZXJzaW9uIHN1Y2NlZWRzLiBSZXR1cm5zIEZhaWx1cmUgd2l0aFxyXG4gKiBhIG1lc3NhZ2UgaWYgYW4gZXJyb3Igb2NjdXJzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsUmVjb3JkVG9Qb3NzaWJseUVtcHR5TWFwPFRTLCBURCwgVEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KHNyYzogUmVjb3JkPFRLLCBUUz58dW5kZWZpbmVkLCBmYWN0b3J5OiBLZXllZFRoaW5nRmFjdG9yeTxUUywgVEQsIFRLPik6IFJlc3VsdDxNYXA8VEssIFREPj4ge1xyXG4gICAgcmV0dXJuIChzcmMgPT09IHVuZGVmaW5lZCkgPyBzdWNjZWVkKG5ldyBNYXA8VEssIFREPigpKSA6IHJlY29yZFRvTWFwKHNyYywgZmFjdG9yeSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhIE1hcDxUSywgVFM+IGludG8gYSBSZWNvcmQ8VEssIFREPlxyXG4gKiBAcGFyYW0gc3JjIFRoZSBNYXAgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZFxyXG4gKiBAcGFyYW0gZmFjdG9yeSBUaGUgZmFjdG9yeSBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGVsZW1lbnRzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9SZWNvcmQ8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBNYXA8VEssIFRTPiwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8UmVjb3JkPFRLLCBURD4+IHtcclxuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPFRLLCBURD4gPSB7fSBhcyBSZWNvcmQ8VEssIFREPjtcclxuICAgIGZvciAoY29uc3Qga3ZwIG9mIHNyYykge1xyXG4gICAgICAgIGlmIChrdnBbMV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtUmVzdWx0ID0gZmFjdG9yeShrdnBbMF0sIGt2cFsxXSk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtUmVzdWx0LmlzU3VjY2VzcygpKSB7XHJcbiAgICAgICAgICAgICAgICByZWNvcmRba3ZwWzBdXSA9IGl0ZW1SZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtrdnBbMF19OiAke2l0ZW1SZXN1bHQubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZWVkKHJlY29yZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhbiBvcHRpb25hbCBNYXA8c3RyaW5nLCBUUz4gaW50byBhIFJlY29yZDxzdHJpbmcsIFREPiBvciB1bmRlZmluZWRcclxuICogQHBhcmFtIHNyYyBUaGUgTWFwIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQgb3IgdW5kZWZpbmVkXHJcbiAqIEBwYXJhbSBmYWN0b3J5IFRoZSBmYWN0b3J5IG1ldGhvZCB1c2VkIHRvIGNvbnZlcnQgZWxlbWVudHNcclxuICogQHJldHVybnMgU3VjY2VzcyB3aXRoIHRoZSByZXN1bHRpbmcgcmVjb3JkIGlmIGNvbnZlcnNpb24gc3VjY2VlZHMsIG9yIHN1Y2Nlc3Mgd2l0aCB1bmRlZmluZWQgaWYgc3JjIGlzIHVuZGVmaW5lZC4gUmV0dXJucyBGYWlsdXJlIHdpdGhcclxuICogYSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbE1hcFRvUmVjb3JkPFRTLCBURCwgVEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KHNyYzogTWFwPFRLLCBUUz58dW5kZWZpbmVkLCBmYWN0b3J5OiBLZXllZFRoaW5nRmFjdG9yeTxUUywgVEQsIFRLPik6IFJlc3VsdDxSZWNvcmQ8VEssIFREPnx1bmRlZmluZWQ+IHtcclxuICAgIHJldHVybiAoc3JjID09PSB1bmRlZmluZWQpID8gc3VjY2VlZCh1bmRlZmluZWQpIDogbWFwVG9SZWNvcmQoc3JjLCBmYWN0b3J5KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBmYWN0b3J5IG1ldGhvZCB0byBjb252ZXJ0IGFuIG9wdGlvbmFsIE1hcDxzdHJpbmcsIFRTPiBpbnRvIGEgUmVjb3JkPHN0cmluZywgVEQ+XHJcbiAqIEBwYXJhbSBzcmMgVGhlIE1hcCBvYmplY3QgdG8gYmUgY29udmVydGVkIG9yIHVuZGVmaW5lZFxyXG4gKiBAcGFyYW0gZmFjdG9yeSBUaGUgZmFjdG9yeSBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGVsZW1lbnRzXHJcbiAqIEByZXR1cm5zIFN1Y2Nlc3Mgd2l0aCB0aGUgcmVzdWx0aW5nIHJlY29yZCAoZW1wdHkgaWYgc3JjIGlzIHVuZGVmaW5lZCkgaWYgY29udmVyc2lvbiBzdWNjZWVkcy4gUmV0dXJucyBGYWlsdXJlIHdpdGhcclxuICogYSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbE1hcFRvUG9zc2libHlFbXB0eVJlY29yZDxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihzcmM6IE1hcDxUSywgVFM+fHVuZGVmaW5lZCwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8UmVjb3JkPFRLLCBURD4+IHtcclxuICAgIHJldHVybiAoc3JjID09PSB1bmRlZmluZWQpID8gc3VjY2VlZCh7fSBhcyBSZWNvcmQ8VEssIFREPikgOiBtYXBUb1JlY29yZChzcmMsIGZhY3RvcnkpO1xyXG59XHJcbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgscUNBQWlEO0FBRWpEOzs7Ozs7O0dBT0c7QUFDSCx3REFBd0Q7QUFDeEQsU0FBZ0IsT0FBTyxDQUFtQixHQUF5QixFQUFFLElBQU87SUFDeEUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFGRCwwQkFFQztBQVFEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixXQUFXLENBQXFDLEdBQW1CLEVBQUUsT0FBc0M7SUFDdkgsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM5QixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDeEIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDeEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xDO2lCQUNJO2dCQUNELE9BQU8sSUFBQSxhQUFJLEVBQUMsR0FBRyxHQUFHLEtBQUssVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7YUFDaEQ7U0FDSjtLQUNKO0lBQ0QsT0FBTyxJQUFBLGdCQUFPLEVBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQWRELGtDQWNDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLG1CQUFtQixDQUFxQyxHQUE2QixFQUFFLE9BQXNDO0lBQ3pJLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0JBQU8sRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRkQsa0RBRUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsZ0NBQWdDLENBQXFDLEdBQTZCLEVBQUUsT0FBc0M7SUFDdEosT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnQkFBTyxFQUFDLElBQUksR0FBRyxFQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RixDQUFDO0FBRkQsNEVBRUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsV0FBVyxDQUFxQyxHQUFnQixFQUFFLE9BQXNDO0lBQ3BILE1BQU0sTUFBTSxHQUFtQixFQUFvQixDQUFDO0lBQ3BELEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFO1FBQ25CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN0QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQzthQUNyQztpQkFDSTtnQkFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQ25EO1NBQ0o7S0FDSjtJQUNELE9BQU8sSUFBQSxnQkFBTyxFQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFkRCxrQ0FjQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBcUMsR0FBMEIsRUFBRSxPQUFzQztJQUN0SSxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGdCQUFPLEVBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUZELGtEQUVDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLGdDQUFnQyxDQUFxQyxHQUEwQixFQUFFLE9BQXNDO0lBQ25KLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0JBQU8sRUFBQyxFQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDM0YsQ0FBQztBQUZELDRFQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcclxuICogU09GVFdBUkUuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgUmVzdWx0LCBmYWlsLCBzdWNjZWVkIH0gZnJvbSAnLi9yZXN1bHQnO1xyXG5cclxuLyoqXHJcbiAqIEhlbHBlciB0eXBlLWd1YXJkIGZ1bmN0aW9uIHRvIHJlcG9ydCB3aGV0aGVyIGEgc3BlY2lmaWVkIGtleSBpcyBwcmVzZW50IGluXHJcbiAqIGEgc3VwcGxpZWQgb2JqZWN0LlxyXG4gKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byBiZSB0ZXN0ZWQuXHJcbiAqIEBwYXJhbSBpdGVtIC0gVGhlIG9iamVjdCB0byBiZSB0ZXN0ZWQuXHJcbiAqIEByZXR1cm5zIFJldHVybnMgYHRydWVgIGlmIHRoZSBrZXkgaXMgcHJlc2VudCwgYGZhbHNlYCBvdGhlcndpc2UuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0tleU9mPFQgZXh0ZW5kcyBvYmplY3Q+KGtleTogc3RyaW5nfG51bWJlcnxzeW1ib2wsIGl0ZW06IFQpOiBrZXkgaXMga2V5b2YgVCB7XHJcbiAgICByZXR1cm4gaXRlbS5oYXNPd25Qcm9wZXJ0eShrZXkpO1xyXG59XHJcblxyXG4vKipcclxuICogVHlwZSBmb3IgZmFjdG9yeSBtZXRob2RzIHdoaWNoIGNvbnZlcnQgYSBrZXktdmFsdWUgcGFpciB0byBhIG5ldyB1bmlxdWUgdmFsdWUuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbnR5cGUgS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSAoa2V5OiBUSywgdGhpbmc6IFRTKSA9PiBSZXN1bHQ8VEQ+O1xyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBmYWN0b3J5IG1ldGhvZCB0byBjb252ZXJ0IGEgYFJlY29yZDxUSywgVFM+YCBpbnRvIGEgYE1hcDxUSywgVEQ+YC5cclxuICogQHBhcmFtIHNyYyAtIFRoZSBgUmVjb3JkYCB0byBiZSBjb252ZXJ0ZWQuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyBtYXAgb24gc3VjY2Vzcywgb3Ige0BsaW5rIEZhaWx1cmV9IHdpdGggYVxyXG4gKiBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZFRvTWFwPFRTLCBURCwgVEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KHNyYzogUmVjb3JkPFRLLCBUUz4sIGZhY3Rvcnk6IEtleWVkVGhpbmdGYWN0b3J5PFRTLCBURCwgVEs+KTogUmVzdWx0PE1hcDxUSywgVEQ+PiB7XHJcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPFRLLCBURD4oKTtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHNyYykge1xyXG4gICAgICAgIGlmIChzcmNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1SZXN1bHQgPSBmYWN0b3J5KGtleSwgc3JjW2tleV0pO1xyXG4gICAgICAgICAgICBpZiAoaXRlbVJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xyXG4gICAgICAgICAgICAgICAgbWFwLnNldChrZXksIGl0ZW1SZXN1bHQudmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7a2V5fTogJHtpdGVtUmVzdWx0Lm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VjY2VlZChtYXApO1xyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYFJlY29yZDxUSywgVFM+YCBpbnRvIGEgYE1hcDxUSywgVEQ+YCwgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBzcmMgLSBUaGUgYFJlY29yZGAgdG8gYmUgY29udmVydGVkLCBvciB1bmRlZmluZWQuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyBtYXAgaWYgY29udmVyc2lvbiBzdWNjZWVkcywgb3Ige0BsaW5rIFN1Y2Nlc3N9IHdpdGggYHVuZGVmaW5lZGBcclxuICogaWYgYHNyY2AgaXMgYHVuZGVmaW5lZGAuIFJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsUmVjb3JkVG9NYXA8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBSZWNvcmQ8VEssIFRTPnx1bmRlZmluZWQsIGZhY3Rvcnk6IEtleWVkVGhpbmdGYWN0b3J5PFRTLCBURCwgVEs+KTogUmVzdWx0PE1hcDxUSywgVEQ+fHVuZGVmaW5lZD4ge1xyXG4gICAgcmV0dXJuIChzcmMgPT09IHVuZGVmaW5lZCkgPyBzdWNjZWVkKHVuZGVmaW5lZCkgOiByZWNvcmRUb01hcChzcmMsIGZhY3RvcnkpO1xyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYFJlY29yZDxUSywgVFM+YCBpbnRvIGEgYE1hcDxUSywgVEQ+YFxyXG4gKiBAcGFyYW0gc3JjIC0gVGhlIGBSZWNvcmRgIHRvIGJlIGNvbnZlcnRlZCwgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyBtYXAgKGVtcHR5IGlmIGBzcmNgIGlzIGB1bmRlZmluZWRgKSBpZiBjb252ZXJzaW9uIHN1Y2NlZWRzLlxyXG4gKiBSZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFJlY29yZFRvUG9zc2libHlFbXB0eU1hcDxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihzcmM6IFJlY29yZDxUSywgVFM+fHVuZGVmaW5lZCwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8TWFwPFRLLCBURD4+IHtcclxuICAgIHJldHVybiAoc3JjID09PSB1bmRlZmluZWQpID8gc3VjY2VlZChuZXcgTWFwPFRLLCBURD4oKSkgOiByZWNvcmRUb01hcChzcmMsIGZhY3RvcnkpO1xyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYSBgTWFwPFRLLCBUUz5gIGludG8gYSBgUmVjb3JkPFRLLCBURD5gLlxyXG4gKiBAcGFyYW0gc3JjIC0gVGhlIGBNYXBgIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyBgUmVjb3JkPFRLLCBURD5gIGlmIGNvbnZlcnNpb24gc3VjY2VlZHMsIG9yXHJcbiAqIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgYW4gZXJyb3Igb2NjdXJzLlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9SZWNvcmQ8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBNYXA8VEssIFRTPiwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8UmVjb3JkPFRLLCBURD4+IHtcclxuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPFRLLCBURD4gPSB7fSBhcyBSZWNvcmQ8VEssIFREPjtcclxuICAgIGZvciAoY29uc3Qga3ZwIG9mIHNyYykge1xyXG4gICAgICAgIGlmIChrdnBbMV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtUmVzdWx0ID0gZmFjdG9yeShrdnBbMF0sIGt2cFsxXSk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtUmVzdWx0LmlzU3VjY2VzcygpKSB7XHJcbiAgICAgICAgICAgICAgICByZWNvcmRba3ZwWzBdXSA9IGl0ZW1SZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtrdnBbMF19OiAke2l0ZW1SZXN1bHQubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZWVkKHJlY29yZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhbiBvcHRpb25hbCBgTWFwPHN0cmluZywgVFM+YCBpbnRvIGEgYFJlY29yZDxzdHJpbmcsIFREPmAgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBzcmMgLSBUaGUgYE1hcGAgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCwgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyByZWNvcmQgaWYgY29udmVyc2lvbiBzdWNjZWVkcywgb3Ige0BsaW5rIFN1Y2Nlc3N9IHdpdGggYHVuZGVmaW5lZGAgaWZcclxuICogYHNyY2AgaXMgYHVuZGVmaW5lZGAuIFJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsTWFwVG9SZWNvcmQ8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBNYXA8VEssIFRTPnx1bmRlZmluZWQsIGZhY3Rvcnk6IEtleWVkVGhpbmdGYWN0b3J5PFRTLCBURCwgVEs+KTogUmVzdWx0PFJlY29yZDxUSywgVEQ+fHVuZGVmaW5lZD4ge1xyXG4gICAgcmV0dXJuIChzcmMgPT09IHVuZGVmaW5lZCkgPyBzdWNjZWVkKHVuZGVmaW5lZCkgOiBtYXBUb1JlY29yZChzcmMsIGZhY3RvcnkpO1xyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYE1hcDxzdHJpbmcsIFRTPmAgaW50byBhIGBSZWNvcmQ8c3RyaW5nLCBURD5gXHJcbiAqIEBwYXJhbSBzcmMgLSBUaGUgYE1hcGAgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCwgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyByZWNvcmQgKGVtcHR5IGlmIGBzcmNgIGlzIGB1bmRlZmluZWRgKSBpZiBjb252ZXJzaW9uIHN1Y2NlZWRzLlxyXG4gKiBSZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbE1hcFRvUG9zc2libHlFbXB0eVJlY29yZDxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihzcmM6IE1hcDxUSywgVFM+fHVuZGVmaW5lZCwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8UmVjb3JkPFRLLCBURD4+IHtcclxuICAgIHJldHVybiAoc3JjID09PSB1bmRlZmluZWQpID8gc3VjY2VlZCh7fSBhcyBSZWNvcmQ8VEssIFREPikgOiBtYXBUb1JlY29yZChzcmMsIGZhY3RvcnkpO1xyXG59XHJcbiJdfQ==

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc