cdk-assets 3.3.0 → 4.0.0

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.
Files changed (48) hide show
  1. package/README.md +4 -4
  2. package/THIRD_PARTY_LICENSES +18764 -0
  3. package/bin/cdk-assets.js +109830 -62
  4. package/bin/docker-credential-cdk-assets.js +4 -4
  5. package/bin/list.js +3 -3
  6. package/bin/logging.js +3 -1
  7. package/bin/publish.js +6 -6
  8. package/package.json +11 -30
  9. package/lib/asset-manifest.d.ts +0 -186
  10. package/lib/asset-manifest.js +0 -270
  11. package/lib/aws-types.d.ts +0 -1666
  12. package/lib/aws-types.js +0 -144
  13. package/lib/aws.d.ts +0 -71
  14. package/lib/aws.js +0 -131
  15. package/lib/index.d.ts +0 -4
  16. package/lib/index.js +0 -21
  17. package/lib/private/archive.d.ts +0 -3
  18. package/lib/private/archive.js +0 -87
  19. package/lib/private/asset-handler.d.ts +0 -60
  20. package/lib/private/asset-handler.js +0 -3
  21. package/lib/private/docker-credentials.d.ts +0 -35
  22. package/lib/private/docker-credentials.js +0 -90
  23. package/lib/private/docker.d.ts +0 -98
  24. package/lib/private/docker.js +0 -235
  25. package/lib/private/fs-extra.d.ts +0 -3
  26. package/lib/private/fs-extra.js +0 -37
  27. package/lib/private/handlers/client-options.d.ts +0 -3
  28. package/lib/private/handlers/client-options.js +0 -12
  29. package/lib/private/handlers/container-images.d.ts +0 -22
  30. package/lib/private/handlers/container-images.js +0 -224
  31. package/lib/private/handlers/files.d.ts +0 -14
  32. package/lib/private/handlers/files.js +0 -289
  33. package/lib/private/handlers/index.d.ts +0 -3
  34. package/lib/private/handlers/index.js +0 -16
  35. package/lib/private/p-limit.d.ts +0 -10
  36. package/lib/private/p-limit.js +0 -51
  37. package/lib/private/placeholders.d.ts +0 -10
  38. package/lib/private/placeholders.js +0 -34
  39. package/lib/private/shell.d.ts +0 -24
  40. package/lib/private/shell.js +0 -131
  41. package/lib/private/util.d.ts +0 -5
  42. package/lib/private/util.js +0 -16
  43. package/lib/progress.d.ts +0 -114
  44. package/lib/progress.js +0 -104
  45. package/lib/publishing.d.ts +0 -118
  46. package/lib/publishing.js +0 -193
  47. package/scripts/manual-test-manifest.json +0 -12
  48. package/scripts/manual-test.sh +0 -22
