/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/// 
/// 
interface SymbolConstructor {
    /**
     * A method that returns the default iterator for an object. Called by the semantics of the
     * for-of statement.
     */
    readonly iterator: unique symbol;
}
interface IteratorYieldResult {
    done?: false;
    value: TYield;
}
interface IteratorReturnResult {
    done: true;
    value: TReturn;
}
type IteratorResult = IteratorYieldResult | IteratorReturnResult;
interface Iterator {
    // NOTE: 'next' is defined using a tuple to ensure we report the correct assignability errors in all places.
    next(...args: [] | [TNext]): IteratorResult;
    return?(value?: TReturn): IteratorResult;
    throw?(e?: any): IteratorResult;
}
interface Iterable {
    [Symbol.iterator](): Iterator;
}
interface IterableIterator extends Iterator {
    [Symbol.iterator](): IterableIterator;
}
interface Array {
    /** Iterator */
    [Symbol.iterator](): IterableIterator;
    /**
     * Returns an iterable of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, T]>;
    /**
     * Returns an iterable of keys in the array
     */
    keys(): IterableIterator;
    /**
     * Returns an iterable of values in the array
     */
    values(): IterableIterator;
}
interface ArrayConstructor {
    /**
     * Creates an array from an iterable object.
     * @param iterable An iterable object to convert to an array.
     */
    from(iterable: Iterable | ArrayLike): T[];
    /**
     * Creates an array from an iterable object.
     * @param iterable An iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(iterable: Iterable | ArrayLike, mapfn: (v: T, k: number) => U, thisArg?: any): U[];
}
interface ReadonlyArray {
    /** Iterator of values in the array. */
    [Symbol.iterator](): IterableIterator;
    /**
     * Returns an iterable of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, T]>;
    /**
     * Returns an iterable of keys in the array
     */
    keys(): IterableIterator;
    /**
     * Returns an iterable of values in the array
     */
    values(): IterableIterator;
}
interface IArguments {
    /** Iterator */
    [Symbol.iterator](): IterableIterator;
}
interface Map {
    /** Returns an iterable of entries in the map. */
    [Symbol.iterator](): IterableIterator<[K, V]>;
    /**
     * Returns an iterable of key, value pairs for every entry in the map.
     */
    entries(): IterableIterator<[K, V]>;
    /**
     * Returns an iterable of keys in the map
     */
    keys(): IterableIterator;
    /**
     * Returns an iterable of values in the map
     */
    values(): IterableIterator;
}
interface ReadonlyMap {
    /** Returns an iterable of entries in the map. */
    [Symbol.iterator](): IterableIterator<[K, V]>;
    /**
     * Returns an iterable of key, value pairs for every entry in the map.
     */
    entries(): IterableIterator<[K, V]>;
    /**
     * Returns an iterable of keys in the map
     */
    keys(): IterableIterator;
    /**
     * Returns an iterable of values in the map
     */
    values(): IterableIterator;
}
interface MapConstructor {
    new(): Map;
    new (iterable?: Iterable | null): Map;
}
interface WeakMap { }
interface WeakMapConstructor {
    new (iterable: Iterable): WeakMap;
}
interface Set {
    /** Iterates over values in the set. */
    [Symbol.iterator](): IterableIterator;
    /**
     * Returns an iterable of [v,v] pairs for every value `v` in the set.
     */
    entries(): IterableIterator<[T, T]>;
    /**
     * Despite its name, returns an iterable of the values in the set.
     */
    keys(): IterableIterator;
    /**
     * Returns an iterable of values in the set.
     */
    values(): IterableIterator;
}
interface ReadonlySet {
    /** Iterates over values in the set. */
    [Symbol.iterator](): IterableIterator;
    /**
     * Returns an iterable of [v,v] pairs for every value `v` in the set.
     */
    entries(): IterableIterator<[T, T]>;
    /**
     * Despite its name, returns an iterable of the values in the set.
     */
    keys(): IterableIterator;
    /**
     * Returns an iterable of values in the set.
     */
    values(): IterableIterator;
}
interface SetConstructor {
    new (iterable?: Iterable | null): Set;
}
interface WeakSet { }
interface WeakSetConstructor {
    new (iterable: Iterable): WeakSet;
}
interface Promise { }
interface PromiseConstructor {
    /**
     * Creates a Promise that is resolved with an array of results when all of the provided Promises
     * resolve, or rejected when any Promise is rejected.
     * @param values An iterable of Promises.
     * @returns A new Promise.
     */
    all(values: Iterable>): Promise[]>;
    /**
     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
     * or rejected.
     * @param values An iterable of Promises.
     * @returns A new Promise.
     */
    race(values: Iterable>): Promise>;
}
interface String {
    /** Iterator */
    [Symbol.iterator](): IterableIterator;
}
interface Int8Array {
    [Symbol.iterator](): IterableIterator;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator;
}
interface Int8ArrayConstructor {
    new (elements: Iterable): Int8Array;
    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable, mapfn?: (v: number, k: number) => number, thisArg?: any): Int8Array;
}
interface Uint8Array {
    [Symbol.iterator](): IterableIterator;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator;
}
interface Uint8ArrayConstructor {
    new (elements: Iterable): Uint8Array;
    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint8Array;
}
interface Uint8ClampedArray {
    [Symbol.iterator](): IterableIterator;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator;
}
interface Uint8ClampedArrayConstructor {
    new (elements: Iterable): Uint8ClampedArray;
    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint8ClampedArray;
}
interface Int16Array {
    [Symbol.iterator](): IterableIterator;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator;
}
interface Int16ArrayConstructor {
    new (elements: Iterable): Int16Array;
    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable, mapfn?: (v: number, k: number) => number, thisArg?: any): Int16Array;
}
interface Uint16Array {
    [Symbol.iterator](): IterableIterator;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator;
}
interface Uint16ArrayConstructor {
    new (elements: Iterable): Uint16Array;
    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint16Array;
}
interface Int32Array {
    [Symbol.iterator](): IterableIterator;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator;
}
interface Int32ArrayConstructor {
    new (elements: Iterable): Int32Array;
    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable, mapfn?: (v: number, k: number) => number, thisArg?: any): Int32Array;
}
interface Uint32Array {
    [Symbol.iterator](): IterableIterator;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator;
}
interface Uint32ArrayConstructor {
    new (elements: Iterable): Uint32Array;
    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint32Array;
}
interface Float32Array {
    [Symbol.iterator](): IterableIterator;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator;
}
interface Float32ArrayConstructor {
    new (elements: Iterable): Float32Array;
    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable, mapfn?: (v: number, k: number) => number, thisArg?: any): Float32Array;
}
interface Float64Array {
    [Symbol.iterator](): IterableIterator;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator;
}
interface Float64ArrayConstructor {
    new (elements: Iterable): Float64Array;
    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable, mapfn?: (v: number, k: number) => number, thisArg?: any): Float64Array;
}