@appium/support 2.56.1 → 2.57.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/env.d.ts +54 -0
- package/build/lib/env.d.ts.map +1 -0
- package/build/lib/fs.d.ts +221 -0
- package/build/lib/fs.d.ts.map +1 -0
- package/build/lib/fs.js +1 -1
- package/build/lib/image-util.d.ts +56 -0
- package/build/lib/image-util.d.ts.map +1 -0
- package/build/lib/image-util.js +2 -3
- package/build/lib/index.d.ts +38 -0
- package/build/lib/index.d.ts.map +1 -0
- package/build/lib/index.js +20 -14
- package/build/lib/log-internal.d.ts +74 -0
- package/build/lib/log-internal.d.ts.map +1 -0
- package/build/lib/log-internal.js +10 -18
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logging.d.ts +45 -0
- package/build/lib/logging.d.ts.map +1 -0
- package/build/lib/logging.js +11 -13
- package/build/lib/mjpeg.d.ts +65 -0
- package/build/lib/mjpeg.d.ts.map +1 -0
- package/build/lib/mjpeg.js +11 -4
- package/build/lib/mkdirp.d.ts +3 -0
- package/build/lib/mkdirp.d.ts.map +1 -0
- package/build/lib/net.d.ts +95 -0
- package/build/lib/net.d.ts.map +1 -0
- package/build/lib/net.js +41 -23
- package/build/lib/node.d.ts +26 -0
- package/build/lib/node.d.ts.map +1 -0
- package/build/lib/node.js +4 -2
- package/build/lib/npm.d.ts +123 -0
- package/build/lib/npm.d.ts.map +1 -0
- package/build/lib/npm.js +18 -41
- package/build/lib/plist.d.ts +43 -0
- package/build/lib/plist.d.ts.map +1 -0
- package/build/lib/plist.js +1 -1
- package/build/lib/process.d.ts +3 -0
- package/build/lib/process.d.ts.map +1 -0
- package/build/lib/system.d.ts +7 -0
- package/build/lib/system.d.ts.map +1 -0
- package/build/lib/tempdir.d.ts +63 -0
- package/build/lib/tempdir.d.ts.map +1 -0
- package/build/lib/tempdir.js +3 -6
- package/build/lib/timing.d.ts +46 -0
- package/build/lib/timing.d.ts.map +1 -0
- package/build/lib/util.d.ts +183 -0
- package/build/lib/util.d.ts.map +1 -0
- package/build/lib/util.js +4 -8
- package/build/lib/zip.d.ts +180 -0
- package/build/lib/zip.d.ts.map +1 -0
- package/build/lib/zip.js +6 -2
- package/build/tsconfig.tsbuildinfo +1 -0
- package/lib/fs.js +9 -4
- package/lib/image-util.js +23 -7
- package/lib/index.js +2 -8
- package/lib/log-internal.js +31 -38
- package/lib/logging.js +40 -16
- package/lib/mjpeg.js +14 -5
- package/lib/net.js +116 -60
- package/lib/node.js +4 -4
- package/lib/npm.js +33 -90
- package/lib/plist.js +3 -1
- package/lib/tempdir.js +8 -7
- package/lib/util.js +10 -11
- package/lib/zip.js +24 -13
- package/package.json +18 -11
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
export function hasContent(val: any): boolean;
|
|
2
|
+
export type PluralizeOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* - Whether to prefix with the number (e.g., 3 ducks)
|
|
5
|
+
*/
|
|
6
|
+
inclusive?: boolean | undefined;
|
|
7
|
+
};
|
|
8
|
+
export type EncodingOptions = {
|
|
9
|
+
/**
|
|
10
|
+
* The maximum size of
|
|
11
|
+
* the resulting buffer in bytes. This is set to 1GB by default, because
|
|
12
|
+
* Appium limits the maximum HTTP body size to 1GB. Also, the NodeJS heap
|
|
13
|
+
* size must be enough to keep the resulting object (usually this size is
|
|
14
|
+
* limited to 1.4 GB)
|
|
15
|
+
*/
|
|
16
|
+
maxSize?: number | undefined;
|
|
17
|
+
};
|
|
18
|
+
export type LockFileOptions = {
|
|
19
|
+
/**
|
|
20
|
+
* The max time in seconds to wait for the lock
|
|
21
|
+
*/
|
|
22
|
+
timeout?: number | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Whether to try lock recovery if
|
|
25
|
+
* the first attempt to acquire it timed out.
|
|
26
|
+
*/
|
|
27
|
+
tryRecovery?: boolean | undefined;
|
|
28
|
+
};
|
|
29
|
+
export function hasValue(val: any): boolean;
|
|
30
|
+
export function escapeSpace(str: any): any;
|
|
31
|
+
export function escapeSpecialChars(str: any, quoteEscape: any): any;
|
|
32
|
+
export function localIp(): any;
|
|
33
|
+
export function cancellableDelay(ms: any): B<any>;
|
|
34
|
+
export function multiResolve(roots: any, ...args: any[]): any;
|
|
35
|
+
export function safeJsonParse(obj: any): any;
|
|
36
|
+
export function wrapElement(elementId: any): {
|
|
37
|
+
ELEMENT: any;
|
|
38
|
+
"element-6066-11e4-a52e-4f735466cecf": any;
|
|
39
|
+
};
|
|
40
|
+
export function unwrapElement(el: any): any;
|
|
41
|
+
export function filterObject(obj: any, predicate: any): any;
|
|
42
|
+
/**
|
|
43
|
+
* Converts number of bytes to a readable size string.
|
|
44
|
+
*
|
|
45
|
+
* @param {number|string} bytes - The actual number of bytes.
|
|
46
|
+
* @returns {string} The actual string representation, for example
|
|
47
|
+
* '1.00 KB' for '1024 B'
|
|
48
|
+
* @throws {Error} If bytes count cannot be converted to an integer or
|
|
49
|
+
* if it is less than zero.
|
|
50
|
+
*/
|
|
51
|
+
export function toReadableSizeString(bytes: number | string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Checks whether the given path is a subpath of the
|
|
54
|
+
* particular root folder. Both paths can include .. and . specifiers
|
|
55
|
+
*
|
|
56
|
+
* @param {string} originalPath The absolute file/folder path
|
|
57
|
+
* @param {string} root The absolute root folder path
|
|
58
|
+
* @param {?boolean} forcePosix Set it to true if paths must be interpreted in POSIX format
|
|
59
|
+
* @returns {boolean} true if the given original path is the subpath of the root folder
|
|
60
|
+
* @throws {Error} if any of the given paths is not absolute
|
|
61
|
+
*/
|
|
62
|
+
export function isSubPath(originalPath: string, root: string, forcePosix?: boolean | null): boolean;
|
|
63
|
+
export const W3C_WEB_ELEMENT_IDENTIFIER: "element-6066-11e4-a52e-4f735466cecf";
|
|
64
|
+
/**
|
|
65
|
+
* Checks whether the given paths are pointing to the same file system
|
|
66
|
+
* destination.
|
|
67
|
+
*
|
|
68
|
+
* @param {string} path1 - Absolute or relative path to a file/folder
|
|
69
|
+
* @param {string} path2 - Absolute or relative path to a file/folder
|
|
70
|
+
* @param {...string} pathN - Zero or more absolute or relative paths to files/folders
|
|
71
|
+
* @returns {Promise<boolean>} true if all paths are pointing to the same file system item
|
|
72
|
+
*/
|
|
73
|
+
export function isSameDestination(path1: string, path2: string, ...pathN: string[]): Promise<boolean>;
|
|
74
|
+
/**
|
|
75
|
+
* Compares two version strings
|
|
76
|
+
*
|
|
77
|
+
* @param {string} ver1 - The first version number to compare. Should be a valid
|
|
78
|
+
* version number supported by semver parser.
|
|
79
|
+
* @param {string} ver2 - The second version number to compare. Should be a valid
|
|
80
|
+
* version number supported by semver parser.
|
|
81
|
+
* @param {string} operator - One of supported version number operators:
|
|
82
|
+
* ==, !=, >, <, <=, >=, =
|
|
83
|
+
* @returns {boolean} true or false depending on the actual comparison result
|
|
84
|
+
* @throws {Error} if an unsupported operator is supplied or any of the supplied
|
|
85
|
+
* version strings cannot be coerced
|
|
86
|
+
*/
|
|
87
|
+
export function compareVersions(ver1: string, operator: string, ver2: string): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Coerces the given number/string to a valid version string
|
|
90
|
+
*
|
|
91
|
+
* @template {boolean} [Strict=true]
|
|
92
|
+
* @param {string} ver - Version string to coerce
|
|
93
|
+
* @param {Strict} [strict] - If `true` then an exception will be thrown
|
|
94
|
+
* if `ver` cannot be coerced
|
|
95
|
+
* @returns {Strict extends true ? string : string|null} Coerced version number or null if the string cannot be
|
|
96
|
+
* coerced and strict mode is disabled
|
|
97
|
+
* @throws {Error} if strict mode is enabled and `ver` cannot be coerced
|
|
98
|
+
*/
|
|
99
|
+
export function coerceVersion<Strict extends boolean = true>(ver: string, strict?: Strict | undefined): Strict extends true ? string : string | null;
|
|
100
|
+
/**
|
|
101
|
+
* Add appropriate quotes to command arguments. See https://github.com/substack/node-shell-quote
|
|
102
|
+
* for more details
|
|
103
|
+
*
|
|
104
|
+
* @param {string|string[]} args - The arguments that will be parsed
|
|
105
|
+
* @returns {string} - The arguments, quoted
|
|
106
|
+
*/
|
|
107
|
+
export function quote(args: string | string[]): string;
|
|
108
|
+
/**
|
|
109
|
+
* This function is necessary to workaround unexpected memory leaks
|
|
110
|
+
* caused by NodeJS string interning
|
|
111
|
+
* behavior described in https://bugs.chromium.org/p/v8/issues/detail?id=2869
|
|
112
|
+
*
|
|
113
|
+
* @param {*} s - The string to unleak
|
|
114
|
+
* @return {string} Either the unleaked string or the original object converted to string
|
|
115
|
+
*/
|
|
116
|
+
export function unleakString(s: any): string;
|
|
117
|
+
export function jsonStringify(obj: any, replacer: any, space?: number): string;
|
|
118
|
+
/**
|
|
119
|
+
* @typedef PluralizeOptions
|
|
120
|
+
* @property {boolean} [inclusive=false] - Whether to prefix with the number (e.g., 3 ducks)
|
|
121
|
+
*/
|
|
122
|
+
/**
|
|
123
|
+
* Get the form of a word appropriate to the count
|
|
124
|
+
*
|
|
125
|
+
* @param {string} word - The word to pluralize
|
|
126
|
+
* @param {number} count - How many of the word exist
|
|
127
|
+
* @param {PluralizeOptions|boolean} options - options for word pluralization,
|
|
128
|
+
* or a boolean indicating the options.inclusive property
|
|
129
|
+
* @returns {string} The word pluralized according to the number
|
|
130
|
+
*/
|
|
131
|
+
export function pluralize(word: string, count: number, options?: PluralizeOptions | boolean): string;
|
|
132
|
+
export const GiB: number;
|
|
133
|
+
export const MiB: number;
|
|
134
|
+
export const KiB: 1024;
|
|
135
|
+
/**
|
|
136
|
+
* @typedef EncodingOptions
|
|
137
|
+
* @property {number} [maxSize=1073741824] The maximum size of
|
|
138
|
+
* the resulting buffer in bytes. This is set to 1GB by default, because
|
|
139
|
+
* Appium limits the maximum HTTP body size to 1GB. Also, the NodeJS heap
|
|
140
|
+
* size must be enough to keep the resulting object (usually this size is
|
|
141
|
+
* limited to 1.4 GB)
|
|
142
|
+
*/
|
|
143
|
+
/**
|
|
144
|
+
* Converts contents of a local file to an in-memory base-64 encoded buffer.
|
|
145
|
+
* The operation is memory-usage friendly and should be used while encoding
|
|
146
|
+
* large files to base64
|
|
147
|
+
*
|
|
148
|
+
* @param {string} srcPath The full path to the file being encoded
|
|
149
|
+
* @param {EncodingOptions} opts
|
|
150
|
+
* @returns {Promise<Buffer>} base64-encoded content of the source file as memory buffer
|
|
151
|
+
* @throws {Error} if there was an error while reading the source file
|
|
152
|
+
* or the source file is too
|
|
153
|
+
*/
|
|
154
|
+
export function toInMemoryBase64(srcPath: string, opts?: EncodingOptions): Promise<Buffer>;
|
|
155
|
+
import { v1 as uuidV1 } from "uuid";
|
|
156
|
+
import { v3 as uuidV3 } from "uuid";
|
|
157
|
+
import { v4 as uuidV4 } from "uuid";
|
|
158
|
+
import { v5 as uuidV5 } from "uuid";
|
|
159
|
+
import { parse as shellParse } from "shell-quote";
|
|
160
|
+
/**
|
|
161
|
+
* @typedef LockFileOptions
|
|
162
|
+
* @property {number} [timeout=120] The max time in seconds to wait for the lock
|
|
163
|
+
* @property {boolean} [tryRecovery=false] Whether to try lock recovery if
|
|
164
|
+
* the first attempt to acquire it timed out.
|
|
165
|
+
*/
|
|
166
|
+
/**
|
|
167
|
+
* Create an async function which, when called, will not proceed until a certain file is no
|
|
168
|
+
* longer present on the system. This allows for preventing concurrent behavior across processes
|
|
169
|
+
* using a known lockfile path.
|
|
170
|
+
*
|
|
171
|
+
* @template T
|
|
172
|
+
* @param {string} lockFile The full path to the file used for the lock
|
|
173
|
+
* @param {LockFileOptions} opts
|
|
174
|
+
* @returns async function that takes another async function defining the locked
|
|
175
|
+
* behavior
|
|
176
|
+
*/
|
|
177
|
+
export function getLockFileGuard<T>(lockFile: string, opts?: LockFileOptions): {
|
|
178
|
+
(behavior: (...args: any[]) => T): Promise<T>;
|
|
179
|
+
check(): Promise<boolean>;
|
|
180
|
+
};
|
|
181
|
+
import B from "bluebird";
|
|
182
|
+
export { uuidV1, uuidV3, uuidV4, uuidV5, shellParse };
|
|
183
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../lib/util.js"],"names":[],"mappings":"AA6BA,8CAEC;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGD,4CAUC;AAGD,2CAEC;AAED,oEAsBC;AAED,+BAYC;AAMD,kDAoBC;AAED,8DAEC;AAKD,6CAOC;AAkDD;;;EAKC;AAdD,4CAOC;AAiBD,4DAgBC;AAED;;;;;;;;GAQG;AACH,4CANW,MAAM,GAAC,MAAM,GACX,MAAM,CAkBlB;AAED;;;;;;;;;GASG;AACH,wCANW,MAAM,QACN,MAAM,eACL,OAAO,UACN,OAAO,CAanB;AAxOD,+EAAyE;AA0OzE;;;;;;;;GAQG;AACH,yCALW,MAAM,SACN,MAAM,YACH,MAAM,KACP,QAAQ,OAAO,CAAC,CAiB5B;AAuBD;;;;;;;;;;;;GAYG;AACH,sCAVW,MAAM,YAIN,MAAM,QAFN,MAAM,GAIJ,OAAO,CAanB;AA3CD;;;;;;;;;;GAUG;AACH,kEAPW,MAAM,6EAahB;AA4BD;;;;;;GAMG;AACH,4BAHW,MAAM,GAAC,MAAM,EAAE,GACb,MAAM,CAIlB;AAED;;;;;;;GAOG;AACH,sCAFY,MAAM,CAIjB;AA/MD,+EAoBC;AA8LD;;;GAGG;AAEH;;;;;;;;GAQG;AACH,gCANW,MAAM,SACN,MAAM,YACN,gBAAgB,GAAC,OAAO,GAEtB,MAAM,CAYlB;AA9VD,yBAAuB;AADvB,yBAAuB;AADvB,uBAAiB;AAkWjB;;;;;;;GAOG;AAEH;;;;;;;;;;GAUG;AACH,0CANW,MAAM,SACN,eAAe,GACb,QAAQ,MAAM,CAAC,CA+C3B;;;;;;AAED;;;;;GAKG;AAEH;;;;;;;;;;GAUG;AACH,8CALW,MAAM,SACN,eAAe;yBAeH,GAAG,EAAE;;EAwC3B"}
|
package/build/lib/util.js
CHANGED
|
@@ -273,13 +273,9 @@ async function isSameDestination(path1, path2, ...pathN) {
|
|
|
273
273
|
return true;
|
|
274
274
|
}
|
|
275
275
|
|
|
276
|
-
let mapCb = async x => await _fs.default.stat(x, {
|
|
276
|
+
let mapCb = async x => (await _fs.default.stat(x, {
|
|
277
277
|
bigint: true
|
|
278
|
-
}).ino;
|
|
279
|
-
|
|
280
|
-
if (_semver.default.lt(process.version, '10.5.0')) {
|
|
281
|
-
mapCb = async x => await _fs.default.stat(x).ino;
|
|
282
|
-
}
|
|
278
|
+
})).ino;
|
|
283
279
|
|
|
284
280
|
return areAllItemsEqual(await _bluebird.default.map(allPaths, mapCb));
|
|
285
281
|
}
|
|
@@ -309,7 +305,7 @@ function compareVersions(ver1, operator, ver2) {
|
|
|
309
305
|
}
|
|
310
306
|
|
|
311
307
|
function quote(args) {
|
|
312
|
-
return (0, _shellQuote.quote)(args);
|
|
308
|
+
return (0, _shellQuote.quote)(_lodash.default.castArray(args));
|
|
313
309
|
}
|
|
314
310
|
|
|
315
311
|
function unleakString(s) {
|
|
@@ -422,4 +418,4 @@ function getLockFileGuard(lockFile, opts = {}) {
|
|
|
422
418
|
|
|
423
419
|
return guard;
|
|
424
420
|
}
|
|
425
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlsLmpzIl0sIm5hbWVzIjpbIlczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSIiwiS2lCIiwiTWlCIiwiR2lCIiwiaGFzQ29udGVudCIsInZhbCIsIl8iLCJpc1N0cmluZyIsImhhc1ZhbHVlIiwiaGFzVmFsIiwiaXNOdW1iZXIiLCJpc05hTiIsImlzVW5kZWZpbmVkIiwiaXNOdWxsIiwiZXNjYXBlU3BhY2UiLCJzdHIiLCJzcGxpdCIsImpvaW4iLCJlc2NhcGVTcGVjaWFsQ2hhcnMiLCJxdW90ZUVzY2FwZSIsInJlcGxhY2UiLCJyZSIsIlJlZ0V4cCIsImxvY2FsSXAiLCJpcCIsImNoYWluIiwib3MiLCJuZXR3b3JrSW50ZXJmYWNlcyIsInZhbHVlcyIsImZsYXR0ZW4iLCJmaWx0ZXIiLCJmYW1pbHkiLCJpbnRlcm5hbCIsIm1hcCIsImZpcnN0IiwidmFsdWUiLCJjYW5jZWxsYWJsZURlbGF5IiwibXMiLCJ0aW1lciIsInJlc29sdmUiLCJyZWplY3QiLCJkZWxheSIsIkIiLCJQcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0Iiwic2V0VGltZW91dCIsImNhbmNlbCIsImNsZWFyVGltZW91dCIsIkNhbmNlbGxhdGlvbkVycm9yIiwibXVsdGlSZXNvbHZlIiwicm9vdHMiLCJhcmdzIiwicm9vdCIsInBhdGgiLCJzYWZlSnNvblBhcnNlIiwib2JqIiwiSlNPTiIsInBhcnNlIiwiaWduIiwianNvblN0cmluZ2lmeSIsInJlcGxhY2VyIiwic3BhY2UiLCJpc0Z1bmN0aW9uIiwiayIsInYiLCJidWZmZXJUb0pTT04iLCJCdWZmZXIiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJzdHJpbmdpZnkiLCJrZXkiLCJ1cGRhdGVkVmFsdWUiLCJpc0J1ZmZlciIsInRvU3RyaW5nIiwidW53cmFwRWxlbWVudCIsImVsIiwicHJvcE5hbWUiLCJoYXMiLCJ3cmFwRWxlbWVudCIsImVsZW1lbnRJZCIsIkVMRU1FTlQiLCJmaWx0ZXJPYmplY3QiLCJwcmVkaWNhdGUiLCJuZXdPYmoiLCJjbG9uZSIsInZhbHVlUHJlZGljYXRlIiwiT2JqZWN0Iiwia2V5cyIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwiYnl0ZXMiLCJpbnRCeXRlcyIsInBhcnNlSW50IiwiU3RyaW5nIiwiRXJyb3IiLCJ0b0ZpeGVkIiwiaXNTdWJQYXRoIiwib3JpZ2luYWxQYXRoIiwiZm9yY2VQb3NpeCIsInBhdGhPYmoiLCJwb3NpeCIsInAiLCJpc0Fic29sdXRlIiwibm9ybWFsaXplZFJvb3QiLCJub3JtYWxpemUiLCJub3JtYWxpemVkUGF0aCIsInN0YXJ0c1dpdGgiLCJpc1NhbWVEZXN0aW5hdGlvbiIsInBhdGgxIiwicGF0aDIiLCJwYXRoTiIsImFsbFBhdGhzIiwicmVkdWNlIiwiYSIsImIiLCJmcyIsImV4aXN0cyIsImFyZUFsbEl0ZW1zRXF1YWwiLCJhcnIiLCJOYU4iLCJtYXBDYiIsIngiLCJzdGF0IiwiYmlnaW50IiwiaW5vIiwic2VtdmVyIiwibHQiLCJwcm9jZXNzIiwidmVyc2lvbiIsImNvZXJjZVZlcnNpb24iLCJ2ZXIiLCJzdHJpY3QiLCJyZXN1bHQiLCJ2YWxpZCIsImNvZXJjZSIsIlNVUFBPUlRFRF9PUEVSQVRPUlMiLCJjb21wYXJlVmVyc2lvbnMiLCJ2ZXIxIiwib3BlcmF0b3IiLCJ2ZXIyIiwiaW5jbHVkZXMiLCJzZW12ZXJPcGVyYXRvciIsInNhdGlzZmllcyIsInF1b3RlIiwidW5sZWFrU3RyaW5nIiwicyIsInN1YnN0ciIsInBsdXJhbGl6ZSIsIndvcmQiLCJjb3VudCIsIm9wdGlvbnMiLCJpbmNsdXNpdmUiLCJpc0Jvb2xlYW4iLCJ0b0luTWVtb3J5QmFzZTY0Iiwic3JjUGF0aCIsIm9wdHMiLCJpc0RpcmVjdG9yeSIsIm1heFNpemUiLCJyZXN1bHRCdWZmZXJzIiwicmVzdWx0QnVmZmVyc1NpemUiLCJyZXN1bHRXcml0ZVN0cmVhbSIsInN0cmVhbSIsIldyaXRhYmxlIiwid3JpdGUiLCJidWZmZXIiLCJlbmNvZGluZyIsIm5leHQiLCJwdXNoIiwibGVuZ3RoIiwiZW1pdCIsInJlYWRlclN0cmVhbSIsImNyZWF0ZVJlYWRTdHJlYW0iLCJiYXNlNjRFbmNvZGVyU3RyZWFtIiwiQmFzZTY0RW5jb2RlIiwicmVzdWx0V3JpdGVTdHJlYW1Qcm9taXNlIiwib25jZSIsImUiLCJ1bnBpcGUiLCJkZXN0cm95IiwicmVhZFN0cmVhbVByb21pc2UiLCJtZXNzYWdlIiwicGlwZSIsImFsbCIsImNvbmNhdCIsImdldExvY2tGaWxlR3VhcmQiLCJsb2NrRmlsZSIsInRpbWVvdXQiLCJ0cnlSZWNvdmVyeSIsImxvY2siLCJwcm9taXNpZnkiLCJfbG9ja2ZpbGUiLCJjaGVjayIsInVubG9jayIsImd1YXJkIiwiYmVoYXZpb3IiLCJ0cmllZFJlY292ZXJ5IiwiY2hlY2tTeW5jIiwid2FpdCIsImxvY2tTeW5jIiwidW5sb2NrU3luYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBR0EsTUFBTUEsMEJBQTBCLEdBQUcscUNBQW5DOztBQUNBLE1BQU1DLEdBQUcsR0FBRyxJQUFaOztBQUNBLE1BQU1DLEdBQUcsR0FBR0QsR0FBRyxHQUFHLElBQWxCOztBQUNBLE1BQU1FLEdBQUcsR0FBR0QsR0FBRyxHQUFHLElBQWxCOzs7QUFFTyxTQUFTRSxVQUFULENBQXFCQyxHQUFyQixFQUEwQjtBQUMvQixTQUFPQyxnQkFBRUMsUUFBRixDQUFXRixHQUFYLEtBQW1CQSxHQUFHLEtBQUssRUFBbEM7QUFDRDs7QUFHRCxTQUFTRyxRQUFULENBQW1CSCxHQUFuQixFQUF3QjtBQUN0QixNQUFJSSxNQUFNLEdBQUcsS0FBYjs7QUFFQSxNQUFJSCxnQkFBRUksUUFBRixDQUFXTCxHQUFYLENBQUosRUFBcUI7QUFDbkJJLElBQUFBLE1BQU0sR0FBRyxDQUFDSCxnQkFBRUssS0FBRixD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bmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnLi9mcyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQge1xuICAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9zaGVsbC1xdW90ZVxuICBxdW90ZSBhcyBzaGVsbFF1b3RlLFxuICBwYXJzZSBhcyBzaGVsbFBhcnNlLFxufSBmcm9tICdzaGVsbC1xdW90ZSc7XG5pbXBvcnQgcGx1cmFsaXplTGliIGZyb20gJ3BsdXJhbGl6ZSc7XG5pbXBvcnQgc3RyZWFtIGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBCYXNlNjRFbmNvZGUgfSBmcm9tICdiYXNlNjQtc3RyZWFtJztcbmltcG9ydCB7XG4gIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3V1aWRcbiAgdjEgYXMgdXVpZFYxLCB2MyBhcyB1dWlkVjMsXG4gIHY0IGFzIHV1aWRWNCwgdjUgYXMgdXVpZFY1XG59IGZyb20gJ3V1aWQnO1xuaW1wb3J0IF9sb2NrZmlsZSBmcm9tICdsb2NrZmlsZSc7XG5cblxuY29uc3QgVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVIgPSAnZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2YnO1xuY29uc3QgS2lCID0gMTAyNDtcbmNvbnN0IE1pQiA9IEtpQiAqIDEwMjQ7XG5jb25zdCBHaUIgPSBNaUIgKiAxMDI0O1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzQ29udGVudCAodmFsKSB7XG4gIHJldHVybiBfLmlzU3RyaW5nKHZhbCkgJiYgdmFsICE9PSAnJztcbn1cblxuLy8gcmV0dXJuIHRydWUgaWYgdGhlIHRoZSB2YWx1ZSBpcyBub3QgdW5kZWZpbmVkLCBudWxsLCBvciBOYU4uXG5mdW5jdGlvbiBoYXNWYWx1ZSAodmFsKSB7XG4gIGxldCBoYXNWYWwgPSBmYWxzZTtcbiAgLy8gYXZvaWQgaW5jb3JyZWN0bHkgZXZhbHVhdGluZyBgMGAgYXMgZmFsc2VcbiAgaWYgKF8uaXNOdW1iZXIodmFsKSkge1xuICAgIGhhc1ZhbCA9ICFfLmlzTmFOKHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgaGFzVmFsID0gIV8uaXNVbmRlZmluZWQodmFsKSAmJiAhXy5pc051bGwodmFsKTtcbiAgfVxuXG4gIHJldHVybiBoYXNWYWw7XG59XG5cbi8vIGVzY2FwZSBzcGFjZXMgaW4gc3RyaW5nLCBmb3IgY29tbWFuZGxpbmUgY2FsbHNcbmZ1bmN0aW9uIGVzY2FwZVNwYWNlIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgvIC8pLmpvaW4oJ1xcXFwgJyk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVNwZWNpYWxDaGFycyAoc3RyLCBxdW90ZUVzY2FwZSkge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIGlmICh0eXBlb2YgcXVvdGVFc2NhcGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcXVvdGVFc2NhcGUgPSBmYWxzZTtcbiAgfVxuICBzdHIgPSBzdHJcbiAgICAucmVwbGFjZSgvW1xcXFxdL2csICdcXFxcXFxcXCcpXG4gICAgLnJlcGxhY2UoL1tcXC9dL2csICdcXFxcLycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgICAucmVwbGFjZSgvW1xcYl0vZywgJ1xcXFxiJylcbiAgICAucmVwbGFjZSgvW1xcZl0vZywgJ1xcXFxmJylcbiAgICAucmVwbGFjZSgvW1xcbl0vZywgJ1xcXFxuJylcbiAgICAucmVwbGFjZSgvW1xccl0vZywgJ1xcXFxyJylcbiAgICAucmVwbGFjZSgvW1xcdF0vZywgJ1xcXFx0JylcbiAgICAucmVwbGFjZSgvW1xcXCJdL2csICdcXFxcXCInKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgLnJlcGxhY2UoL1xcXFwnL2csIFwiXFxcXCdcIik7XG4gIGlmIChxdW90ZUVzY2FwZSkge1xuICAgIGxldCByZSA9IG5ldyBSZWdFeHAocXVvdGVFc2NhcGUsICdnJyk7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UocmUsIGBcXFxcJHtxdW90ZUVzY2FwZX1gKTtcbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBsb2NhbElwICgpIHtcbiAgbGV0IGlwID0gXy5jaGFpbihvcy5uZXR3b3JrSW50ZXJmYWNlcygpKVxuICAgIC52YWx1ZXMoKVxuICAgIC5mbGF0dGVuKClcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gKHZhbC5mYW1pbHkgPT09ICdJUHY0JyAmJiB2YWwuaW50ZXJuYWwgPT09IGZhbHNlKTtcbiAgICB9KVxuICAgIC5tYXAoJ2FkZHJlc3MnKVxuICAgIC5maXJzdCgpXG4gICAgLnZhbHVlKCk7XG4gIHJldHVybiBpcDtcbn1cblxuLypcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgaXMgY2FuY2VsbGFibGUsIGFuZCB3aWxsIHRpbWVvdXRcbiAqIGFmdGVyIGBtc2AgZGVsYXlcbiAqL1xuZnVuY3Rpb24gY2FuY2VsbGFibGVEZWxheSAobXMpIHtcbiAgbGV0IHRpbWVyO1xuICBsZXQgcmVzb2x2ZTtcbiAgbGV0IHJlamVjdDtcblxuICBjb25zdCBkZWxheSA9IG5ldyBCLlByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgcmVzb2x2ZSA9IF9yZXNvbHZlO1xuICAgIHJlamVjdCA9IF9yZWplY3Q7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9LCBtcyk7XG4gIH0pO1xuXG4gIC8vIG92ZXJyaWRlIEJsdWViaXJkJ3MgYGNhbmNlbGAsIHdoaWNoIGRvZXMgbm90IHdvcmsgd2hlbiB1c2luZyBgYXdhaXRgIG9uXG4gIC8vIGEgcHJvbWlzZSwgc2luY2UgYHJlc29sdmVgL2ByZWplY3RgIGFyZSBuZXZlciBjYWxsZWRcbiAgZGVsYXkuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgcmVqZWN0KG5ldyBCLkNhbmNlbGxhdGlvbkVycm9yKCkpO1xuICB9O1xuICByZXR1cm4gZGVsYXk7XG59XG5cbmZ1bmN0aW9uIG11bHRpUmVzb2x2ZSAocm9vdHMsIC4uLmFyZ3MpIHtcbiAgcmV0dXJuIHJvb3RzLm1hcCgocm9vdCkgPT4gcGF0aC5yZXNvbHZlKHJvb3QsIC4uLmFyZ3MpKTtcbn1cblxuLypcbiAqIFBhcnNlcyBhbiBvYmplY3QgaWYgcG9zc2libGUuIE90aGVyd2lzZSByZXR1cm5zIHRoZSBvYmplY3Qgd2l0aG91dCBwYXJzaW5nLlxuICovXG5mdW5jdGlvbiBzYWZlSnNvblBhcnNlIChvYmopIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShvYmopO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICAvLyBpZ25vcmU6IHRoaXMgaXMgbm90IGpzb24gcGFyc2FibGVcbiAgICByZXR1cm4gb2JqO1xuICB9XG59XG5cbi8qXG4gKiBTdHJpbmdpZmllcyB0aGUgb2JqZWN0IHBhc3NlZCBpbiwgY29udmVydGluZyBCdWZmZXJzIGludG8gU3RyaW5ncyBmb3IgYmV0dGVyXG4gKiBkaXNwbGF5LiBUaGlzIG1pbWljcyBKU09OLnN0cmluZ2lmeSAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5KVxuICogZXhjZXB0IHRoZSBgcmVwbGFjZXJgIGFyZ3VtZW50IGNhbiBvbmx5IGJlIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtIHs/ZnVuY3Rpb259IHJlcGxhY2VyIC0gZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBwcm9wZXJ0aWVzIGFkZGVkIHRvIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCBvYmplY3RcbiAqIEBwYXJhbSB7P251bWJlcnxzdHJpbmd9IHNwYWNlIC0gdXNlZCB0byBpbnNlcnQgd2hpdGUgc3BhY2UgaW50byB0aGUgb3V0cHV0IEpTT05cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciByZWFkYWJpbGl0eSBwdXJwb3Nlcy4gRGVmYXVsdHMgdG8gMlxuICogcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBKU09OIG9iamVjdCBzZXJpYWxpemVkIGFzIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGpzb25TdHJpbmdpZnkgKG9iaiwgcmVwbGFjZXIsIHNwYWNlID0gMikge1xuICAvLyBpZiBubyByZXBsYWNlciBpcyBwYXNzZWQsIG9yIGl0IGlzIG5vdCBhIGZ1bmN0aW9uLCBqdXN0IHVzZSBhIHBhc3MtdGhyb3VnaFxuICBpZiAoIV8uaXNGdW5jdGlvbihyZXBsYWNlcikpIHtcbiAgICByZXBsYWNlciA9IChrLCB2KSA9PiB2O1xuICB9XG5cbiAgLy8gQnVmZmVycyBjYW5ub3QgYmUgc2VyaWFsaXplZCBpbiBhIHJlYWRhYmxlIHdheVxuICBjb25zdCBidWZmZXJUb0pTT04gPSBCdWZmZXIucHJvdG90eXBlLnRvSlNPTjtcbiAgZGVsZXRlIEJ1ZmZlci5wcm90b3R5cGUudG9KU09OO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkVmFsdWUgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpXG4gICAgICAgID8gdmFsdWUudG9TdHJpbmcoJ3V0ZjgnKVxuICAgICAgICA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHJlcGxhY2VyKGtleSwgdXBkYXRlZFZhbHVlKTtcbiAgICB9LCBzcGFjZSk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gcmVzdG9yZSB0aGUgZnVuY3Rpb24sIHNvIGFzIHRvIG5vdCBicmVhayBmdXJ0aGVyIHNlcmlhbGl6YXRpb25cbiAgICBCdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGJ1ZmZlclRvSlNPTjtcbiAgfVxufVxuXG4vKlxuICogUmVtb3ZlcyB0aGUgd3JhcHBlciBmcm9tIGVsZW1lbnQsIGlmIGl0IGV4aXN0cy5cbiAqICAgeyBFTEVNRU5UOiA0IH0gYmVjb21lcyA0XG4gKiAgIHsgZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2Y6IDUgfSBiZWNvbWVzIDVcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudCAoZWwpIHtcbiAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVIsICdFTEVNRU5UJ10pIHtcbiAgICBpZiAoXy5oYXMoZWwsIHByb3BOYW1lKSkge1xuICAgICAgcmV0dXJuIGVsW3Byb3BOYW1lXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVsO1xufVxuXG5mdW5jdGlvbiB3cmFwRWxlbWVudCAoZWxlbWVudElkKSB7XG4gIHJldHVybiB7XG4gICAgRUxFTUVOVDogZWxlbWVudElkLFxuICAgIFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl06IGVsZW1lbnRJZCxcbiAgfTtcbn1cblxuLypcbiAqIFJldHVybnMgb2JqZWN0IGNvbnNpc3Rpbmcgb2YgYWxsIHByb3BlcnRpZXMgaW4gdGhlIG9yaWdpbmFsIGVsZW1lbnRcbiAqIHdoaWNoIHdlcmUgdHJ1dGh5IGdpdmVuIHRoZSBwcmVkaWNhdGUuXG4gKiBJZiB0aGUgcHJlZGljYXRlIGlzXG4gKiAgICogbWlzc2luZyAtIGl0IHdpbGwgcmVtb3ZlIGFsbCBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcyBhcmUgYHVuZGVmaW5lZGBcbiAqICAgKiBhIHNjYWxhciAtIGl0IHdpbGwgdGVzdCBhbGwgcHJvcGVydGllcycgdmFsdWVzIGFnYWluc3QgdGhhdCB2YWx1ZVxuICogICAqIGEgZnVuY3Rpb24gLSBpdCB3aWxsIHBhc3MgZWFjaCB2YWx1ZSBhbmQgdGhlIG9yaWdpbmFsIG9iamVjdCBpbnRvIHRoZSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBmaWx0ZXJPYmplY3QgKG9iaiwgcHJlZGljYXRlKSB7XG4gIGxldCBuZXdPYmogPSBfLmNsb25lKG9iaik7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByZWRpY2F0ZSkpIHtcbiAgICAvLyByZW1vdmUgYW55IGVsZW1lbnQgZnJvbSB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgIHByZWRpY2F0ZSA9ICh2KSA9PiAhXy5pc1VuZGVmaW5lZCh2KTtcbiAgfSBlbHNlIGlmICghXy5pc0Z1bmN0aW9uKHByZWRpY2F0ZSkpIHtcbiAgICAvLyBtYWtlIHByZWRpY2F0ZSBpbnRvIGEgZnVuY3Rpb25cbiAgICBjb25zdCB2YWx1ZVByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICBwcmVkaWNhdGUgPSAodikgPT4gdiA9PT0gdmFsdWVQcmVkaWNhdGU7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGlmICghcHJlZGljYXRlKG9ialtrZXldLCBvYmopKSB7XG4gICAgICBkZWxldGUgbmV3T2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdPYmo7XG59XG5cbi8qKlxuICogQ29udmVydHMgbnVtYmVyIG9mIGJ5dGVzIHRvIGEgcmVhZGFibGUgc2l6ZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBieXRlcyAtIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGFjdHVhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGZvciBleGFtcGxlXG4gKiAgICAgICAgICAgICAgICAgICAnMS4wMCBLQicgZm9yICcxMDI0IEInXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYnl0ZXMgY291bnQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIG9yXG4gKiAgICAgICAgICAgICAgICAgaWYgaXQgaXMgbGVzcyB0aGFuIHplcm8uXG4gKi9cbmZ1bmN0aW9uIHRvUmVhZGFibGVTaXplU3RyaW5nIChieXRlcykge1xuICBjb25zdCBpbnRCeXRlcyA9IHBhcnNlSW50KFN0cmluZyhieXRlcyksIDEwKTtcbiAgaWYgKGlzTmFOKGludEJ5dGVzKSB8fCBpbnRCeXRlcyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0ICcke2J5dGVzfScgdG8gYSByZWFkYWJsZSBzaXplIGZvcm1hdGApO1xuICB9XG4gIGlmIChpbnRCeXRlcyA+PSBHaUIpIHtcbiAgICByZXR1cm4gYCR7KGludEJ5dGVzIC8gKEdpQiAqIDEuMCkpLnRvRml4ZWQoMil9IEdCYDtcbiAgfSBlbHNlIGlmIChpbnRCeXRlcyA+PSBNaUIpIHtcbiAgICByZXR1cm4gYCR7KGludEJ5dGVzIC8gKE1pQiAqIDEuMCkpLnRvRml4ZWQoMil9IE1CYDtcbiAgfSBlbHNlIGlmIChpbnRCeXRlcyA+PSBLaUIpIHtcbiAgICByZXR1cm4gYCR7KGludEJ5dGVzIC8gKEtpQiAqIDEuMCkpLnRvRml4ZWQoMil9IEtCYDtcbiAgfVxuICByZXR1cm4gYCR7aW50Qnl0ZXN9IEJgO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIGEgc3VicGF0aCBvZiB0aGVcbiAqIHBhcnRpY3VsYXIgcm9vdCBmb2xkZXIuIEJvdGggcGF0aHMgY2FuIGluY2x1ZGUgLi4gYW5kIC4gc3BlY2lmaWVyc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcmlnaW5hbFBhdGggVGhlIGFic29sdXRlIGZpbGUvZm9sZGVyIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSByb290IFRoZSBhYnNvbHV0ZSByb290IGZvbGRlciBwYXRoXG4gKiBAcGFyYW0gez9ib29sZWFufSBmb3JjZVBvc2l4IFNldCBpdCB0byB0cnVlIGlmIHBhdGhzIG11c3QgYmUgaW50ZXJwcmV0ZWQgaW4gUE9TSVggZm9ybWF0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZ2l2ZW4gb3JpZ2luYWwgcGF0aCBpcyB0aGUgc3VicGF0aCBvZiB0aGUgcm9vdCBmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBhbnkgb2YgdGhlIGdpdmVuIHBhdGhzIGlzIG5vdCBhYnNvbHV0ZVxuICovXG5mdW5jdGlvbiBpc1N1YlBhdGggKG9yaWdpbmFsUGF0aCwgcm9vdCwgZm9yY2VQb3NpeCA9IG51bGwpIHtcbiAgY29uc3QgcGF0aE9iaiA9IGZvcmNlUG9zaXggPyBwYXRoLnBvc2l4IDogcGF0aDtcbiAgZm9yIChjb25zdCBwIG9mIFtvcmlnaW5hbFBhdGgsIHJvb3RdKSB7XG4gICAgaWYgKCFwYXRoT2JqLmlzQWJzb2x1dGUocCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7cH0nIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFic29sdXRlIHBhdGhgKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZFJvb3QgPSBwYXRoT2JqLm5vcm1hbGl6ZShyb290KTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoT2JqLm5vcm1hbGl6ZShvcmlnaW5hbFBhdGgpO1xuICByZXR1cm4gbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkUm9vdCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGhzIGFyZSBwb2ludGluZyB0byB0aGUgc2FtZSBmaWxlIHN5c3RlbVxuICogZGVzdGluYXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGgxIC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byBhIGZpbGUvZm9sZGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aDIgLSBBYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRoIHRvIGEgZmlsZS9mb2xkZXJcbiAqIEBwYXJhbSB7Li4uc3RyaW5nfSBwYXRoTiAtIFplcm8gb3IgbW9yZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRocyB0byBmaWxlcy9mb2xkZXJzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gdHJ1ZSBpZiBhbGwgcGF0aHMgYXJlIHBvaW50aW5nIHRvIHRoZSBzYW1lIGZpbGUgc3lzdGVtIGl0ZW1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNTYW1lRGVzdGluYXRpb24gKHBhdGgxLCBwYXRoMiwgLi4ucGF0aE4pIHtcbiAgY29uc3QgYWxsUGF0aHMgPSBbcGF0aDEsIHBhdGgyLCAuLi5wYXRoTl07XG4gIGlmICghYXdhaXQgQi5yZWR1Y2UoYWxsUGF0aHMsIGFzeW5jIChhLCBiKSA9PiBhICYmIGF3YWl0IGZzLmV4aXN0cyhiKSwgdHJ1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBhcmVBbGxJdGVtc0VxdWFsID0gKGFycikgPT4gISFhcnIucmVkdWNlKChhLCBiKSA9PiBhID09PSBiID8gYSA6IE5hTik7XG4gIGlmIChhcmVBbGxJdGVtc0VxdWFsKGFsbFBhdGhzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gTm9kZSAxMC41LjAgaW50cm9kdWNlZCBiaWdpbnQgc3VwcG9ydCBpbiBzdGF0LCB3aGljaCBhbGxvd3MgZm9yIG1vcmUgcHJlY2lzaW9uXG4gIC8vIGhvd2V2ZXIgYmVsb3cgdGhhdCB0aGUgb3B0aW9ucyBnZXQgaW50ZXJwcmV0ZWQgYXMgdGhlIGNhbGxiYWNrXG4gIC8vIFRPRE86IHJlbW92ZSB3aGVuIE5vZGUgMTAgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuICBsZXQgbWFwQ2IgPSBhc3luYyAoeCkgPT4gYXdhaXQgZnMuc3RhdCh4LCB7XG4gICAgYmlnaW50OiB0cnVlLFxuICB9KS5pbm87XG4gIGlmIChzZW12ZXIubHQocHJvY2Vzcy52ZXJzaW9uLCAnMTAuNS4wJykpIHtcbiAgICBtYXBDYiA9IGFzeW5jICh4KSA9PiBhd2FpdCBmcy5zdGF0KHgpLmlubztcbiAgfVxuICByZXR1cm4gYXJlQWxsSXRlbXNFcXVhbChhd2FpdCBCLm1hcChhbGxQYXRocywgbWFwQ2IpKTtcbn1cblxuLyoqXG4gKiBDb2VyY2VzIHRoZSBnaXZlbiBudW1iZXIvc3RyaW5nIHRvIGEgdmFsaWQgdmVyc2lvbiBzdHJpbmdcbiAqXG4gKiBAdGVtcGxhdGUge2Jvb2xlYW59IFtTdHJpY3Q9dHJ1ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXIgLSBWZXJzaW9uIHN0cmluZyB0byBjb2VyY2VcbiAqIEBwYXJhbSB7U3RyaWN0fSBbc3RyaWN0XSAtIElmIGB0cnVlYCB0aGVuIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93blxuICogaWYgYHZlcmAgY2Fubm90IGJlIGNvZXJjZWRcbiAqIEByZXR1cm5zIHtTdHJpY3QgZXh0ZW5kcyB0cnVlID8gc3RyaW5nIDogc3RyaW5nfG51bGx9IENvZXJjZWQgdmVyc2lvbiBudW1iZXIgb3IgbnVsbCBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZVxuICogY29lcmNlZCBhbmQgc3RyaWN0IG1vZGUgaXMgZGlzYWJsZWRcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBzdHJpY3QgbW9kZSBpcyBlbmFibGVkIGFuZCBgdmVyYCBjYW5ub3QgYmUgY29lcmNlZFxuICovXG5mdW5jdGlvbiBjb2VyY2VWZXJzaW9uICh2ZXIsIHN0cmljdCA9IC8qKiBAdHlwZSB7U3RyaWN0fSAqLyh0cnVlKSkge1xuICBjb25zdCByZXN1bHQgPSBzZW12ZXIudmFsaWQoc2VtdmVyLmNvZXJjZShgJHt2ZXJ9YCkpO1xuICBpZiAoc3RyaWN0ICYmICFyZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3Zlcn0nIGNhbm5vdCBiZSBjb2VyY2VkIHRvIGEgdmFsaWQgdmVyc2lvbiBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gLyoqIEB0eXBlIHtTdHJpY3QgZXh0ZW5kcyB0cnVlID8gc3RyaW5nIDogc3RyaW5nfG51bGx9ICovKHJlc3VsdCk7XG59XG5cbmNvbnN0IFNVUFBPUlRFRF9PUEVSQVRPUlMgPSBbJz09JywgJyE9JywgJz4nLCAnPCcsICc+PScsICc8PScsICc9J107XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIHZlcnNpb24gc3RyaW5nc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXIxIC0gVGhlIGZpcnN0IHZlcnNpb24gbnVtYmVyIHRvIGNvbXBhcmUuIFNob3VsZCBiZSBhIHZhbGlkXG4gKiB2ZXJzaW9uIG51bWJlciBzdXBwb3J0ZWQgYnkgc2VtdmVyIHBhcnNlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2ZXIyIC0gVGhlIHNlY29uZCB2ZXJzaW9uIG51bWJlciB0byBjb21wYXJlLiBTaG91bGQgYmUgYSB2YWxpZFxuICogdmVyc2lvbiBudW1iZXIgc3VwcG9ydGVkIGJ5IHNlbXZlciBwYXJzZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0b3IgLSBPbmUgb2Ygc3VwcG9ydGVkIHZlcnNpb24gbnVtYmVyIG9wZXJhdG9yczpcbiAqID09LCAhPSwgPiwgPCwgPD0sID49LCA9XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBvciBmYWxzZSBkZXBlbmRpbmcgb24gdGhlIGFjdHVhbCBjb21wYXJpc29uIHJlc3VsdFxuICogQHRocm93cyB7RXJyb3J9IGlmIGFuIHVuc3VwcG9ydGVkIG9wZXJhdG9yIGlzIHN1cHBsaWVkIG9yIGFueSBvZiB0aGUgc3VwcGxpZWRcbiAqIHZlcnNpb24gc3RyaW5ncyBjYW5ub3QgYmUgY29lcmNlZFxuICovXG5mdW5jdGlvbiBjb21wYXJlVmVyc2lvbnMgKHZlcjEsIG9wZXJhdG9yLCB2ZXIyKSB7XG4gIGlmICghU1VQUE9SVEVEX09QRVJBVE9SUy5pbmNsdWRlcyhvcGVyYXRvcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAnJHtvcGVyYXRvcn0nIGNvbXBhcmlzb24gb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZC4gYCArXG4gICAgICBgT25seSAnJHtKU09OLnN0cmluZ2lmeShTVVBQT1JURURfT1BFUkFUT1JTKX0nIG9wZXJhdG9ycyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cblxuICBjb25zdCBzZW12ZXJPcGVyYXRvciA9IFsnPT0nLCAnIT0nXS5pbmNsdWRlcyhvcGVyYXRvcikgPyAnPScgOiBvcGVyYXRvcjtcbiAgY29uc3QgcmVzdWx0ID0gc2VtdmVyLnNhdGlzZmllcyhjb2VyY2VWZXJzaW9uKHZlcjEpLCBgJHtzZW12ZXJPcGVyYXRvcn0ke2NvZXJjZVZlcnNpb24odmVyMil9YCk7XG4gIHJldHVybiBvcGVyYXRvciA9PT0gJyE9JyA/ICFyZXN1bHQgOiByZXN1bHQ7XG59XG5cbi8qKlxuICogQWRkIGFwcHJvcHJpYXRlIHF1b3RlcyB0byBjb21tYW5kIGFyZ3VtZW50cy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zdWJzdGFjay9ub2RlLXNoZWxsLXF1b3RlXG4gKiBmb3IgbW9yZSBkZXRhaWxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXJzZWRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGFyZ3VtZW50cywgcXVvdGVkXG4gKi9cbmZ1bmN0aW9uIHF1b3RlIChhcmdzKSB7XG4gIHJldHVybiBzaGVsbFF1b3RlKGFyZ3MpO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbmVjZXNzYXJ5IHRvIHdvcmthcm91bmQgdW5leHBlY3RlZCBtZW1vcnkgbGVha3NcbiAqIGNhdXNlZCBieSBOb2RlSlMgc3RyaW5nIGludGVybmluZ1xuICogYmVoYXZpb3IgZGVzY3JpYmVkIGluIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTI4NjlcbiAqXG4gKiBAcGFyYW0geyp9IHMgLSBUaGUgc3RyaW5nIHRvIHVubGVha1xuICogQHJldHVybiB7c3RyaW5nfSBFaXRoZXIgdGhlIHVubGVha2VkIHN0cmluZyBvciB0aGUgb3JpZ2luYWwgb2JqZWN0IGNvbnZlcnRlZCB0byBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gdW5sZWFrU3RyaW5nIChzKSB7XG4gIHJldHVybiBgICR7c31gLnN1YnN0cigxKTtcbn1cblxuXG4vKipcbiAqIEB0eXBlZGVmIFBsdXJhbGl6ZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2luY2x1c2l2ZT1mYWxzZV0gLSBXaGV0aGVyIHRvIHByZWZpeCB3aXRoIHRoZSBudW1iZXIgKGUuZy4sIDMgZHVja3MpXG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIGZvcm0gb2YgYSB3b3JkIGFwcHJvcHJpYXRlIHRvIHRoZSBjb3VudFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkIC0gVGhlIHdvcmQgdG8gcGx1cmFsaXplXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBIb3cgbWFueSBvZiB0aGUgd29yZCBleGlzdFxuICogQHBhcmFtIHtQbHVyYWxpemVPcHRpb25zfGJvb2xlYW59IG9wdGlvbnMgLSBvcHRpb25zIGZvciB3b3JkIHBsdXJhbGl6YXRpb24sXG4gKiAgIG9yIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoZSBvcHRpb25zLmluY2x1c2l2ZSBwcm9wZXJ0eVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHdvcmQgcGx1cmFsaXplZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlclxuICovXG5mdW5jdGlvbiBwbHVyYWxpemUgKHdvcmQsIGNvdW50LCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGluY2x1c2l2ZSA9IGZhbHNlO1xuICBpZiAoXy5pc0Jvb2xlYW4ob3B0aW9ucykpIHtcbiAgICAvLyBpZiBwYXNzZWQgaW4gYXMgYSBib29sZWFuXG4gICAgaW5jbHVzaXZlID0gb3B0aW9ucztcbiAgfSBlbHNlIGlmIChfLmlzQm9vbGVhbihvcHRpb25zPy5pbmNsdXNpdmUpKSB7XG4gICAgLy8gaWYgcGFzc2VkIGluIGFzIGFuIG9wdGlvbnMgaGFzaFxuICAgIGluY2x1c2l2ZSA9IG9wdGlvbnMuaW5jbHVzaXZlO1xuICB9XG4gIHJldHVybiBwbHVyYWxpemVMaWIod29yZCwgY291bnQsIGluY2x1c2l2ZSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgRW5jb2RpbmdPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heFNpemU9MTA3Mzc0MTgyNF0gVGhlIG1heGltdW0gc2l6ZSBvZlxuICogdGhlIHJlc3VsdGluZyBidWZmZXIgaW4gYnl0ZXMuIFRoaXMgaXMgc2V0IHRvIDFHQiBieSBkZWZhdWx0LCBiZWNhdXNlXG4gKiBBcHBpdW0gbGltaXRzIHRoZSBtYXhpbXVtIEhUVFAgYm9keSBzaXplIHRvIDFHQi4gQWxzbywgdGhlIE5vZGVKUyBoZWFwXG4gKiBzaXplIG11c3QgYmUgZW5vdWdoIHRvIGtlZXAgdGhlIHJlc3VsdGluZyBvYmplY3QgKHVzdWFsbHkgdGhpcyBzaXplIGlzXG4gKiBsaW1pdGVkIHRvIDEuNCBHQilcbiAqL1xuXG4vKipcbiAqIENvbnZlcnRzIGNvbnRlbnRzIG9mIGEgbG9jYWwgZmlsZSB0byBhbiBpbi1tZW1vcnkgYmFzZS02NCBlbmNvZGVkIGJ1ZmZlci5cbiAqIFRoZSBvcGVyYXRpb24gaXMgbWVtb3J5LXVzYWdlIGZyaWVuZGx5IGFuZCBzaG91bGQgYmUgdXNlZCB3aGlsZSBlbmNvZGluZ1xuICogbGFyZ2UgZmlsZXMgdG8gYmFzZTY0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNyY1BhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZSBiZWluZyBlbmNvZGVkXG4gKiBAcGFyYW0ge0VuY29kaW5nT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge1Byb21pc2U8QnVmZmVyPn0gYmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgYXMgbWVtb3J5IGJ1ZmZlclxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZWFkaW5nIHRoZSBzb3VyY2UgZmlsZVxuICogb3IgdGhlIHNvdXJjZSBmaWxlIGlzIHRvb1xuICovXG5hc3luYyBmdW5jdGlvbiB0b0luTWVtb3J5QmFzZTY0IChzcmNQYXRoLCBvcHRzID0ge30pIHtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHNyY1BhdGgpKSB8fCAoYXdhaXQgZnMuc3RhdChzcmNQYXRoKSkuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBmaWxlOiAke3NyY1BhdGh9YCk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgbWF4U2l6ZSA9IDEgKiBHaUIsXG4gIH0gPSBvcHRzO1xuICBjb25zdCByZXN1bHRCdWZmZXJzID0gW107XG4gIGxldCByZXN1bHRCdWZmZXJzU2l6ZSA9IDA7XG4gIGNvbnN0IHJlc3VsdFdyaXRlU3RyZWFtID0gbmV3IHN0cmVhbS5Xcml0YWJsZSh7XG4gICAgd3JpdGU6IChidWZmZXIsIGVuY29kaW5nLCBuZXh0KSA9PiB7XG4gICAgICByZXN1bHRCdWZmZXJzLnB1c2goYnVmZmVyKTtcbiAgICAgIHJlc3VsdEJ1ZmZlcnNTaXplICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICBpZiAobWF4U2l6ZSA+IDAgJiYgcmVzdWx0QnVmZmVyc1NpemUgPiBtYXhTaXplKSB7XG4gICAgICAgIHJlc3VsdFdyaXRlU3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKGBUaGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIGAgK1xuICAgICAgICAgIGBidWZmZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuICR7dG9SZWFkYWJsZVNpemVTdHJpbmcobWF4U2l6ZSl9YCkpO1xuICAgICAgfVxuICAgICAgbmV4dCgpO1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IHJlYWRlclN0cmVhbSA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0oc3JjUGF0aCk7XG4gIGNvbnN0IGJhc2U2NEVuY29kZXJTdHJlYW0gPSBuZXcgQmFzZTY0RW5jb2RlKCk7XG4gIGNvbnN0IHJlc3VsdFdyaXRlU3RyZWFtUHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXN1bHRXcml0ZVN0cmVhbS5vbmNlKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICByZWFkZXJTdHJlYW0udW5waXBlKGJhc2U2NEVuY29kZXJTdHJlYW0pO1xuICAgICAgYmFzZTY0RW5jb2RlclN0cmVhbS51bnBpcGUocmVzdWx0V3JpdGVTdHJlYW0pO1xuICAgICAgcmVhZGVyU3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgIHJlamVjdChlKTtcbiAgICB9KTtcbiAgICByZXN1bHRXcml0ZVN0cmVhbS5vbmNlKCdmaW5pc2gnLCByZXNvbHZlKTtcbiAgfSk7XG4gIGNvbnN0IHJlYWRTdHJlYW1Qcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlYWRlclN0cmVhbS5vbmNlKCdjbG9zZScsIHJlc29sdmUpO1xuICAgIHJlYWRlclN0cmVhbS5vbmNlKCdlcnJvcicsIChlKSA9PiByZWplY3QoXG4gICAgICBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWFkICcke3NyY1BhdGh9JzogJHtlLm1lc3NhZ2V9YCkpKTtcbiAgfSk7XG4gIHJlYWRlclN0cmVhbS5waXBlKGJhc2U2NEVuY29kZXJTdHJlYW0pO1xuICBiYXNlNjRFbmNvZGVyU3RyZWFtLnBpcGUocmVzdWx0V3JpdGVTdHJlYW0pO1xuXG4gIGF3YWl0IEIuYWxsKFtyZWFkU3RyZWFtUHJvbWlzZSwgcmVzdWx0V3JpdGVTdHJlYW1Qcm9taXNlXSk7XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KHJlc3VsdEJ1ZmZlcnMpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIExvY2tGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0PTEyMF0gVGhlIG1heCB0aW1lIGluIHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIGxvY2tcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyeVJlY292ZXJ5PWZhbHNlXSBXaGV0aGVyIHRvIHRyeSBsb2NrIHJlY292ZXJ5IGlmXG4gKiB0aGUgZmlyc3QgYXR0ZW1wdCB0byBhY3F1aXJlIGl0IHRpbWVkIG91dC5cbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBhbiBhc3luYyBmdW5jdGlvbiB3aGljaCwgd2hlbiBjYWxsZWQsIHdpbGwgbm90IHByb2NlZWQgdW50aWwgYSBjZXJ0YWluIGZpbGUgaXMgbm9cbiAqIGxvbmdlciBwcmVzZW50IG9uIHRoZSBzeXN0ZW0uIFRoaXMgYWxsb3dzIGZvciBwcmV2ZW50aW5nIGNvbmN1cnJlbnQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3Nlc1xuICogdXNpbmcgYSBrbm93biBsb2NrZmlsZSBwYXRoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NrRmlsZSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIHVzZWQgZm9yIHRoZSBsb2NrXG4gKiBAcGFyYW0ge0xvY2tGaWxlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMgeyhiZWhhdmlvcjogKCkgPT4gUHJvbWlzZTx2b2lkPikgPT4gUHJvbWlzZTx2b2lkPn0gYXN5bmMgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbm90aGVyIGFzeW5jIGZ1bmN0aW9uIGRlZmluaW5nIHRoZSBsb2NrZWRcbiAqIGJlaGF2aW9yXG4gKi9cbmZ1bmN0aW9uIGdldExvY2tGaWxlR3VhcmQgKGxvY2tGaWxlLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRpbWVvdXQgPSAxMjAsXG4gICAgdHJ5UmVjb3ZlcnkgPSBmYWxzZSxcbiAgfSA9IG9wdHM7XG5cbiAgY29uc3QgbG9jayA9IC8qKiBAdHlwZSB7KGxvY2tmaWxlOiBzdHJpbmcsIG9wdHM6IGltcG9ydCgnbG9ja2ZpbGUnKS5PcHRpb25zKT0+Qjx2b2lkPn0gKi8oQi5wcm9taXNpZnkoX2xvY2tmaWxlLmxvY2spKTtcbiAgY29uc3QgY2hlY2sgPSBCLnByb21pc2lmeShfbG9ja2ZpbGUuY2hlY2spO1xuICBjb25zdCB1bmxvY2sgPSBCLnByb21pc2lmeShfbG9ja2ZpbGUudW5sb2NrKTtcblxuICBjb25zdCBndWFyZCA9IGFzeW5jIChiZWhhdmlvcikgPT4ge1xuICAgIGxldCB0cmllZFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgZG8ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gaWYgdGhlIGxvY2tmaWxlIGRvZXNuJ3QgZXhpc3QsIGxvY2sgaXQgc3luY2hyb25vdXNseSB0byBtYWtlIHN1cmUgbm8gb3RoZXIgY2FsbFxuICAgICAgICAvLyBvbiB0aGUgc2FtZSBzcGluIG9mIHRoZSBldmVudCBsb29wIGNhbiBhbHNvIGluaXRpYXRlIGEgbG9jay4gSWYgdGhlIGxvY2tmaWxlIGRvZXMgZXhpc3RcbiAgICAgICAgLy8gdGhlbiBqdXN0IHVzZSB0aGUgcmVndWxhciBhc3luYyAnbG9jaycgbWV0aG9kIHdoaWNoIHdpbGwgd2FpdCBvbiB0aGUgbG9jay5cbiAgICAgICAgaWYgKF9sb2NrZmlsZS5jaGVja1N5bmMobG9ja0ZpbGUpKSB7XG4gICAgICAgICAgYXdhaXQgbG9jayhsb2NrRmlsZSwge3dhaXQ6IHRpbWVvdXQgKiAxMDAwfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX2xvY2tmaWxlLmxvY2tTeW5jKGxvY2tGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKF8uaW5jbHVkZXMoZS5tZXNzYWdlLCAnRUVYSVNUJykgJiYgdHJ5UmVjb3ZlcnkgJiYgIXRyaWVkUmVjb3ZlcnkpIHtcbiAgICAgICAgICAvLyBUaGVyZSBjb3VsZCBiZSBjYXNlcyB3aGVyZSBhIHByb2Nlc3MgaGFzIGJlZW4gZm9yY2VmdWxseSB0ZXJtaW5hdGVkXG4gICAgICAgICAgLy8gd2l0aG91dCBhIGNoYW5jZSB0byBjbGVhbiB1cCBwZW5kaW5nIGxvY2tzOiBodHRwczovL2dpdGh1Yi5jb20vbnBtL2xvY2tmaWxlL2lzc3Vlcy8yNlxuICAgICAgICAgIF9sb2NrZmlsZS51bmxvY2tTeW5jKGxvY2tGaWxlKTtcbiAgICAgICAgICB0cmllZFJlY292ZXJ5ID0gdHJ1ZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBhY3F1aXJlIGxvY2sgb24gJyR7bG9ja0ZpbGV9JyBhZnRlciAke3RpbWVvdXR9cy4gYCArXG4gICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgfSB3aGlsZSAodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBiZWhhdmlvcigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyB3aGV0aGVyIHRoZSBiZWhhdmlvciBzdWNjZWVkZWQgb3Igbm90LCBnZXQgcmlkIG9mIHRoZSBsb2NrXG4gICAgICBhd2FpdCB1bmxvY2sobG9ja0ZpbGUpO1xuICAgIH1cbiAgfTtcblxuICBndWFyZC5jaGVjayA9IGFzeW5jICgpID0+IGF3YWl0IGNoZWNrKGxvY2tGaWxlKTtcblxuICByZXR1cm4gZ3VhcmQ7XG59XG5cbmV4cG9ydCB7XG4gIGhhc1ZhbHVlLCBlc2NhcGVTcGFjZSwgZXNjYXBlU3BlY2lhbENoYXJzLCBsb2NhbElwLCBjYW5jZWxsYWJsZURlbGF5LFxuICBtdWx0aVJlc29sdmUsIHNhZmVKc29uUGFyc2UsIHdyYXBFbGVtZW50LCB1bndyYXBFbGVtZW50LCBmaWx0ZXJPYmplY3QsXG4gIHRvUmVhZGFibGVTaXplU3RyaW5nLCBpc1N1YlBhdGgsIFczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSLFxuICBpc1NhbWVEZXN0aW5hdGlvbiwgY29tcGFyZVZlcnNpb25zLCBjb2VyY2VWZXJzaW9uLCBxdW90ZSwgdW5sZWFrU3RyaW5nLFxuICBqc29uU3RyaW5naWZ5LCBwbHVyYWxpemUsIEdpQiwgTWlCLCBLaUIsIHRvSW5NZW1vcnlCYXNlNjQsXG4gIHV1aWRWMSwgdXVpZFYzLCB1dWlkVjQsIHV1aWRWNSwgc2hlbGxQYXJzZSwgZ2V0TG9ja0ZpbGVHdWFyZFxufTtcbiJdfQ==
|
|
421
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlsLmpzIl0sIm5hbWVzIjpbIlczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSIiwiS2lCIiwiTWlCIiwiR2lCIiwiaGFzQ29udGVudCIsInZhbCIsIl8iLCJpc1N0cmluZyIsImhhc1ZhbHVlIiwiaGFzVmFsIiwiaXNOdW1iZXIiLCJpc05hTiIsImlzVW5kZWZpbmVkIiwiaXNOdWxsIiwiZXNjYXBlU3BhY2UiLCJzdHIiLCJzcGxpdCIsImpvaW4iLCJlc2NhcGVTcGVjaWFsQ2hhcnMiLCJxdW90ZUVzY2FwZSIsInJlcGxhY2UiLCJyZSIsIlJlZ0V4cCIsImxvY2FsSXAiLCJpcCIsImNoYWluIiwib3MiLCJuZXR3b3JrSW50ZXJmYWNlcyIsInZhbHVlcyIsImZsYXR0ZW4iLCJmaWx0ZXIiLCJmYW1pbHkiLCJpbnRlcm5hbCIsIm1hcCIsImZpcnN0IiwidmFsdWUiLCJjYW5jZWxsYWJsZURlbGF5IiwibXMiLCJ0aW1lciIsInJlc29sdmUiLCJyZWplY3QiLCJkZWxheSIsIkIiLCJQcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0Iiwic2V0VGltZW91dCIsImNhbmNlbCIsImNsZWFyVGltZW91dCIsIkNhbmNlbGxhdGlvbkVycm9yIiwibXVsdGlSZXNvbHZlIiwicm9vdHMiLCJhcmdzIiwicm9vdCIsInBhdGgiLCJzYWZlSnNvblBhcnNlIiwib2JqIiwiSlNPTiIsInBhcnNlIiwiaWduIiwianNvblN0cmluZ2lmeSIsInJlcGxhY2VyIiwic3BhY2UiLCJpc0Z1bmN0aW9uIiwiayIsInYiLCJidWZmZXJUb0pTT04iLCJCdWZmZXIiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJzdHJpbmdpZnkiLCJrZXkiLCJ1cGRhdGVkVmFsdWUiLCJpc0J1ZmZlciIsInRvU3RyaW5nIiwidW53cmFwRWxlbWVudCIsImVsIiwicHJvcE5hbWUiLCJoYXMiLCJ3cmFwRWxlbWVudCIsImVsZW1lbnRJZCIsIkVMRU1FTlQiLCJmaWx0ZXJPYmplY3QiLCJwcmVkaWNhdGUiLCJuZXdPYmoiLCJjbG9uZSIsInZhbHVlUHJlZGljYXRlIiwiT2JqZWN0Iiwia2V5cyIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwiYnl0ZXMiLCJpbnRCeXRlcyIsInBhcnNlSW50IiwiU3RyaW5nIiwiRXJyb3IiLCJ0b0ZpeGVkIiwiaXNTdWJQYXRoIiwib3JpZ2luYWxQYXRoIiwiZm9yY2VQb3NpeCIsInBhdGhPYmoiLCJwb3NpeCIsInAiLCJpc0Fic29sdXRlIiwibm9ybWFsaXplZFJvb3QiLCJub3JtYWxpemUiLCJub3JtYWxpemVkUGF0aCIsInN0YXJ0c1dpdGgiLCJpc1NhbWVEZXN0aW5hdGlvbiIsInBhdGgxIiwicGF0aDIiLCJwYXRoTiIsImFsbFBhdGhzIiwicmVkdWNlIiwiYSIsImIiLCJmcyIsImV4aXN0cyIsImFyZUFsbEl0ZW1zRXF1YWwiLCJhcnIiLCJOYU4iLCJtYXBDYiIsIngiLCJzdGF0IiwiYmlnaW50IiwiaW5vIiwiY29lcmNlVmVyc2lvbiIsInZlciIsInN0cmljdCIsInJlc3VsdCIsInNlbXZlciIsInZhbGlkIiwiY29lcmNlIiwiU1VQUE9SVEVEX09QRVJBVE9SUyIsImNvbXBhcmVWZXJzaW9ucyIsInZlcjEiLCJvcGVyYXRvciIsInZlcjIiLCJpbmNsdWRlcyIsInNlbXZlck9wZXJhdG9yIiwic2F0aXNmaWVzIiwicXVvdGUiLCJjYXN0QXJyYXkiLCJ1bmxlYWtTdHJpbmciLCJzIiwic3Vic3RyIiwicGx1cmFsaXplIiwid29yZCIsImNvdW50Iiwib3B0aW9ucyIsImluY2x1c2l2ZSIsImlzQm9vbGVhbiIsInRvSW5NZW1vcnlCYXNlNjQiLCJzcmNQYXRoIiwib3B0cyIsImlzRGlyZWN0b3J5IiwibWF4U2l6ZSIsInJlc3VsdEJ1ZmZlcnMiLCJyZXN1bHRCdWZmZXJzU2l6ZSIsInJlc3VsdFdyaXRlU3RyZWFtIiwic3RyZWFtIiwiV3JpdGFibGUiLCJ3cml0ZSIsImJ1ZmZlciIsImVuY29kaW5nIiwibmV4dCIsInB1c2giLCJsZW5ndGgiLCJlbWl0IiwicmVhZGVyU3RyZWFtIiwiY3JlYXRlUmVhZFN0cmVhbSIsImJhc2U2NEVuY29kZXJTdHJlYW0iLCJCYXNlNjRFbmNvZGUiLCJyZXN1bHRXcml0ZVN0cmVhbVByb21pc2UiLCJvbmNlIiwiZSIsInVucGlwZSIsImRlc3Ryb3kiLCJyZWFkU3RyZWFtUHJvbWlzZSIsIm1lc3NhZ2UiLCJwaXBlIiwiYWxsIiwiY29uY2F0IiwiZ2V0TG9ja0ZpbGVHdWFyZCIsImxvY2tGaWxlIiwidGltZW91dCIsInRyeVJlY292ZXJ5IiwibG9jayIsInByb21pc2lmeSIsIl9sb2NrZmlsZSIsImNoZWNrIiwidW5sb2NrIiwiZ3VhcmQiLCJiZWhhdmlvciIsInRyaWVkUmVjb3ZlcnkiLCJjaGVja1N5bmMiLCJ3YWl0IiwibG9ja1N5bmMiLCJ1bmxvY2tTeW5jIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFHQSxNQUFNQSwwQkFBMEIsR0FBRyxxQ0FBbkM7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHLElBQVo7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHRCxHQUFHLEdBQUcsSUFBbEI7O0FBQ0EsTUFBTUUsR0FBRyxHQUFHRCxHQUFHLEdBQUcsSUFBbEI7OztBQUVPLFNBQVNFLFVBQVQsQ0FBcUJDLEdBQXJCLEVBQTBCO0FBQy9CLFNBQU9DLGdCQUFFQyxRQUFGLENBQVdGLEdBQVgsS0FBbUJBLEdBQUcsS0FBSyxFQUFsQztBQUNEOztBQUdELFNBQVNHLFFBQVQsQ0FBbUJILEdBQW5CLEVBQXdCO0FBQ3RCLE1BQUlJLE1BQU0sR0FBRyxLQUFiOztBQUVBLE1BQUlILGdCQUFFSSxRQUFGLENBQVdMLEdBQVgsQ0FBSixFQUFxQjtBQUNuQkksSUFBQUEsTUFBTSxHQUFHLENBQUNILGdCQUFFSyxLQUFGLENBQVFOLEdBQVIsQ0FB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LEtBQXBCOztBQUNBLE9BQUc7QUFDRCxVQUFJO0FBSUYsWUFBSUwsbUJBQVVNLFNBQVYsQ0FBb0JYLFFBQXBCLENBQUosRUFBbUM7QUFDakMsZ0JBQU1HLElBQUksQ0FBQ0gsUUFBRCxFQUFXO0FBQUNZLFlBQUFBLElBQUksRUFBRVgsT0FBTyxHQUFHO0FBQWpCLFdBQVgsQ0FBVjtBQUNELFNBRkQsTUFFTztBQUNMSSw2QkFBVVEsUUFBVixDQUFtQmIsUUFBbkI7QUFDRDs7QUFDRDtBQUNELE9BVkQsQ0FVRSxPQUFPVCxDQUFQLEVBQVU7QUFDVixZQUFJeEssZ0JBQUVtSSxRQUFGLENBQVdxQyxDQUFDLENBQUNJLE9BQWIsRUFBc0IsUUFBdEIsS0FBbUNPLFdBQW5DLElBQWtELENBQUNRLGFBQXZELEVBQXNFO0FBR3BFTCw2QkFBVVMsVUFBVixDQUFxQmQsUUFBckI7O0FBQ0FVLFVBQUFBLGFBQWEsR0FBRyxJQUFoQjtBQUNBO0FBQ0Q7O0FBQ0QsY0FBTSxJQUFJbkcsS0FBSixDQUFXLDhCQUE2QnlGLFFBQVMsV0FBVUMsT0FBUSxLQUF6RCxHQUNiLG1CQUFrQlYsQ0FBQyxDQUFDSSxPQUFRLEVBRHpCLENBQU47QUFFRDtBQUVGLEtBdkJELFFBdUJTLElBdkJUOztBQXdCQSxRQUFJO0FBQ0YsYUFBTyxNQUFNYyxRQUFRLEVBQXJCO0FBQ0QsS0FGRCxTQUVVO0FBRVIsWUFBTUYsTUFBTSxDQUFDUCxRQUFELENBQVo7QUFDRDtBQUNGLEdBaENEOztBQWtDQVEsRUFBQUEsS0FBSyxDQUFDRixLQUFOLEdBQWMsWUFBWSxNQUFNQSxLQUFLLENBQUNOLFFBQUQsQ0FBckM7O0FBRUEsU0FBT1EsS0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnLi9mcyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQge1xuICAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9zaGVsbC1xdW90ZVxuICBxdW90ZSBhcyBzaGVsbFF1b3RlLFxuICBwYXJzZSBhcyBzaGVsbFBhcnNlLFxufSBmcm9tICdzaGVsbC1xdW90ZSc7XG5pbXBvcnQgcGx1cmFsaXplTGliIGZyb20gJ3BsdXJhbGl6ZSc7XG5pbXBvcnQgc3RyZWFtIGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBCYXNlNjRFbmNvZGUgfSBmcm9tICdiYXNlNjQtc3RyZWFtJztcbmltcG9ydCB7XG4gIC8vIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3V1aWRcbiAgdjEgYXMgdXVpZFYxLCB2MyBhcyB1dWlkVjMsXG4gIHY0IGFzIHV1aWRWNCwgdjUgYXMgdXVpZFY1XG59IGZyb20gJ3V1aWQnO1xuaW1wb3J0IF9sb2NrZmlsZSBmcm9tICdsb2NrZmlsZSc7XG5cblxuY29uc3QgVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVIgPSAnZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2YnO1xuY29uc3QgS2lCID0gMTAyNDtcbmNvbnN0IE1pQiA9IEtpQiAqIDEwMjQ7XG5jb25zdCBHaUIgPSBNaUIgKiAxMDI0O1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzQ29udGVudCAodmFsKSB7XG4gIHJldHVybiBfLmlzU3RyaW5nKHZhbCkgJiYgdmFsICE9PSAnJztcbn1cblxuLy8gcmV0dXJuIHRydWUgaWYgdGhlIHRoZSB2YWx1ZSBpcyBub3QgdW5kZWZpbmVkLCBudWxsLCBvciBOYU4uXG5mdW5jdGlvbiBoYXNWYWx1ZSAodmFsKSB7XG4gIGxldCBoYXNWYWwgPSBmYWxzZTtcbiAgLy8gYXZvaWQgaW5jb3JyZWN0bHkgZXZhbHVhdGluZyBgMGAgYXMgZmFsc2VcbiAgaWYgKF8uaXNOdW1iZXIodmFsKSkge1xuICAgIGhhc1ZhbCA9ICFfLmlzTmFOKHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgaGFzVmFsID0gIV8uaXNVbmRlZmluZWQodmFsKSAmJiAhXy5pc051bGwodmFsKTtcbiAgfVxuXG4gIHJldHVybiBoYXNWYWw7XG59XG5cbi8vIGVzY2FwZSBzcGFjZXMgaW4gc3RyaW5nLCBmb3IgY29tbWFuZGxpbmUgY2FsbHNcbmZ1bmN0aW9uIGVzY2FwZVNwYWNlIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgvIC8pLmpvaW4oJ1xcXFwgJyk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVNwZWNpYWxDaGFycyAoc3RyLCBxdW90ZUVzY2FwZSkge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIGlmICh0eXBlb2YgcXVvdGVFc2NhcGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcXVvdGVFc2NhcGUgPSBmYWxzZTtcbiAgfVxuICBzdHIgPSBzdHJcbiAgICAucmVwbGFjZSgvW1xcXFxdL2csICdcXFxcXFxcXCcpXG4gICAgLnJlcGxhY2UoL1tcXC9dL2csICdcXFxcLycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgICAucmVwbGFjZSgvW1xcYl0vZywgJ1xcXFxiJylcbiAgICAucmVwbGFjZSgvW1xcZl0vZywgJ1xcXFxmJylcbiAgICAucmVwbGFjZSgvW1xcbl0vZywgJ1xcXFxuJylcbiAgICAucmVwbGFjZSgvW1xccl0vZywgJ1xcXFxyJylcbiAgICAucmVwbGFjZSgvW1xcdF0vZywgJ1xcXFx0JylcbiAgICAucmVwbGFjZSgvW1xcXCJdL2csICdcXFxcXCInKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgLnJlcGxhY2UoL1xcXFwnL2csIFwiXFxcXCdcIik7XG4gIGlmIChxdW90ZUVzY2FwZSkge1xuICAgIGxldCByZSA9IG5ldyBSZWdFeHAocXVvdGVFc2NhcGUsICdnJyk7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UocmUsIGBcXFxcJHtxdW90ZUVzY2FwZX1gKTtcbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBsb2NhbElwICgpIHtcbiAgbGV0IGlwID0gXy5jaGFpbihvcy5uZXR3b3JrSW50ZXJmYWNlcygpKVxuICAgIC52YWx1ZXMoKVxuICAgIC5mbGF0dGVuKClcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgLmZpbHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gKHZhbC5mYW1pbHkgPT09ICdJUHY0JyAmJiB2YWwuaW50ZXJuYWwgPT09IGZhbHNlKTtcbiAgICB9KVxuICAgIC5tYXAoJ2FkZHJlc3MnKVxuICAgIC5maXJzdCgpXG4gICAgLnZhbHVlKCk7XG4gIHJldHVybiBpcDtcbn1cblxuLypcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgaXMgY2FuY2VsbGFibGUsIGFuZCB3aWxsIHRpbWVvdXRcbiAqIGFmdGVyIGBtc2AgZGVsYXlcbiAqL1xuZnVuY3Rpb24gY2FuY2VsbGFibGVEZWxheSAobXMpIHtcbiAgbGV0IHRpbWVyO1xuICBsZXQgcmVzb2x2ZTtcbiAgbGV0IHJlamVjdDtcblxuICBjb25zdCBkZWxheSA9IG5ldyBCLlByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgcmVzb2x2ZSA9IF9yZXNvbHZlO1xuICAgIHJlamVjdCA9IF9yZWplY3Q7XG4gICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9LCBtcyk7XG4gIH0pO1xuXG4gIC8vIG92ZXJyaWRlIEJsdWViaXJkJ3MgYGNhbmNlbGAsIHdoaWNoIGRvZXMgbm90IHdvcmsgd2hlbiB1c2luZyBgYXdhaXRgIG9uXG4gIC8vIGEgcHJvbWlzZSwgc2luY2UgYHJlc29sdmVgL2ByZWplY3RgIGFyZSBuZXZlciBjYWxsZWRcbiAgZGVsYXkuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgcmVqZWN0KG5ldyBCLkNhbmNlbGxhdGlvbkVycm9yKCkpO1xuICB9O1xuICByZXR1cm4gZGVsYXk7XG59XG5cbmZ1bmN0aW9uIG11bHRpUmVzb2x2ZSAocm9vdHMsIC4uLmFyZ3MpIHtcbiAgcmV0dXJuIHJvb3RzLm1hcCgocm9vdCkgPT4gcGF0aC5yZXNvbHZlKHJvb3QsIC4uLmFyZ3MpKTtcbn1cblxuLypcbiAqIFBhcnNlcyBhbiBvYmplY3QgaWYgcG9zc2libGUuIE90aGVyd2lzZSByZXR1cm5zIHRoZSBvYmplY3Qgd2l0aG91dCBwYXJzaW5nLlxuICovXG5mdW5jdGlvbiBzYWZlSnNvblBhcnNlIChvYmopIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShvYmopO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICAvLyBpZ25vcmU6IHRoaXMgaXMgbm90IGpzb24gcGFyc2FibGVcbiAgICByZXR1cm4gb2JqO1xuICB9XG59XG5cbi8qXG4gKiBTdHJpbmdpZmllcyB0aGUgb2JqZWN0IHBhc3NlZCBpbiwgY29udmVydGluZyBCdWZmZXJzIGludG8gU3RyaW5ncyBmb3IgYmV0dGVyXG4gKiBkaXNwbGF5LiBUaGlzIG1pbWljcyBKU09OLnN0cmluZ2lmeSAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5KVxuICogZXhjZXB0IHRoZSBgcmVwbGFjZXJgIGFyZ3VtZW50IGNhbiBvbmx5IGJlIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtIHs/ZnVuY3Rpb259IHJlcGxhY2VyIC0gZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBwcm9wZXJ0aWVzIGFkZGVkIHRvIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCBvYmplY3RcbiAqIEBwYXJhbSB7P251bWJlcnxzdHJpbmd9IHNwYWNlIC0gdXNlZCB0byBpbnNlcnQgd2hpdGUgc3BhY2UgaW50byB0aGUgb3V0cHV0IEpTT05cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciByZWFkYWJpbGl0eSBwdXJwb3Nlcy4gRGVmYXVsdHMgdG8gMlxuICogcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBKU09OIG9iamVjdCBzZXJpYWxpemVkIGFzIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGpzb25TdHJpbmdpZnkgKG9iaiwgcmVwbGFjZXIsIHNwYWNlID0gMikge1xuICAvLyBpZiBubyByZXBsYWNlciBpcyBwYXNzZWQsIG9yIGl0IGlzIG5vdCBhIGZ1bmN0aW9uLCBqdXN0IHVzZSBhIHBhc3MtdGhyb3VnaFxuICBpZiAoIV8uaXNGdW5jdGlvbihyZXBsYWNlcikpIHtcbiAgICByZXBsYWNlciA9IChrLCB2KSA9PiB2O1xuICB9XG5cbiAgLy8gQnVmZmVycyBjYW5ub3QgYmUgc2VyaWFsaXplZCBpbiBhIHJlYWRhYmxlIHdheVxuICBjb25zdCBidWZmZXJUb0pTT04gPSBCdWZmZXIucHJvdG90eXBlLnRvSlNPTjtcbiAgZGVsZXRlIEJ1ZmZlci5wcm90b3R5cGUudG9KU09OO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkVmFsdWUgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpXG4gICAgICAgID8gdmFsdWUudG9TdHJpbmcoJ3V0ZjgnKVxuICAgICAgICA6IHZhbHVlO1xuICAgICAgcmV0dXJuIHJlcGxhY2VyKGtleSwgdXBkYXRlZFZhbHVlKTtcbiAgICB9LCBzcGFjZSk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gcmVzdG9yZSB0aGUgZnVuY3Rpb24sIHNvIGFzIHRvIG5vdCBicmVhayBmdXJ0aGVyIHNlcmlhbGl6YXRpb25cbiAgICBCdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGJ1ZmZlclRvSlNPTjtcbiAgfVxufVxuXG4vKlxuICogUmVtb3ZlcyB0aGUgd3JhcHBlciBmcm9tIGVsZW1lbnQsIGlmIGl0IGV4aXN0cy5cbiAqICAgeyBFTEVNRU5UOiA0IH0gYmVjb21lcyA0XG4gKiAgIHsgZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2Y6IDUgfSBiZWNvbWVzIDVcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudCAoZWwpIHtcbiAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVIsICdFTEVNRU5UJ10pIHtcbiAgICBpZiAoXy5oYXMoZWwsIHByb3BOYW1lKSkge1xuICAgICAgcmV0dXJuIGVsW3Byb3BOYW1lXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVsO1xufVxuXG5mdW5jdGlvbiB3cmFwRWxlbWVudCAoZWxlbWVudElkKSB7XG4gIHJldHVybiB7XG4gICAgRUxFTUVOVDogZWxlbWVudElkLFxuICAgIFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl06IGVsZW1lbnRJZCxcbiAgfTtcbn1cblxuLypcbiAqIFJldHVybnMgb2JqZWN0IGNvbnNpc3Rpbmcgb2YgYWxsIHByb3BlcnRpZXMgaW4gdGhlIG9yaWdpbmFsIGVsZW1lbnRcbiAqIHdoaWNoIHdlcmUgdHJ1dGh5IGdpdmVuIHRoZSBwcmVkaWNhdGUuXG4gKiBJZiB0aGUgcHJlZGljYXRlIGlzXG4gKiAgICogbWlzc2luZyAtIGl0IHdpbGwgcmVtb3ZlIGFsbCBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcyBhcmUgYHVuZGVmaW5lZGBcbiAqICAgKiBhIHNjYWxhciAtIGl0IHdpbGwgdGVzdCBhbGwgcHJvcGVydGllcycgdmFsdWVzIGFnYWluc3QgdGhhdCB2YWx1ZVxuICogICAqIGEgZnVuY3Rpb24gLSBpdCB3aWxsIHBhc3MgZWFjaCB2YWx1ZSBhbmQgdGhlIG9yaWdpbmFsIG9iamVjdCBpbnRvIHRoZSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBmaWx0ZXJPYmplY3QgKG9iaiwgcHJlZGljYXRlKSB7XG4gIGxldCBuZXdPYmogPSBfLmNsb25lKG9iaik7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByZWRpY2F0ZSkpIHtcbiAgICAvLyByZW1vdmUgYW55IGVsZW1lbnQgZnJvbSB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgIHByZWRpY2F0ZSA9ICh2KSA9PiAhXy5pc1VuZGVmaW5lZCh2KTtcbiAgfSBlbHNlIGlmICghXy5pc0Z1bmN0aW9uKHByZWRpY2F0ZSkpIHtcbiAgICAvLyBtYWtlIHByZWRpY2F0ZSBpbnRvIGEgZnVuY3Rpb25cbiAgICBjb25zdCB2YWx1ZVByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICBwcmVkaWNhdGUgPSAodikgPT4gdiA9PT0gdmFsdWVQcmVkaWNhdGU7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGlmICghcHJlZGljYXRlKG9ialtrZXldLCBvYmopKSB7XG4gICAgICBkZWxldGUgbmV3T2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdPYmo7XG59XG5cbi8qKlxuICogQ29udmVydHMgbnVtYmVyIG9mIGJ5dGVzIHRvIGEgcmVhZGFibGUgc2l6ZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBieXRlcyAtIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGFjdHVhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGZvciBleGFtcGxlXG4gKiAgICAgICAgICAgICAgICAgICAnMS4wMCBLQicgZm9yICcxMDI0IEInXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYnl0ZXMgY291bnQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIG9yXG4gKiAgICAgICAgICAgICAgICAgaWYgaXQgaXMgbGVzcyB0aGFuIHplcm8uXG4gKi9cbmZ1bmN0aW9uIHRvUmVhZGFibGVTaXplU3RyaW5nIChieXRlcykge1xuICBjb25zdCBpbnRCeXRlcyA9IHBhcnNlSW50KFN0cmluZyhieXRlcyksIDEwKTtcbiAgaWYgKGlzTmFOKGludEJ5dGVzKSB8fCBpbnRCeXRlcyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0ICcke2J5dGVzfScgdG8gYSByZWFkYWJsZSBzaXplIGZvcm1hdGApO1xuICB9XG4gIGlmIChpbnRCeXRlcyA+PSBHaUIpIHtcbiAgICByZXR1cm4gYCR7KGludEJ5dGVzIC8gKEdpQiAqIDEuMCkpLnRvRml4ZWQoMil9IEdCYDtcbiAgfSBlbHNlIGlmIChpbnRCeXRlcyA+PSBNaUIpIHtcbiAgICByZXR1cm4gYCR7KGludEJ5dGVzIC8gKE1pQiAqIDEuMCkpLnRvRml4ZWQoMil9IE1CYDtcbiAgfSBlbHNlIGlmIChpbnRCeXRlcyA+PSBLaUIpIHtcbiAgICByZXR1cm4gYCR7KGludEJ5dGVzIC8gKEtpQiAqIDEuMCkpLnRvRml4ZWQoMil9IEtCYDtcbiAgfVxuICByZXR1cm4gYCR7aW50Qnl0ZXN9IEJgO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIGEgc3VicGF0aCBvZiB0aGVcbiAqIHBhcnRpY3VsYXIgcm9vdCBmb2xkZXIuIEJvdGggcGF0aHMgY2FuIGluY2x1ZGUgLi4gYW5kIC4gc3BlY2lmaWVyc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcmlnaW5hbFBhdGggVGhlIGFic29sdXRlIGZpbGUvZm9sZGVyIHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSByb290IFRoZSBhYnNvbHV0ZSByb290IGZvbGRlciBwYXRoXG4gKiBAcGFyYW0gez9ib29sZWFufSBmb3JjZVBvc2l4IFNldCBpdCB0byB0cnVlIGlmIHBhdGhzIG11c3QgYmUgaW50ZXJwcmV0ZWQgaW4gUE9TSVggZm9ybWF0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZ2l2ZW4gb3JpZ2luYWwgcGF0aCBpcyB0aGUgc3VicGF0aCBvZiB0aGUgcm9vdCBmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBhbnkgb2YgdGhlIGdpdmVuIHBhdGhzIGlzIG5vdCBhYnNvbHV0ZVxuICovXG5mdW5jdGlvbiBpc1N1YlBhdGggKG9yaWdpbmFsUGF0aCwgcm9vdCwgZm9yY2VQb3NpeCA9IG51bGwpIHtcbiAgY29uc3QgcGF0aE9iaiA9IGZvcmNlUG9zaXggPyBwYXRoLnBvc2l4IDogcGF0aDtcbiAgZm9yIChjb25zdCBwIG9mIFtvcmlnaW5hbFBhdGgsIHJvb3RdKSB7XG4gICAgaWYgKCFwYXRoT2JqLmlzQWJzb2x1dGUocCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7cH0nIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFic29sdXRlIHBhdGhgKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZFJvb3QgPSBwYXRoT2JqLm5vcm1hbGl6ZShyb290KTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoT2JqLm5vcm1hbGl6ZShvcmlnaW5hbFBhdGgpO1xuICByZXR1cm4gbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkUm9vdCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGhzIGFyZSBwb2ludGluZyB0byB0aGUgc2FtZSBmaWxlIHN5c3RlbVxuICogZGVzdGluYXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGgxIC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byBhIGZpbGUvZm9sZGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aDIgLSBBYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRoIHRvIGEgZmlsZS9mb2xkZXJcbiAqIEBwYXJhbSB7Li4uc3RyaW5nfSBwYXRoTiAtIFplcm8gb3IgbW9yZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRocyB0byBmaWxlcy9mb2xkZXJzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gdHJ1ZSBpZiBhbGwgcGF0aHMgYXJlIHBvaW50aW5nIHRvIHRoZSBzYW1lIGZpbGUgc3lzdGVtIGl0ZW1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNTYW1lRGVzdGluYXRpb24gKHBhdGgxLCBwYXRoMiwgLi4ucGF0aE4pIHtcbiAgY29uc3QgYWxsUGF0aHMgPSBbcGF0aDEsIHBhdGgyLCAuLi5wYXRoTl07XG4gIGlmICghYXdhaXQgQi5yZWR1Y2UoYWxsUGF0aHMsIGFzeW5jIChhLCBiKSA9PiBhICYmIGF3YWl0IGZzLmV4aXN0cyhiKSwgdHJ1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBhcmVBbGxJdGVtc0VxdWFsID0gKGFycikgPT4gISFhcnIucmVkdWNlKChhLCBiKSA9PiBhID09PSBiID8gYSA6IE5hTik7XG4gIGlmIChhcmVBbGxJdGVtc0VxdWFsKGFsbFBhdGhzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGV0IG1hcENiID0gYXN5bmMgKHgpID0+IChhd2FpdCBmcy5zdGF0KHgsIHtcbiAgICBiaWdpbnQ6IHRydWUsXG4gIH0pKS5pbm87XG4gIHJldHVybiBhcmVBbGxJdGVtc0VxdWFsKGF3YWl0IEIubWFwKGFsbFBhdGhzLCBtYXBDYikpO1xufVxuXG4vKipcbiAqIENvZXJjZXMgdGhlIGdpdmVuIG51bWJlci9zdHJpbmcgdG8gYSB2YWxpZCB2ZXJzaW9uIHN0cmluZ1xuICpcbiAqIEB0ZW1wbGF0ZSB7Ym9vbGVhbn0gW1N0cmljdD10cnVlXVxuICogQHBhcmFtIHtzdHJpbmd9IHZlciAtIFZlcnNpb24gc3RyaW5nIHRvIGNvZXJjZVxuICogQHBhcmFtIHtTdHJpY3R9IFtzdHJpY3RdIC0gSWYgYHRydWVgIHRoZW4gYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duXG4gKiBpZiBgdmVyYCBjYW5ub3QgYmUgY29lcmNlZFxuICogQHJldHVybnMge1N0cmljdCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBzdHJpbmd8bnVsbH0gQ29lcmNlZCB2ZXJzaW9uIG51bWJlciBvciBudWxsIGlmIHRoZSBzdHJpbmcgY2Fubm90IGJlXG4gKiBjb2VyY2VkIGFuZCBzdHJpY3QgbW9kZSBpcyBkaXNhYmxlZFxuICogQHRocm93cyB7RXJyb3J9IGlmIHN0cmljdCBtb2RlIGlzIGVuYWJsZWQgYW5kIGB2ZXJgIGNhbm5vdCBiZSBjb2VyY2VkXG4gKi9cbmZ1bmN0aW9uIGNvZXJjZVZlcnNpb24gKHZlciwgc3RyaWN0ID0gLyoqIEB0eXBlIHtTdHJpY3R9ICovKHRydWUpKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHNlbXZlci52YWxpZChzZW12ZXIuY29lcmNlKGAke3Zlcn1gKSk7XG4gIGlmIChzdHJpY3QgJiYgIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7dmVyfScgY2Fubm90IGJlIGNvZXJjZWQgdG8gYSB2YWxpZCB2ZXJzaW9uIG51bWJlcmApO1xuICB9XG4gIHJldHVybiAvKiogQHR5cGUge1N0cmljdCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBzdHJpbmc/fSAqLyhyZXN1bHQpO1xufVxuXG5jb25zdCBTVVBQT1JURURfT1BFUkFUT1JTID0gWyc9PScsICchPScsICc+JywgJzwnLCAnPj0nLCAnPD0nLCAnPSddO1xuXG4vKipcbiAqIENvbXBhcmVzIHR3byB2ZXJzaW9uIHN0cmluZ3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyMSAtIFRoZSBmaXJzdCB2ZXJzaW9uIG51bWJlciB0byBjb21wYXJlLiBTaG91bGQgYmUgYSB2YWxpZFxuICogdmVyc2lvbiBudW1iZXIgc3VwcG9ydGVkIGJ5IHNlbXZlciBwYXJzZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyMiAtIFRoZSBzZWNvbmQgdmVyc2lvbiBudW1iZXIgdG8gY29tcGFyZS4gU2hvdWxkIGJlIGEgdmFsaWRcbiAqIHZlcnNpb24gbnVtYmVyIHN1cHBvcnRlZCBieSBzZW12ZXIgcGFyc2VyLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdG9yIC0gT25lIG9mIHN1cHBvcnRlZCB2ZXJzaW9uIG51bWJlciBvcGVyYXRvcnM6XG4gKiA9PSwgIT0sID4sIDwsIDw9LCA+PSwgPVxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIHRoZSBhY3R1YWwgY29tcGFyaXNvbiByZXN1bHRcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBhbiB1bnN1cHBvcnRlZCBvcGVyYXRvciBpcyBzdXBwbGllZCBvciBhbnkgb2YgdGhlIHN1cHBsaWVkXG4gKiB2ZXJzaW9uIHN0cmluZ3MgY2Fubm90IGJlIGNvZXJjZWRcbiAqL1xuZnVuY3Rpb24gY29tcGFyZVZlcnNpb25zICh2ZXIxLCBvcGVyYXRvciwgdmVyMikge1xuICBpZiAoIVNVUFBPUlRFRF9PUEVSQVRPUlMuaW5jbHVkZXMob3BlcmF0b3IpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJyR7b3BlcmF0b3J9JyBjb21wYXJpc29uIG9wZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQuIGAgK1xuICAgICAgYE9ubHkgJyR7SlNPTi5zdHJpbmdpZnkoU1VQUE9SVEVEX09QRVJBVE9SUyl9JyBvcGVyYXRvcnMgYXJlIHN1cHBvcnRlZGApO1xuICB9XG5cbiAgY29uc3Qgc2VtdmVyT3BlcmF0b3IgPSBbJz09JywgJyE9J10uaW5jbHVkZXMob3BlcmF0b3IpID8gJz0nIDogb3BlcmF0b3I7XG4gIGNvbnN0IHJlc3VsdCA9IHNlbXZlci5zYXRpc2ZpZXMoY29lcmNlVmVyc2lvbih2ZXIxKSwgYCR7c2VtdmVyT3BlcmF0b3J9JHtjb2VyY2VWZXJzaW9uKHZlcjIpfWApO1xuICByZXR1cm4gb3BlcmF0b3IgPT09ICchPScgPyAhcmVzdWx0IDogcmVzdWx0O1xufVxuXG4vKipcbiAqIEFkZCBhcHByb3ByaWF0ZSBxdW90ZXMgdG8gY29tbWFuZCBhcmd1bWVudHMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc3Vic3RhY2svbm9kZS1zaGVsbC1xdW90ZVxuICogZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBhcmd1bWVudHMsIHF1b3RlZFxuICovXG5mdW5jdGlvbiBxdW90ZSAoYXJncykge1xuICByZXR1cm4gc2hlbGxRdW90ZShfLmNhc3RBcnJheShhcmdzKSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgdG8gd29ya2Fyb3VuZCB1bmV4cGVjdGVkIG1lbW9yeSBsZWFrc1xuICogY2F1c2VkIGJ5IE5vZGVKUyBzdHJpbmcgaW50ZXJuaW5nXG4gKiBiZWhhdmlvciBkZXNjcmliZWQgaW4gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Mjg2OVxuICpcbiAqIEBwYXJhbSB7Kn0gcyAtIFRoZSBzdHJpbmcgdG8gdW5sZWFrXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEVpdGhlciB0aGUgdW5sZWFrZWQgc3RyaW5nIG9yIHRoZSBvcmlnaW5hbCBvYmplY3QgY29udmVydGVkIHRvIHN0cmluZ1xuICovXG5mdW5jdGlvbiB1bmxlYWtTdHJpbmcgKHMpIHtcbiAgcmV0dXJuIGAgJHtzfWAuc3Vic3RyKDEpO1xufVxuXG5cbi8qKlxuICogQHR5cGVkZWYgUGx1cmFsaXplT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbaW5jbHVzaXZlPWZhbHNlXSAtIFdoZXRoZXIgdG8gcHJlZml4IHdpdGggdGhlIG51bWJlciAoZS5nLiwgMyBkdWNrcylcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgZm9ybSBvZiBhIHdvcmQgYXBwcm9wcmlhdGUgdG8gdGhlIGNvdW50XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmQgLSBUaGUgd29yZCB0byBwbHVyYWxpemVcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIEhvdyBtYW55IG9mIHRoZSB3b3JkIGV4aXN0XG4gKiBAcGFyYW0ge1BsdXJhbGl6ZU9wdGlvbnN8Ym9vbGVhbn0gb3B0aW9ucyAtIG9wdGlvbnMgZm9yIHdvcmQgcGx1cmFsaXphdGlvbixcbiAqICAgb3IgYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG9wdGlvbnMuaW5jbHVzaXZlIHByb3BlcnR5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgd29yZCBwbHVyYWxpemVkIGFjY29yZGluZyB0byB0aGUgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbGl6ZSAod29yZCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICBsZXQgaW5jbHVzaXZlID0gZmFsc2U7XG4gIGlmIChfLmlzQm9vbGVhbihvcHRpb25zKSkge1xuICAgIC8vIGlmIHBhc3NlZCBpbiBhcyBhIGJvb2xlYW5cbiAgICBpbmNsdXNpdmUgPSBvcHRpb25zO1xuICB9IGVsc2UgaWYgKF8uaXNCb29sZWFuKG9wdGlvbnM/LmluY2x1c2l2ZSkpIHtcbiAgICAvLyBpZiBwYXNzZWQgaW4gYXMgYW4gb3B0aW9ucyBoYXNoXG4gICAgaW5jbHVzaXZlID0gb3B0aW9ucy5pbmNsdXNpdmU7XG4gIH1cbiAgcmV0dXJuIHBsdXJhbGl6ZUxpYih3b3JkLCBjb3VudCwgaW5jbHVzaXZlKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBFbmNvZGluZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4U2l6ZT0xMDczNzQxODI0XSBUaGUgbWF4aW11bSBzaXplIG9mXG4gKiB0aGUgcmVzdWx0aW5nIGJ1ZmZlciBpbiBieXRlcy4gVGhpcyBpcyBzZXQgdG8gMUdCIGJ5IGRlZmF1bHQsIGJlY2F1c2VcbiAqIEFwcGl1bSBsaW1pdHMgdGhlIG1heGltdW0gSFRUUCBib2R5IHNpemUgdG8gMUdCLiBBbHNvLCB0aGUgTm9kZUpTIGhlYXBcbiAqIHNpemUgbXVzdCBiZSBlbm91Z2ggdG8ga2VlcCB0aGUgcmVzdWx0aW5nIG9iamVjdCAodXN1YWxseSB0aGlzIHNpemUgaXNcbiAqIGxpbWl0ZWQgdG8gMS40IEdCKVxuICovXG5cbi8qKlxuICogQ29udmVydHMgY29udGVudHMgb2YgYSBsb2NhbCBmaWxlIHRvIGFuIGluLW1lbW9yeSBiYXNlLTY0IGVuY29kZWQgYnVmZmVyLlxuICogVGhlIG9wZXJhdGlvbiBpcyBtZW1vcnktdXNhZ2UgZnJpZW5kbHkgYW5kIHNob3VsZCBiZSB1c2VkIHdoaWxlIGVuY29kaW5nXG4gKiBsYXJnZSBmaWxlcyB0byBiYXNlNjRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIGJlaW5nIGVuY29kZWRcbiAqIEBwYXJhbSB7RW5jb2RpbmdPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCdWZmZXI+fSBiYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSBhcyBtZW1vcnkgYnVmZmVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJlYWRpbmcgdGhlIHNvdXJjZSBmaWxlXG4gKiBvciB0aGUgc291cmNlIGZpbGUgaXMgdG9vXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRvSW5NZW1vcnlCYXNlNjQgKHNyY1BhdGgsIG9wdHMgPSB7fSkge1xuICBpZiAoIShhd2FpdCBmcy5leGlzdHMoc3JjUGF0aCkpIHx8IChhd2FpdCBmcy5zdGF0KHNyY1BhdGgpKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGZpbGU6ICR7c3JjUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBtYXhTaXplID0gMSAqIEdpQixcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IHJlc3VsdEJ1ZmZlcnMgPSBbXTtcbiAgbGV0IHJlc3VsdEJ1ZmZlcnNTaXplID0gMDtcbiAgY29uc3QgcmVzdWx0V3JpdGVTdHJlYW0gPSBuZXcgc3RyZWFtLldyaXRhYmxlKHtcbiAgICB3cml0ZTogKGJ1ZmZlciwgZW5jb2RpbmcsIG5leHQpID0+IHtcbiAgICAgIHJlc3VsdEJ1ZmZlcnMucHVzaChidWZmZXIpO1xuICAgICAgcmVzdWx0QnVmZmVyc1NpemUgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICAgIGlmIChtYXhTaXplID4gMCAmJiByZXN1bHRCdWZmZXJzU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgcmVzdWx0V3JpdGVTdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoYFRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgYCArXG4gICAgICAgICAgYGJ1ZmZlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gJHt0b1JlYWRhYmxlU2l6ZVN0cmluZyhtYXhTaXplKX1gKSk7XG4gICAgICB9XG4gICAgICBuZXh0KCk7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgcmVhZGVyU3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShzcmNQYXRoKTtcbiAgY29uc3QgYmFzZTY0RW5jb2RlclN0cmVhbSA9IG5ldyBCYXNlNjRFbmNvZGUoKTtcbiAgY29uc3QgcmVzdWx0V3JpdGVTdHJlYW1Qcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlc3VsdFdyaXRlU3RyZWFtLm9uY2UoJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgIHJlYWRlclN0cmVhbS51bnBpcGUoYmFzZTY0RW5jb2RlclN0cmVhbSk7XG4gICAgICBiYXNlNjRFbmNvZGVyU3RyZWFtLnVucGlwZShyZXN1bHRXcml0ZVN0cmVhbSk7XG4gICAgICByZWFkZXJTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgcmVqZWN0KGUpO1xuICAgIH0pO1xuICAgIHJlc3VsdFdyaXRlU3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIHJlc29sdmUpO1xuICB9KTtcbiAgY29uc3QgcmVhZFN0cmVhbVByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmVhZGVyU3RyZWFtLm9uY2UoJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgcmVhZGVyU3RyZWFtLm9uY2UoJ2Vycm9yJywgKGUpID0+IHJlamVjdChcbiAgICAgIG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlYWQgJyR7c3JjUGF0aH0nOiAke2UubWVzc2FnZX1gKSkpO1xuICB9KTtcbiAgcmVhZGVyU3RyZWFtLnBpcGUoYmFzZTY0RW5jb2RlclN0cmVhbSk7XG4gIGJhc2U2NEVuY29kZXJTdHJlYW0ucGlwZShyZXN1bHRXcml0ZVN0cmVhbSk7XG5cbiAgYXdhaXQgQi5hbGwoW3JlYWRTdHJlYW1Qcm9taXNlLCByZXN1bHRXcml0ZVN0cmVhbVByb21pc2VdKTtcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQocmVzdWx0QnVmZmVycyk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgTG9ja0ZpbGVPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXQ9MTIwXSBUaGUgbWF4IHRpbWUgaW4gc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgbG9ja1xuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJ5UmVjb3Zlcnk9ZmFsc2VdIFdoZXRoZXIgdG8gdHJ5IGxvY2sgcmVjb3ZlcnkgaWZcbiAqIHRoZSBmaXJzdCBhdHRlbXB0IHRvIGFjcXVpcmUgaXQgdGltZWQgb3V0LlxuICovXG5cbi8qKlxuICogQ3JlYXRlIGFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoLCB3aGVuIGNhbGxlZCwgd2lsbCBub3QgcHJvY2VlZCB1bnRpbCBhIGNlcnRhaW4gZmlsZSBpcyBub1xuICogbG9uZ2VyIHByZXNlbnQgb24gdGhlIHN5c3RlbS4gVGhpcyBhbGxvd3MgZm9yIHByZXZlbnRpbmcgY29uY3VycmVudCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzXG4gKiB1c2luZyBhIGtub3duIGxvY2tmaWxlIHBhdGguXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NrRmlsZSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIHVzZWQgZm9yIHRoZSBsb2NrXG4gKiBAcGFyYW0ge0xvY2tGaWxlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMgYXN5bmMgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbm90aGVyIGFzeW5jIGZ1bmN0aW9uIGRlZmluaW5nIHRoZSBsb2NrZWRcbiAqIGJlaGF2aW9yXG4gKi9cbmZ1bmN0aW9uIGdldExvY2tGaWxlR3VhcmQgKGxvY2tGaWxlLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRpbWVvdXQgPSAxMjAsXG4gICAgdHJ5UmVjb3ZlcnkgPSBmYWxzZSxcbiAgfSA9IG9wdHM7XG5cbiAgY29uc3QgbG9jayA9IC8qKiBAdHlwZSB7KGxvY2tmaWxlOiBzdHJpbmcsIG9wdHM6IGltcG9ydCgnbG9ja2ZpbGUnKS5PcHRpb25zKT0+Qjx2b2lkPn0gKi8oQi5wcm9taXNpZnkoX2xvY2tmaWxlLmxvY2spKTtcbiAgY29uc3QgY2hlY2sgPSBCLnByb21pc2lmeShfbG9ja2ZpbGUuY2hlY2spO1xuICBjb25zdCB1bmxvY2sgPSBCLnByb21pc2lmeShfbG9ja2ZpbGUudW5sb2NrKTtcblxuICAvKipcbiAgICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IFR9IGJlaGF2aW9yXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fVxuICAgKi9cbiAgY29uc3QgZ3VhcmQgPSBhc3luYyAoYmVoYXZpb3IpID0+IHtcbiAgICBsZXQgdHJpZWRSZWNvdmVyeSA9IGZhbHNlO1xuICAgIGRvIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGlmIHRoZSBsb2NrZmlsZSBkb2Vzbid0IGV4aXN0LCBsb2NrIGl0IHN5bmNocm9ub3VzbHkgdG8gbWFrZSBzdXJlIG5vIG90aGVyIGNhbGxcbiAgICAgICAgLy8gb24gdGhlIHNhbWUgc3BpbiBvZiB0aGUgZXZlbnQgbG9vcCBjYW4gYWxzbyBpbml0aWF0ZSBhIGxvY2suIElmIHRoZSBsb2NrZmlsZSBkb2VzIGV4aXN0XG4gICAgICAgIC8vIHRoZW4ganVzdCB1c2UgdGhlIHJlZ3VsYXIgYXN5bmMgJ2xvY2snIG1ldGhvZCB3aGljaCB3aWxsIHdhaXQgb24gdGhlIGxvY2suXG4gICAgICAgIGlmIChfbG9ja2ZpbGUuY2hlY2tTeW5jKGxvY2tGaWxlKSkge1xuICAgICAgICAgIGF3YWl0IGxvY2sobG9ja0ZpbGUsIHt3YWl0OiB0aW1lb3V0ICogMTAwMH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9sb2NrZmlsZS5sb2NrU3luYyhsb2NrRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChfLmluY2x1ZGVzKGUubWVzc2FnZSwgJ0VFWElTVCcpICYmIHRyeVJlY292ZXJ5ICYmICF0cmllZFJlY292ZXJ5KSB7XG4gICAgICAgICAgLy8gVGhlcmUgY291bGQgYmUgY2FzZXMgd2hlcmUgYSBwcm9jZXNzIGhhcyBiZWVuIGZvcmNlZnVsbHkgdGVybWluYXRlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgYSBjaGFuY2UgdG8gY2xlYW4gdXAgcGVuZGluZyBsb2NrczogaHR0cHM6Ly9naXRodWIuY29tL25wbS9sb2NrZmlsZS9pc3N1ZXMvMjZcbiAgICAgICAgICBfbG9ja2ZpbGUudW5sb2NrU3luYyhsb2NrRmlsZSk7XG4gICAgICAgICAgdHJpZWRSZWNvdmVyeSA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgYWNxdWlyZSBsb2NrIG9uICcke2xvY2tGaWxlfScgYWZ0ZXIgJHt0aW1lb3V0fXMuIGAgK1xuICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgIH0gd2hpbGUgKHRydWUpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYmVoYXZpb3IoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gd2hldGhlciB0aGUgYmVoYXZpb3Igc3VjY2VlZGVkIG9yIG5vdCwgZ2V0IHJpZCBvZiB0aGUgbG9ja1xuICAgICAgYXdhaXQgdW5sb2NrKGxvY2tGaWxlKTtcbiAgICB9XG4gIH07XG5cbiAgZ3VhcmQuY2hlY2sgPSBhc3luYyAoKSA9PiBhd2FpdCBjaGVjayhsb2NrRmlsZSk7XG5cbiAgcmV0dXJuIGd1YXJkO1xufVxuXG5leHBvcnQge1xuICBoYXNWYWx1ZSwgZXNjYXBlU3BhY2UsIGVzY2FwZVNwZWNpYWxDaGFycywgbG9jYWxJcCwgY2FuY2VsbGFibGVEZWxheSxcbiAgbXVsdGlSZXNvbHZlLCBzYWZlSnNvblBhcnNlLCB3cmFwRWxlbWVudCwgdW53cmFwRWxlbWVudCwgZmlsdGVyT2JqZWN0LFxuICB0b1JlYWRhYmxlU2l6ZVN0cmluZywgaXNTdWJQYXRoLCBXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUixcbiAgaXNTYW1lRGVzdGluYXRpb24sIGNvbXBhcmVWZXJzaW9ucywgY29lcmNlVmVyc2lvbiwgcXVvdGUsIHVubGVha1N0cmluZyxcbiAganNvblN0cmluZ2lmeSwgcGx1cmFsaXplLCBHaUIsIE1pQiwgS2lCLCB0b0luTWVtb3J5QmFzZTY0LFxuICB1dWlkVjEsIHV1aWRWMywgdXVpZFY0LCB1dWlkVjUsIHNoZWxsUGFyc2UsIGdldExvY2tGaWxlR3VhcmRcbn07XG4iXX0=
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
declare namespace _default {
|
|
2
|
+
export { extractAllTo };
|
|
3
|
+
export { readEntries };
|
|
4
|
+
export { toInMemoryZip };
|
|
5
|
+
export { assertValidZip };
|
|
6
|
+
export { toArchive };
|
|
7
|
+
}
|
|
8
|
+
export default _default;
|
|
9
|
+
export type ExtractAllOptions = {
|
|
10
|
+
/**
|
|
11
|
+
* The encoding to use for extracted file names.
|
|
12
|
+
* For ZIP archives created on MacOS it is usually expected to be `utf8`.
|
|
13
|
+
* By default it is autodetected based on the entry metadata and is only needed to be set explicitly
|
|
14
|
+
* if the particular archive does not comply to the standards, which leads to corrupted file names
|
|
15
|
+
* after extraction. Only applicable if system unzip binary is NOT being used.
|
|
16
|
+
*/
|
|
17
|
+
fileNamesEncoding: string | null;
|
|
18
|
+
/**
|
|
19
|
+
* [false] If true, attempt to use system unzip; if this fails,
|
|
20
|
+
* fallback to the JS unzip implementation.
|
|
21
|
+
*/
|
|
22
|
+
useSystemUnzip: boolean | null;
|
|
23
|
+
};
|
|
24
|
+
export type ZipEntry = {
|
|
25
|
+
/**
|
|
26
|
+
* The actual entry instance
|
|
27
|
+
*/
|
|
28
|
+
entry: yauzl.Entry;
|
|
29
|
+
/**
|
|
30
|
+
* An async function, which accepts one parameter.
|
|
31
|
+
* This parameter contains the destination folder path to which this function is going to extract the entry.
|
|
32
|
+
*/
|
|
33
|
+
extractEntryTo: Function;
|
|
34
|
+
};
|
|
35
|
+
export type ZipOptions = {
|
|
36
|
+
/**
|
|
37
|
+
* [false] Whether to encode
|
|
38
|
+
* the resulting archive to a base64-encoded string
|
|
39
|
+
*/
|
|
40
|
+
encodeToBase64: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* [true] Whether to log the actual
|
|
43
|
+
* archiver performance
|
|
44
|
+
*/
|
|
45
|
+
isMetered: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* [1073741824] The maximum size of
|
|
48
|
+
* the resulting archive in bytes. This is set to 1GB by default, because
|
|
49
|
+
* Appium limits the maximum HTTP body size to 1GB. Also, the NodeJS heap
|
|
50
|
+
* size must be enough to keep the resulting object (usually this size is
|
|
51
|
+
* limited to 1.4 GB)
|
|
52
|
+
*/
|
|
53
|
+
maxSize: number;
|
|
54
|
+
/**
|
|
55
|
+
* [9] The compression level. The maximum
|
|
56
|
+
* level is 9 (the best compression, worst performance). The minimum
|
|
57
|
+
* compression level is 0 (no compression).
|
|
58
|
+
*/
|
|
59
|
+
level: number;
|
|
60
|
+
};
|
|
61
|
+
export type ZipCompressionOptions = {
|
|
62
|
+
/**
|
|
63
|
+
* [9] - Compression level in range 0..9
|
|
64
|
+
* (greater numbers mean better compression, but longer processing time)
|
|
65
|
+
*/
|
|
66
|
+
level: number;
|
|
67
|
+
};
|
|
68
|
+
export type ZipSourceOptions = {
|
|
69
|
+
/**
|
|
70
|
+
* ['**\/*'] - GLOB pattern for compression
|
|
71
|
+
*/
|
|
72
|
+
pattern: string;
|
|
73
|
+
/**
|
|
74
|
+
* - The source root folder (the parent folder of
|
|
75
|
+
* the destination file by default)
|
|
76
|
+
*/
|
|
77
|
+
cwd: string;
|
|
78
|
+
/**
|
|
79
|
+
* - The list of ignored patterns
|
|
80
|
+
*/
|
|
81
|
+
ignore?: string[] | undefined;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* @typedef ExtractAllOptions
|
|
85
|
+
* @property {?string} fileNamesEncoding The encoding to use for extracted file names.
|
|
86
|
+
* For ZIP archives created on MacOS it is usually expected to be `utf8`.
|
|
87
|
+
* By default it is autodetected based on the entry metadata and is only needed to be set explicitly
|
|
88
|
+
* if the particular archive does not comply to the standards, which leads to corrupted file names
|
|
89
|
+
* after extraction. Only applicable if system unzip binary is NOT being used.
|
|
90
|
+
* @property {?boolean} useSystemUnzip [false] If true, attempt to use system unzip; if this fails,
|
|
91
|
+
* fallback to the JS unzip implementation.
|
|
92
|
+
*/
|
|
93
|
+
/**
|
|
94
|
+
* Extract zipfile to a directory
|
|
95
|
+
*
|
|
96
|
+
* @param {string} zipFilePath The full path to the source ZIP file
|
|
97
|
+
* @param {string} destDir The full path to the destination folder
|
|
98
|
+
* @param {ExtractAllOptions} [opts]
|
|
99
|
+
*/
|
|
100
|
+
export function extractAllTo(zipFilePath: string, destDir: string, opts?: ExtractAllOptions | undefined): Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* @typedef ZipEntry
|
|
103
|
+
* @property {yauzl.Entry} entry The actual entry instance
|
|
104
|
+
* @property {function} extractEntryTo An async function, which accepts one parameter.
|
|
105
|
+
* This parameter contains the destination folder path to which this function is going to extract the entry.
|
|
106
|
+
*/
|
|
107
|
+
/**
|
|
108
|
+
* Get entries for a zip folder
|
|
109
|
+
*
|
|
110
|
+
* @param {string} zipFilePath The full path to the source ZIP file
|
|
111
|
+
* @param {function} onEntry Callback when entry is read.
|
|
112
|
+
* The callback is expected to accept one argument of ZipEntry type.
|
|
113
|
+
* The iteration through the source zip file will bi terminated as soon as
|
|
114
|
+
* the result of this function equals to `false`.
|
|
115
|
+
*/
|
|
116
|
+
export function readEntries(zipFilePath: string, onEntry: Function): Promise<any>;
|
|
117
|
+
/**
|
|
118
|
+
* @typedef ZipOptions
|
|
119
|
+
* @property {boolean} encodeToBase64 [false] Whether to encode
|
|
120
|
+
* the resulting archive to a base64-encoded string
|
|
121
|
+
* @property {boolean} isMetered [true] Whether to log the actual
|
|
122
|
+
* archiver performance
|
|
123
|
+
* @property {number} maxSize [1073741824] The maximum size of
|
|
124
|
+
* the resulting archive in bytes. This is set to 1GB by default, because
|
|
125
|
+
* Appium limits the maximum HTTP body size to 1GB. Also, the NodeJS heap
|
|
126
|
+
* size must be enough to keep the resulting object (usually this size is
|
|
127
|
+
* limited to 1.4 GB)
|
|
128
|
+
* @property {number} level [9] The compression level. The maximum
|
|
129
|
+
* level is 9 (the best compression, worst performance). The minimum
|
|
130
|
+
* compression level is 0 (no compression).
|
|
131
|
+
*/
|
|
132
|
+
/**
|
|
133
|
+
* Converts contents of local directory to an in-memory .zip buffer
|
|
134
|
+
*
|
|
135
|
+
* @param {string} srcPath The full path to the folder or file being zipped
|
|
136
|
+
* @param {ZipOptions} opts Zipping options
|
|
137
|
+
* @returns {Promise<Buffer>} Zipped (and encoded if `encodeToBase64` is truthy)
|
|
138
|
+
* content of the source path as memory buffer
|
|
139
|
+
* @throws {Error} if there was an error while reading the source
|
|
140
|
+
* or the source is too big
|
|
141
|
+
*/
|
|
142
|
+
export function toInMemoryZip(srcPath: string, opts?: ZipOptions): Promise<Buffer>;
|
|
143
|
+
/**
|
|
144
|
+
* Extract a single zip entry to a directory
|
|
145
|
+
*
|
|
146
|
+
* @param {yauzl.ZipFile} zipFile The source ZIP stream
|
|
147
|
+
* @param {yauzl.Entry} entry The entry instance
|
|
148
|
+
* @param {string} destDir The full path to the destination folder
|
|
149
|
+
*/
|
|
150
|
+
export function _extractEntryTo(zipFile: yauzl.ZipFile, entry: yauzl.Entry, destDir: string): Promise<[any, any] | undefined>;
|
|
151
|
+
/**
|
|
152
|
+
* Verifies whether the given file is a valid ZIP archive
|
|
153
|
+
*
|
|
154
|
+
* @param {string} filePath - Full path to the file
|
|
155
|
+
* @throws {Error} If the file does not exist or is not a valid ZIP archive
|
|
156
|
+
*/
|
|
157
|
+
export function assertValidZip(filePath: string): Promise<boolean>;
|
|
158
|
+
/**
|
|
159
|
+
* @typedef ZipCompressionOptions
|
|
160
|
+
* @property {number} level [9] - Compression level in range 0..9
|
|
161
|
+
* (greater numbers mean better compression, but longer processing time)
|
|
162
|
+
*/
|
|
163
|
+
/**
|
|
164
|
+
* @typedef ZipSourceOptions
|
|
165
|
+
* @property {string} pattern ['**\/*'] - GLOB pattern for compression
|
|
166
|
+
* @property {string} cwd - The source root folder (the parent folder of
|
|
167
|
+
* the destination file by default)
|
|
168
|
+
* @property {string[]} [ignore] - The list of ignored patterns
|
|
169
|
+
*/
|
|
170
|
+
/**
|
|
171
|
+
* Creates an archive based on the given glob pattern
|
|
172
|
+
*
|
|
173
|
+
* @param {string} dstPath - The resulting archive path
|
|
174
|
+
* @param {ZipSourceOptions} src - Source options
|
|
175
|
+
* @param {ZipCompressionOptions} opts - Compression options
|
|
176
|
+
* @throws {Error} If there was an error while creating the archive
|
|
177
|
+
*/
|
|
178
|
+
export function toArchive(dstPath: string, src?: ZipSourceOptions, opts?: ZipCompressionOptions): Promise<any>;
|
|
179
|
+
import yauzl from "yauzl";
|
|
180
|
+
//# sourceMappingURL=zip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../../lib/zip.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;uBAsLe,MAAM;;;;;oBAKN,OAAO;;;;;;WAwHR,MAAM,KAAK;;;;;;;;;;;;oBAyCX,OAAO;;;;;eAEP,OAAO;;;;;;;;aAEP,MAAM;;;;;;WAKN,MAAM;;;;;;;WAmIN,MAAM;;;;;;aAMN,MAAM;;;;;SACN,MAAM;;;;;;AA3TpB;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,0CAJW,MAAM,WACN,MAAM,uDAuBhB;AAuFD;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,yCANW,MAAM,mCA6BhB;AAED;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;GASG;AACH,uCAPW,MAAM,SACN,UAAU,GACR,QAAQ,MAAM,CAAC,CAuF3B;AAlMD;;;;;;GAMG;AACH,yCAJW,MAAM,OAAO,SACb,MAAM,KAAK,WACX,MAAM,mCAsChB;AAyJD;;;;;GAKG;AACH,yCAHW,MAAM,oBAyBhB;AAED;;;;GAIG;AAEH;;;;;;GAMG;AAEH;;;;;;;GAOG;AACH,mCALW,MAAM,QACN,gBAAgB,SAChB,qBAAqB,gBAgC/B"}
|