@@ -1,270 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DestinationPattern = exports.DestinationIdentifier = exports.DockerImageManifestEntry = exports.FileManifestEntry = exports.AssetManifest = void 0;
4
- const fs = require("fs");
5
- const path = require("path");
6
- const cloud_assembly_schema_1 = require("@aws-cdk/cloud-assembly-schema");
7
- /**
8
- * A manifest of assets
9
- */
10
- class AssetManifest {
11
- /**
12
- * Load an asset manifest from the given file
13
- */
14
- static fromFile(fileName) {
15
- try {
16
- const obj = cloud_assembly_schema_1.Manifest.loadAssetManifest(fileName);
17
- return new AssetManifest(path.dirname(fileName), obj);
18
- }
19
- catch (e) {
20
- throw new Error(`Cannot read asset manifest '${fileName}': ${e.message}`);
21
- }
22
- }
23
- /**
24
- * Load an asset manifest from the given file or directory
25
- *
26
- * If the argument given is a directoy, the default asset file name will be used.
27
- */
28
- static fromPath(filePath) {
29
- let st;
30
- try {
31
- st = fs.statSync(filePath);
32
- }
33
- catch (e) {
34
- throw new Error(`Cannot read asset manifest at '${filePath}': ${e.message}`);
35
- }
36
- if (st.isDirectory()) {
37
- return AssetManifest.fromFile(path.join(filePath, AssetManifest.DEFAULT_FILENAME));
38
- }
39
- return AssetManifest.fromFile(filePath);
40
- }
41
- constructor(directory, manifest) {
42
- this.manifest = manifest;
43
- this.directory = directory;
44
- }
45
- /**
46
- * Select a subset of assets and destinations from this manifest.
47
- *
48
- * Only assets with at least 1 selected destination are retained.
49
- *
50
- * If selection is not given, everything is returned.
51
- */
52
- select(selection) {
53
- if (selection === undefined) {
54
- return this;
55
- }
56
- const ret = {
57
- version: this.manifest.version,
58
- dockerImages: {},
59
- files: {},
60
- };
61
- for (const assetType of ASSET_TYPES) {
62
- for (const [assetId, asset] of Object.entries(this.manifest[assetType] || {})) {
63
- const filteredDestinations = filterDict(asset.destinations, (_, destId) => selection.some((sel) => sel.matches(new DestinationIdentifier(assetId, destId))));
64
- if (Object.keys(filteredDestinations).length > 0) {
65
- ret[assetType][assetId] = {
66
- ...asset,
67
- destinations: filteredDestinations,
68
- };
69
- }
70
- }
71
- }
72
- return new AssetManifest(this.directory, ret);
73
- }
74
- /**
75
- * Describe the asset manifest as a list of strings
76
- */
77
- list() {
78
- return [
79
- ...describeAssets('file', this.manifest.files || {}),
80
- ...describeAssets('docker-image', this.manifest.dockerImages || {}),
81
- ];
82
- function describeAssets(type, assets) {
83
- const ret = new Array();
84
- for (const [assetId, asset] of Object.entries(assets || {})) {
85
- ret.push(`${assetId} ${type} ${JSON.stringify(asset.source)}`);
86
- const destStrings = Object.entries(asset.destinations).map(([destId, dest]) => ` ${assetId}:${destId} ${JSON.stringify(dest)}`);
87
- ret.push(...prefixTreeChars(destStrings, ' '));
88
- }
89
- return ret;
90
- }
91
- }
92
- /**
93
- * List of assets per destination
94
- *
95
- * Returns one asset for every publishable destination. Multiple asset
96
- * destinations may share the same asset source.
97
- */
98
- get entries() {
99
- return [
100
- ...makeEntries(this.manifest.files || {}, FileManifestEntry),
101
- ...makeEntries(this.manifest.dockerImages || {}, DockerImageManifestEntry),
102
- ];
103
- }
104
- /**
105
- * List of file assets, splat out to destinations
106
- */
107
- get files() {
108
- return makeEntries(this.manifest.files || {}, FileManifestEntry);
109
- }
110
- }
111
- exports.AssetManifest = AssetManifest;
112
- /**
113
- * The default name of the asset manifest in a cdk.out directory
114
- */
115
- AssetManifest.DEFAULT_FILENAME = 'assets.json';
116
- function makeEntries(assets, ctor) {
117
- const ret = new Array();
118
- for (const [assetId, asset] of Object.entries(assets)) {
119
- for (const [destId, destination] of Object.entries(asset.destinations)) {
120
- ret.push(new ctor(new DestinationIdentifier(assetId, destId), asset.displayName, asset.source, destination));
121
- }
122
- }
123
- return ret;
124
- }
125
- const ASSET_TYPES = ['files', 'dockerImages'];
126
- /**
127
- * A manifest entry for a file asset
128
- */
129
- class FileManifestEntry {
130
- constructor(
131
- /** Identifier for this asset */
132
- id, _displayName,
133
- /** Source of the file asset */
134
- source,
135
- /** Destination for the file asset */
136
- destination) {
137
- this.id = id;
138
- this._displayName = _displayName;
139
- this.source = source;
140
- this.destination = destination;
141
- this.type = 'file';
142
- this.genericSource = source;
143
- this.genericDestination = destination;
144
- }
145
- displayName(includeDestination) {
146
- if (includeDestination) {
147
- return this._displayName ? `${this._displayName} (${this.id.destinationId})` : `${this.id}`;
148
- }
149
- else {
150
- return this._displayName ? this._displayName : this.id.assetId;
151
- }
152
- }
153
- }
154
- exports.FileManifestEntry = FileManifestEntry;
155
- /**
156
- * A manifest entry for a docker image asset
157
- */
158
- class DockerImageManifestEntry {
159
- constructor(
160
- /** Identifier for this asset */
161
- id, _displayName,
162
- /** Source of the file asset */
163
- source,
164
- /** Destination for the file asset */
165
- destination) {
166
- this.id = id;
167
- this._displayName = _displayName;
168
- this.source = source;
169
- this.destination = destination;
170
- this.type = 'docker-image';
171
- this.genericSource = source;
172
- this.genericDestination = destination;
173
- }
174
- displayName(includeDestination) {
175
- if (includeDestination) {
176
- return this._displayName ? `${this._displayName} (${this.id.destinationId})` : `${this.id}`;
177
- }
178
- else {
179
- return this._displayName ? this._displayName : this.id.assetId;
180
- }
181
- }
182
- }
183
- exports.DockerImageManifestEntry = DockerImageManifestEntry;
184
- /**
185
- * Identify an asset destination in an asset manifest
186
- *
187
- * This class is used to identify both an asset to be built as well as a
188
- * destination where an asset will be published. However, when reasoning about
189
- * building assets the destination part can be ignored, because the same asset
190
- * being sent to multiple destinations will only need to be built once and their
191
- * assetIds are all the same.
192
- *
193
- * When stringified, this will be a combination of the source and destination
194
- * IDs; if a string representation of the source is necessary, use `id.assetId`
195
- * instead.
196
- */
197
- class DestinationIdentifier {
198
- constructor(assetId, destinationId) {
199
- this.assetId = assetId;
200
- this.destinationId = destinationId;
201
- }
202
- /**
203
- * Return a string representation for this asset identifier
204
- */
205
- toString() {
206
- return this.destinationId ? `${this.assetId}:${this.destinationId}` : this.assetId;
207
- }
208
- }
209
- exports.DestinationIdentifier = DestinationIdentifier;
210
- function filterDict(xs, pred) {
211
- const ret = {};
212
- for (const [key, value] of Object.entries(xs)) {
213
- if (pred(value, key)) {
214
- ret[key] = value;
215
- }
216
- }
217
- return ret;
218
- }
219
- /**
220
- * A filter pattern for an destination identifier
221
- */
222
- class DestinationPattern {
223
- /**
224
- * Parse a ':'-separated string into an asset/destination identifier
225
- */
226
- static parse(s) {
227
- if (!s) {
228
- throw new Error('Empty string is not a valid destination identifier');
229
- }
230
- const parts = s.split(':').map((x) => (x !== '*' ? x : undefined));
231
- if (parts.length === 1) {
232
- return new DestinationPattern(parts[0]);
233
- }
234
- if (parts.length === 2) {
235
- return new DestinationPattern(parts[0] || undefined, parts[1] || undefined);
236
- }
237
- throw new Error(`Asset identifier must contain at most 2 ':'-separated parts, got '${s}'`);
238
- }
239
- constructor(assetId, destinationId) {
240
- this.assetId = assetId;
241
- this.destinationId = destinationId;
242
- }
243
- /**
244
- * Whether or not this pattern matches the given identifier
245
- */
246
- matches(id) {
247
- return ((this.assetId === undefined || this.assetId === id.assetId) &&
248
- (this.destinationId === undefined || this.destinationId === id.destinationId));
249
- }
250
- /**
251
- * Return a string representation for this asset identifier
252
- */
253
- toString() {
254
- return `${this.assetId ?? '*'}:${this.destinationId ?? '*'}`;
255
- }
256
- }
257
- exports.DestinationPattern = DestinationPattern;
258
- /**
259
- * Prefix box-drawing characters to make lines look like a hanging tree
260
- */
261
- function prefixTreeChars(xs, prefix = '') {
262
- const ret = new Array();
263
- for (let i = 0; i < xs.length; i++) {
264
- const isLast = i === xs.length - 1;
265
- const boxChar = isLast ? '└' : '├';
266
- ret.push(`${prefix}${boxChar}${xs[i]}`);
267
- }
268
- return ret;
269
- }
270
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtbWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhc3NldC1tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBUTdCLDBFQUV3QztBQUV4Qzs7R0FFRztBQUNILE1BQWEsYUFBYTtJQU14Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBZ0I7UUFDckMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLEdBQUcsZ0NBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxPQUFPLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsUUFBUSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBZ0I7UUFDckMsSUFBSSxFQUFFLENBQUM7UUFDUCxJQUFJLENBQUM7WUFDSCxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxRQUFRLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDckIsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUNE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IGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFzc2V0TWFuaWZlc3QgYXMgQXNzZXRNYW5pZmVzdFNjaGVtYSxcbiAgRG9ja2VySW1hZ2VEZXN0aW5hdGlvbixcbiAgRG9ja2VySW1hZ2VTb3VyY2UsXG4gIEZpbGVEZXN0aW5hdGlvbixcbiAgRmlsZVNvdXJjZSxcbn0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB7XG4gIE1hbmlmZXN0LFxufSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuXG4vKipcbiAqIEEgbWFuaWZlc3Qgb2YgYXNzZXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3NldE1hbmlmZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IG5hbWUgb2YgdGhlIGFzc2V0IG1hbmlmZXN0IGluIGEgY2RrLm91dCBkaXJlY3RvcnlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GSUxFTkFNRSA9ICdhc3NldHMuanNvbic7XG5cbiAgLyoqXG4gICAqIExvYWQgYW4gYXNzZXQgbWFuaWZlc3QgZnJvbSB0aGUgZ2l2ZW4gZmlsZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRmlsZShmaWxlTmFtZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9iaiA9IE1hbmlmZXN0LmxvYWRBc3NldE1hbmlmZXN0KGZpbGVOYW1lKTtcbiAgICAgIHJldHVybiBuZXcgQXNzZXRNYW5pZmVzdChwYXRoLmRpcm5hbWUoZmlsZU5hbWUpLCBvYmopO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBhc3NldCBtYW5pZmVzdCAnJHtmaWxlTmFtZX0nOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbiBhc3NldCBtYW5pZmVzdCBmcm9tIHRoZSBnaXZlbiBmaWxlIG9yIGRpcmVjdG9yeVxuICAgKlxuICAgKiBJZiB0aGUgYXJndW1lbnQgZ2l2ZW4gaXMgYSBkaXJlY3RveSwgdGhlIGRlZmF1bHQgYXNzZXQgZmlsZSBuYW1lIHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVBhdGgoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIGxldCBzdDtcbiAgICB0cnkge1xuICAgICAgc3QgPSBmcy5zdGF0U3luYyhmaWxlUGF0aCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkIGFzc2V0IG1hbmlmZXN0IGF0ICcke2ZpbGVQYXRofSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAoc3QuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcmV0dXJuIEFzc2V0TWFuaWZlc3QuZnJvbUZpbGUocGF0aC5qb2luKGZpbGVQYXRoLCBBc3NldE1hbmlmZXN0LkRFRkFVTFRfRklMRU5BTUUpKTtcbiAgICB9XG4gICAgcmV0dXJuIEFzc2V0TWFuaWZlc3QuZnJvbUZpbGUoZmlsZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIG1hbmlmZXN0IHdhcyBmb3VuZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRpcmVjdG9yeTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFuaWZlc3Q6IEFzc2V0TWFuaWZlc3RTY2hlbWEsXG4gICkge1xuICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhIHN1YnNldCBvZiBhc3NldHMgYW5kIGRlc3RpbmF0aW9ucyBmcm9tIHRoaXMgbWFuaWZlc3QuXG4gICAqXG4gICAqIE9ubHkgYXNzZXRzIHdpdGggYXQgbGVhc3QgMSBzZWxlY3RlZCBkZXN0aW5hdGlvbiBhcmUgcmV0YWluZWQuXG4gICAqXG4gICAqIElmIHNlbGVjdGlvbiBpcyBub3QgZ2l2ZW4sIGV2ZXJ5dGhpbmcgaXMgcmV0dXJuZWQuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0KHNlbGVjdGlvbj86IERlc3RpbmF0aW9uUGF0dGVybltdKTogQXNzZXRNYW5pZmVzdCB7XG4gICAgaWYgKHNlbGVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBjb25zdCByZXQ6IEFzc2V0TWFuaWZlc3RTY2hlbWEgJiBSZXF1aXJlZDxQaWNrPEFzc2V0TWFuaWZlc3RTY2hlbWEsIEFzc2V0VHlwZT4+ID0ge1xuICAgICAgdmVyc2lvbjogdGhpcy5tYW5pZmVzdC52ZXJzaW9uLFxuICAgICAgZG9ja2VySW1hZ2VzOiB7fSxcbiAgICAgIGZpbGVzOiB7fSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBhc3NldFR5cGUgb2YgQVNTRVRfVFlQRVMpIHtcbiAgICAgIGZvciAoY29uc3QgW2Fzc2V0SWQsIGFzc2V0XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm1hbmlmZXN0W2Fzc2V0VHlwZV0gfHwge30pKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRGVzdGluYXRpb25zID0gZmlsdGVyRGljdChhc3NldC5kZXN0aW5hdGlvbnMsIChfLCBkZXN0SWQpID0+XG4gICAgICAgICAgc2VsZWN0aW9uLnNvbWUoKHNlbCkgPT4gc2VsLm1hdGNoZXMobmV3IERlc3RpbmF0aW9uSWRlbnRpZmllcihhc3NldElkLCBkZXN0SWQpKSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGZpbHRlcmVkRGVzdGluYXRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0W2Fzc2V0VHlwZV1bYXNzZXRJZF0gPSB7XG4gICAgICAgICAgICAuLi5hc3NldCxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uczogZmlsdGVyZWREZXN0aW5hdGlvbnMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXNzZXRNYW5pZmVzdCh0aGlzLmRpcmVjdG9yeSwgcmV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNjcmliZSB0aGUgYXNzZXQgbWFuaWZlc3QgYXMgYSBsaXN0IG9mIHN0cmluZ3NcbiAgICovXG4gIHB1YmxpYyBsaXN0KCkge1xuICAgIHJldHVybiBbXG4gICAgICAuLi5kZXNjcmliZUFzc2V0cygnZmlsZScsIHRoaXMubWFuaWZlc3QuZmlsZXMgfHwge30pLFxuICAgICAgLi4uZGVzY3JpYmVBc3NldHMoJ2RvY2tlci1pbWFnZScsIHRoaXMubWFuaWZlc3QuZG9ja2VySW1hZ2VzIHx8IHt9KSxcbiAgICBdO1xuXG4gICAgZnVuY3Rpb24gZGVzY3JpYmVBc3NldHMoXG4gICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICBhc3NldHM6IFJlY29yZDxzdHJpbmcsIHsgc291cmNlOiBhbnk7IGRlc3RpbmF0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiB9PixcbiAgICApIHtcbiAgICAgIGNvbnN0IHJldCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IFthc3NldElkLCBhc3NldF0gb2YgT2JqZWN0LmVudHJpZXMoYXNzZXRzIHx8IHt9KSkge1xuICAgICAgICByZXQucHVzaChgJHthc3NldElkfSAke3R5cGV9ICR7SlNPTi5zdHJpbmdpZnkoYXNzZXQuc291cmNlKX1gKTtcblxuICAgICAgICBjb25zdCBkZXN0U3RyaW5ncyA9IE9iamVjdC5lbnRyaWVzKGFzc2V0LmRlc3RpbmF0aW9ucykubWFwKFxuICAgICAgICAgIChbZGVzdElkLCBkZXN0XSkgPT4gYCAke2Fzc2V0SWR9OiR7ZGVzdElkfSAke0pTT04uc3RyaW5naWZ5KGRlc3QpfWAsXG4gICAgICAgICk7XG4gICAgICAgIHJldC5wdXNoKC4uLnByZWZpeFRyZWVDaGFycyhkZXN0U3RyaW5ncywgJyAgJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBvZiBhc3NldHMgcGVyIGRlc3RpbmF0aW9uXG4gICAqXG4gICAqIFJldHVybnMgb25lIGFzc2V0IGZvciBldmVyeSBwdWJsaXNoYWJsZSBkZXN0aW5hdGlvbi4gTXVsdGlwbGUgYXNzZXRcbiAgICogZGVzdGluYXRpb25zIG1heSBzaGFyZSB0aGUgc2FtZSBhc3NldCBzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVudHJpZXMoKTogSU1hbmlmZXN0RW50cnlbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLm1ha2VFbnRyaWVzKHRoaXMubWFuaWZlc3QuZmlsZXMgfHwge30sIEZpbGVNYW5pZmVzdEVudHJ5KSxcbiAgICAgIC4uLm1ha2VFbnRyaWVzKHRoaXMubWFuaWZlc3QuZG9ja2VySW1hZ2VzIHx8IHt9LCBEb2NrZXJJbWFnZU1hbmlmZXN0RW50cnkpLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBvZiBmaWxlIGFzc2V0cywgc3BsYXQgb3V0IHRvIGRlc3RpbmF0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldCBmaWxlcygpOiBGaWxlTWFuaWZlc3RFbnRyeVtdIHtcbiAgICByZXR1cm4gbWFrZUVudHJpZXModGhpcy5tYW5pZmVzdC5maWxlcyB8fCB7fSwgRmlsZU1hbmlmZXN0RW50cnkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VFbnRyaWVzPEEsIEIsIEM+KFxuICBhc3NldHM6IFJlY29yZDxzdHJpbmcsIHsgc291cmNlOiBBOyBkaXNwbGF5TmFtZT86IHN0cmluZzsgZGVzdGluYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCPiB9PixcbiAgY3RvcjogbmV3IChpZDogRGVzdGluYXRpb25JZGVudGlmaWVyLCBkaXNwbGF5TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzb3VyY2U6IEEsIGRlc3RpbmF0aW9uOiBCKSA9PiBDLFxuKTogQ1tdIHtcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PEM+KCk7XG4gIGZvciAoY29uc3QgW2Fzc2V0SWQsIGFzc2V0XSBvZiBPYmplY3QuZW50cmllcyhhc3NldHMpKSB7XG4gICAgZm9yIChjb25zdCBbZGVzdElkLCBkZXN0aW5hdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoYXNzZXQuZGVzdGluYXRpb25zKSkge1xuICAgICAgcmV0LnB1c2gobmV3IGN0b3IobmV3IERlc3RpbmF0aW9uSWRlbnRpZmllcihhc3NldElkLCBkZXN0SWQpLCBhc3NldC5kaXNwbGF5TmFtZSwgYXNzZXQuc291cmNlLCBkZXN0aW5hdGlvbikpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG50eXBlIEFzc2V0VHlwZSA9ICdmaWxlcycgfCAnZG9ja2VySW1hZ2VzJztcblxuY29uc3QgQVNTRVRfVFlQRVM6IEFzc2V0VHlwZVtdID0gWydmaWxlcycsICdkb2NrZXJJbWFnZXMnXTtcblxuLyoqXG4gKiBBIHNpbmdsZSBhc3NldCBmcm9tIGFuIGFzc2V0IG1hbmlmZXN0J1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElNYW5pZmVzdEVudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NldCBhbmQgaXRzIGRlc3RpbmF0aW9uXG4gICAqL1xuICByZWFkb25seSBpZDogRGVzdGluYXRpb25JZGVudGlmaWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBhc3NldFxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUeXBlLWRlcGVuZGVudCBzb3VyY2UgZGF0YVxuICAgKi9cbiAgcmVhZG9ubHkgZ2VuZXJpY1NvdXJjZTogdW5rbm93bjtcblxuICAvKipcbiAgICogVHlwZS1kZXBlbmRlbnQgZGVzdGluYXRpb24gZGF0YVxuICAgKi9cbiAgcmVhZG9ubHkgZ2VuZXJpY0Rlc3RpbmF0aW9uOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBkaXNwbGF5IG5hbWUgZm9yIHRoaXMgYXNzZXRcbiAgICpcbiAgICogVGhlIGBpbmNsdWRlRGVzdGluYXRpb25gIHBhcmFtZXRlciBjb250cm9scyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZVxuICAgKiBkZXN0aW5hdGlvbiBJRCBpbiB0aGUgZGlzcGxheSBuYW1lLlxuICAgKlxuICAgKiAtIFBhc3MgYGZhbHNlYCBpZiB5b3UgYXJlIGRpc3BsYXlpbmcgbm90aWZpY2F0aW9ucyBhYm91dCBidWlsZGluZyB0aGVcbiAgICogICBhc3NldCwgb3IgaWYgeW91IGFyZSBkZXNjcmliaW5nIHRoZSB3b3JrIG9mIGJ1aWxkaW5nIHRoZSBhc3NldCBhbmQgcHVibGlzaGluZ1xuICAgKiAgIHRvIGFsbCBkZXN0aW5hdGlvbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAgICogLSBQYXNzIGB0cnVlYCBpZiB5b3UgYXJlIGRpc3BsYXlpbmcgbm90aWZpY2F0aW9ucyBhYm91dCBwdWJsaXNoaW5nIHRvIGFcbiAgICogICBzcGVjaWZpYyBkZXN0aW5hdGlvbi5cbiAgICovXG4gIGRpc3BsYXlOYW1lKGluY2x1ZGVEZXN0aW5hdGlvbjogYm9vbGVhbik6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIG1hbmlmZXN0IGVudHJ5IGZvciBhIGZpbGUgYXNzZXRcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVNYW5pZmVzdEVudHJ5IGltcGxlbWVudHMgSU1hbmlmZXN0RW50cnkge1xuICBwdWJsaWMgcmVhZG9ubHkgZ2VuZXJpY1NvdXJjZTogdW5rbm93bjtcbiAgcHVibGljIHJlYWRvbmx5IGdlbmVyaWNEZXN0aW5hdGlvbjogdW5rbm93bjtcbiAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSAnZmlsZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLyoqIElkZW50aWZpZXIgZm9yIHRoaXMgYXNzZXQgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IERlc3RpbmF0aW9uSWRlbnRpZmllcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kaXNwbGF5TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIC8qKiBTb3VyY2Ugb2YgdGhlIGZpbGUgYXNzZXQgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc291cmNlOiBGaWxlU291cmNlLFxuICAgIC8qKiBEZXN0aW5hdGlvbiBmb3IgdGhlIGZpbGUgYXNzZXQgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzdGluYXRpb246IEZpbGVEZXN0aW5hdGlvbixcbiAgKSB7XG4gICAgdGhpcy5nZW5lcmljU291cmNlID0gc291cmNlO1xuICAgIHRoaXMuZ2VuZXJpY0Rlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XG4gIH1cblxuICBwdWJsaWMgZGlzcGxheU5hbWUoaW5jbHVkZURlc3RpbmF0aW9uOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBpZiAoaW5jbHVkZURlc3RpbmF0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGlzcGxheU5hbWUgPyBgJHt0aGlzLl9kaXNwbGF5TmFtZX0gKCR7dGhpcy5pZC5kZXN0aW5hdGlvbklkfSlgIDogYCR7dGhpcy5pZH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGlzcGxheU5hbWUgPyB0aGlzLl9kaXNwbGF5TmFtZSA6IHRoaXMuaWQuYXNzZXRJZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIG1hbmlmZXN0IGVudHJ5IGZvciBhIGRvY2tlciBpbWFnZSBhc3NldFxuICovXG5leHBvcnQgY2xhc3MgRG9ja2VySW1hZ2VNYW5pZmVzdEVudHJ5IGltcGxlbWVudHMgSU1hbmlmZXN0RW50cnkge1xuICBwdWJsaWMgcmVhZG9ubHkgZ2VuZXJpY1NvdXJjZTogdW5rbm93bjtcbiAgcHVibGljIHJlYWRvbmx5IGdlbmVyaWNEZXN0aW5hdGlvbjogdW5rbm93bjtcbiAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSAnZG9ja2VyLWltYWdlJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAvKiogSWRlbnRpZmllciBmb3IgdGhpcyBhc3NldCAqL1xuICAgIHB1YmxpYyByZWFkb25seSBpZDogRGVzdGluYXRpb25JZGVudGlmaWVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Rpc3BsYXlOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgLyoqIFNvdXJjZSBvZiB0aGUgZmlsZSBhc3NldCAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzb3VyY2U6IERvY2tlckltYWdlU291cmNlLFxuICAgIC8qKiBEZXN0aW5hdGlvbiBmb3IgdGhlIGZpbGUgYXNzZXQgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzdGluYXRpb246IERvY2tlckltYWdlRGVzdGluYXRpb24sXG4gICkge1xuICAgIHRoaXMuZ2VuZXJpY1NvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLmdlbmVyaWNEZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuICB9XG5cbiAgcHVibGljIGRpc3BsYXlOYW1lKGluY2x1ZGVEZXN0aW5hdGlvbjogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgaWYgKGluY2x1ZGVEZXN0aW5hdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlOYW1lID8gYCR7dGhpcy5fZGlzcGxheU5hbWV9ICgke3RoaXMuaWQuZGVzdGluYXRpb25JZH0pYCA6IGAke3RoaXMuaWR9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlOYW1lID8gdGhpcy5fZGlzcGxheU5hbWUgOiB0aGlzLmlkLmFzc2V0SWQ7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSWRlbnRpZnkgYW4gYXNzZXQgZGVzdGluYXRpb24gaW4gYW4gYXNzZXQgbWFuaWZlc3RcbiAqXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaWRlbnRpZnkgYm90aCBhbiBhc3NldCB0byBiZSBidWlsdCBhcyB3ZWxsIGFzIGFcbiAqIGRlc3RpbmF0aW9uIHdoZXJlIGFuIGFzc2V0IHdpbGwgYmUgcHVibGlzaGVkLiBIb3dldmVyLCB3aGVuIHJlYXNvbmluZyBhYm91dFxuICogYnVpbGRpbmcgYXNzZXRzIHRoZSBkZXN0aW5hdGlvbiBwYXJ0IGNhbiBiZSBpZ25vcmVkLCBiZWNhdXNlIHRoZSBzYW1lIGFzc2V0XG4gKiBiZWluZyBzZW50IHRvIG11bHRpcGxlIGRlc3RpbmF0aW9ucyB3aWxsIG9ubHkgbmVlZCB0byBiZSBidWlsdCBvbmNlIGFuZCB0aGVpclxuICogYXNzZXRJZHMgYXJlIGFsbCB0aGUgc2FtZS5cbiAqXG4gKiBXaGVuIHN0cmluZ2lmaWVkLCB0aGlzIHdpbGwgYmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvblxuICogSURzOyBpZiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc291cmNlIGlzIG5lY2Vzc2FyeSwgdXNlIGBpZC5hc3NldElkYFxuICogaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlc3RpbmF0aW9uSWRlbnRpZmllciB7XG4gIC8qKlxuICAgKiBJZGVudGlmaWVzIHRoZSBhc3NldCwgYnkgc291cmNlLlxuICAgKlxuICAgKiBUaGUgYXNzZXRJZCB3aWxsIGJlIHRoZSBzYW1lIGJldHdlZW4gYXNzZXRzIHRoYXQgcmVwcmVzZW50XG4gICAqIHRoZSBzYW1lIHBoeXNpY2FsIGZpbGUgb3IgaW1hZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXNzZXRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSB0aGlzIGFzc2V0IHdpbGwgYmUgcHVibGlzaGVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzdGluYXRpb25JZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGFzc2V0SWQ6IHN0cmluZywgZGVzdGluYXRpb25JZDogc3RyaW5nKSB7XG4gICAgdGhpcy5hc3NldElkID0gYXNzZXRJZDtcbiAgICB0aGlzLmRlc3RpbmF0aW9uSWQgPSBkZXN0aW5hdGlvbklkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBhc3NldCBpZGVudGlmaWVyXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVzdGluYXRpb25JZCA/IGAke3RoaXMuYXNzZXRJZH06JHt0aGlzLmRlc3RpbmF0aW9uSWR9YCA6IHRoaXMuYXNzZXRJZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaWx0ZXJEaWN0PEE+KFxuICB4czogUmVjb3JkPHN0cmluZywgQT4sXG4gIHByZWQ6ICh4OiBBLCBrZXk6IHN0cmluZykgPT4gYm9vbGVhbixcbik6IFJlY29yZDxzdHJpbmcsIEE+IHtcbiAgY29uc3QgcmV0OiBSZWNvcmQ8c3RyaW5nLCBBPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh4cykpIHtcbiAgICBpZiAocHJlZCh2YWx1ZSwga2V5KSkge1xuICAgICAgcmV0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBBIGZpbHRlciBwYXR0ZXJuIGZvciBhbiBkZXN0aW5hdGlvbiBpZGVudGlmaWVyXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXN0aW5hdGlvblBhdHRlcm4ge1xuICAvKipcbiAgICogUGFyc2UgYSAnOictc2VwYXJhdGVkIHN0cmluZyBpbnRvIGFuIGFzc2V0L2Rlc3RpbmF0aW9uIGlkZW50aWZpZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcGFyc2Uoczogc3RyaW5nKSB7XG4gICAgaWYgKCFzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VtcHR5IHN0cmluZyBpcyBub3QgYSB2YWxpZCBkZXN0aW5hdGlvbiBpZGVudGlmaWVyJyk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnRzID0gcy5zcGxpdCgnOicpLm1hcCgoeCkgPT4gKHggIT09ICcqJyA/IHggOiB1bmRlZmluZWQpKTtcbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gbmV3IERlc3RpbmF0aW9uUGF0dGVybihwYXJ0c1swXSk7XG4gICAgfVxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHJldHVybiBuZXcgRGVzdGluYXRpb25QYXR0ZXJuKHBhcnRzWzBdIHx8IHVuZGVmaW5lZCwgcGFydHNbMV0gfHwgdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBc3NldCBpZGVudGlmaWVyIG11c3QgY29udGFpbiBhdCBtb3N0IDIgJzonLXNlcGFyYXRlZCBwYXJ0cywgZ290ICcke3N9J2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXMgdGhlIGFzc2V0LCBieSBzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXNzZXRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogSWRlbnRpZmllcyB0aGUgZGVzdGluYXRpb24gd2hlcmUgdGhpcyBhc3NldCB3aWxsIGJlIHB1Ymxpc2hlZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlc3RpbmF0aW9uSWQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoYXNzZXRJZD86IHN0cmluZywgZGVzdGluYXRpb25JZD86IHN0cmluZykge1xuICAgIHRoaXMuYXNzZXRJZCA9IGFzc2V0SWQ7XG4gICAgdGhpcy5kZXN0aW5hdGlvbklkID0gZGVzdGluYXRpb25JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGlzIHBhdHRlcm4gbWF0Y2hlcyB0aGUgZ2l2ZW4gaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIG1hdGNoZXMoaWQ6IERlc3RpbmF0aW9uSWRlbnRpZmllcikge1xuICAgIHJldHVybiAoXG4gICAgICAodGhpcy5hc3NldElkID09PSB1bmRlZmluZWQgfHwgdGhpcy5hc3NldElkID09PSBpZC5hc3NldElkKSAmJlxuICAgICAgKHRoaXMuZGVzdGluYXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuZGVzdGluYXRpb25JZCA9PT0gaWQuZGVzdGluYXRpb25JZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBhc3NldCBpZGVudGlmaWVyXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuYXNzZXRJZCA/PyAnKid9OiR7dGhpcy5kZXN0aW5hdGlvbklkID8/ICcqJ31gO1xuICB9XG59XG5cbi8qKlxuICogUHJlZml4IGJveC1kcmF3aW5nIGNoYXJhY3RlcnMgdG8gbWFrZSBsaW5lcyBsb29rIGxpa2UgYSBoYW5naW5nIHRyZWVcbiAqL1xuZnVuY3Rpb24gcHJlZml4VHJlZUNoYXJzKHhzOiBzdHJpbmdbXSwgcHJlZml4ID0gJycpIHtcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGlzTGFzdCA9IGkgPT09IHhzLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgYm94Q2hhciA9IGlzTGFzdCA/ICfilJQnIDogJ+KUnCc7XG4gICAgcmV0LnB1c2goYCR7cHJlZml4fSR7Ym94Q2hhcn0ke3hzW2ldfWApO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG4iXX0=