@nlabs/reaktor 1.6.1 → 1.6.3

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/README.md CHANGED
@@ -177,6 +177,21 @@ export ARANGODB_PASSWORD="mypassword"
177
177
 
178
178
  The configuration is environment-aware and supports `local`, `development`, `test`, and `production` environments. The active environment is determined by the `NODE_ENV` or `stage` environment variable.
179
179
 
180
+ #### Anonymous RUM Configuration
181
+
182
+ The public `rum.track` mutation sanitizes GothamJS journey events and sends them to Amazon CloudWatch RUM with `PutRumEvents`. Reaktor does not persist RUM events in ArangoDB.
183
+
184
+ - `AWS_REGION` - AWS region containing the CloudWatch RUM app monitors.
185
+ - `AWS_RUM_APP_MONITORS` - JSON object mapping each public application ID to its CloudWatch RUM app-monitor UUID. Values may also be objects with `id`, `name`, `version`, `domain`, and optional resource-policy `alias` fields.
186
+
187
+ The Lambda or server role must allow `rum:PutRumEvents` for the configured app monitors. The same mapping can be supplied programmatically at `aws.rum.appMonitors` using `Config.set()`.
188
+
189
+ Each event includes its sanitized public `appId` in the event details and as the `applicationId` metadata attribute so CloudWatch RUM filters, Logs Insights, and custom dashboards can filter shared-monitor data. Use a separate app monitor per application when AWS-native metrics and access boundaries must remain isolated.
190
+
191
+ When supplied as event properties, Reaktor promotes `browserName`, `browserVersion`, `browserLanguage`, `pageId`/`pageID`, `parentPageId`/`parentPage`, `interaction`, `deviceType`, `osName`, and `osVersion` into canonical AWS RUM metadata fields.
192
+
193
+ Reaktor does not send authentication state, cookies, IP addresses, user agents, referrers, form values, common identity fields, or client-supplied geolocation. AWS can enrich accepted RUM events with coarse location metadata such as country, subdivision, and locality. Journey IDs remain memory-only in the browser and reset when the application runtime restarts.
194
+
180
195
  #### Programmatic Configuration
181
196
 
182
197
  You can also override configuration programmatically using the `Config.set()` method:
@@ -2,7 +2,30 @@ import { ApiContext } from '../types/auth.types.js';
2
2
  import { FileType } from '../types/files.types.js';
3
3
  import { ImageType } from '../types/images.types.js';
4
4
  export declare const GIPHY_URL = "http://api.giphy.com/v1/gifs";
5
- export declare const getYouTube: () => import("googleapis").youtube_v3.Youtube;
5
+ export declare const YOUTUBE_URL = "https://www.googleapis.com/youtube/v3";
6
+ interface YouTubeListResponse {
7
+ readonly items?: Array<{
8
+ readonly id?: string | {
9
+ readonly videoId?: string;
10
+ };
11
+ readonly snippet?: {
12
+ readonly thumbnails?: {
13
+ readonly high?: {
14
+ readonly url?: string;
15
+ };
16
+ };
17
+ };
18
+ }>;
19
+ }
20
+ type YouTubeListCallback = (error?: Error, data?: YouTubeListResponse) => void;
21
+ export declare const getYouTube: () => {
22
+ search: {
23
+ list: (options: Readonly<Record<string, string | number | readonly string[]>>, callback: YouTubeListCallback) => void;
24
+ };
25
+ videos: {
26
+ list: (options: Readonly<Record<string, string | number | readonly string[]>>, callback: YouTubeListCallback) => void;
27
+ };
28
+ };
6
29
  export declare const insertFile: (context: ApiContext, file: FileType) => Promise<FileType>;
7
30
  export declare const upsertFile: (context: ApiContext, file: FileType) => Promise<FileType>;
8
31
  export declare const uploadFile: (context: any, file: FileType, buffer: Buffer) => Promise<FileType>;
@@ -17,3 +40,4 @@ export declare const linkFiles: (context: ApiContext, postDocId: string, files:
17
40
  export declare const updateFiles: (context: ApiContext, postDocId: string, files: FileType[]) => Promise<any>;
18
41
  export declare const encodeBase64: (buffer: Buffer) => string;
19
42
  export declare const decodeBase64: (dataString: string) => any;
43
+ export {};
@@ -4,7 +4,6 @@
4
4
  */ import { get as httpGet } from '@nlabs/rip-hunter';
5
5
  import { createHash } from '@nlabs/utils/parsers/strings';
6
6
  import { aql } from 'arangojs';
7
- import { google } from 'googleapis';
8
7
  import { parseFile } from '../adapters/fileAdapter.js';
9
8
  import { Config } from '../config.js';
10
9
  import { ErrorTypes } from '../types/error.types.js';
@@ -15,9 +14,22 @@ import { resizeAndSaveImage } from './images.js';
15
14
  import { createPostEdge } from './posts.js';
16
15
  const eventCategory = 'files';
17
16
  export const GIPHY_URL = 'http://api.giphy.com/v1/gifs';
18
- export const getYouTube = ()=>google.youtube({
19
- auth: Config.get('google.key'),
20
- version: 'v3'
17
+ export const YOUTUBE_URL = 'https://www.googleapis.com/youtube/v3';
18
+ const createYouTubeList = (resource)=>(options, callback)=>{
19
+ const url = new URL(`${YOUTUBE_URL}/${resource}`);
20
+ url.searchParams.set('key', Config.get('google.key'));
21
+ for (const [key, value] of Object.entries(options)){
22
+ url.searchParams.set(key, Array.isArray(value) ? value.join(',') : String(value));
23
+ }
24
+ void httpGet(url.toString()).then((response)=>response.json()).then((data)=>callback(undefined, data)).catch((error)=>callback(error));
25
+ };
26
+ export const getYouTube = ()=>({
27
+ search: {
28
+ list: createYouTubeList('search')
29
+ },
30
+ videos: {
31
+ list: createYouTubeList('videos')
32
+ }
21
33
  });
22
34
  export const insertFile = (context, file)=>{
23
35
  const formattedFile = parseFile(file);
@@ -153,12 +165,15 @@ export const getYouTubeSearch = (query, limit = 30)=>{
153
165
  reject(new Error(ErrorTypes.YOUTUBE_ERROR));
154
166
  } else if (data) {
155
167
  const { items } = data;
156
- const list = items.map((item)=>({
157
- id: item.id,
168
+ const list = items.map((item)=>{
169
+ const id = typeof item.id === 'string' ? item.id : item.id?.videoId;
170
+ return {
171
+ id,
158
172
  thumb: item.snippet.thumbnails.high.url,
159
173
  type: 'youtube',
160
- url: `http://www.youtube.com/embed/${item.id}`
161
- }));
174
+ url: `http://www.youtube.com/embed/${id}`
175
+ };
176
+ });
162
177
  resolve(list);
163
178
  }
164
179
  });
@@ -213,4 +228,4 @@ export const decodeBase64 = (dataString)=>{
213
228
  };
214
229
  };
215
230
 
216
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvZmlsZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7Z2V0IGFzIGh0dHBHZXR9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcbmltcG9ydCB7Y3JlYXRlSGFzaH0gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvc3RyaW5ncyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB7Z29vZ2xlfSBmcm9tICdnb29nbGVhcGlzJztcblxuaW1wb3J0IHtwYXJzZUZpbGV9IGZyb20gJy4uL2FkYXB0ZXJzL2ZpbGVBZGFwdGVyLmpzJztcbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3IudHlwZXMuanMnO1xuaW1wb3J0IHtGaWxlVHlwZX0gZnJvbSAnLi4vdHlwZXMvZmlsZXMudHlwZXMuanMnO1xuaW1wb3J0IHtJbWFnZVR5cGV9IGZyb20gJy4uL3R5cGVzL2ltYWdlcy50eXBlcy5qcyc7XG5pbXBvcnQge2xvZ0Vycm9yfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3NVdGlscy5qcyc7XG5pbXBvcnQge3VzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7YWRkSXRlbX0gZnJvbSAnLi9jcnVkLmpzJztcbmltcG9ydCB7cmVzaXplQW5kU2F2ZUltYWdlfSBmcm9tICcuL2ltYWdlcy5qcyc7XG5pbXBvcnQge2NyZWF0ZVBvc3RFZGdlfSBmcm9tICcuL3Bvc3RzLmpzJztcblxuaW1wb3J0IHR5cGUge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9ucyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAnZmlsZXMnO1xuXG5leHBvcnQgY29uc3QgR0lQSFlfVVJMID0gJ2h0dHA6Ly9hcGkuZ2lwaHkuY29tL3YxL2dpZnMnO1xuXG5leHBvcnQgY29uc3QgZ2V0WW91VHViZSA9ICgpID0+IGdvb2dsZS55b3V0dWJlKHthdXRoOiBDb25maWcuZ2V0KCdnb29nbGUua2V5JyksIHZlcnNpb246ICd2Myd9KTtcblxuZXhwb3J0IGNvbnN0IGluc2VydEZpbGUgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZmlsZTogRmlsZVR5cGUpID0+IHtcbiAgY29uc3QgZm9ybWF0dGVkRmlsZSA9IHBhcnNlRmlsZShmaWxlKTtcbiAgcmV0dXJuIGFkZEl0ZW08RmlsZVR5cGU+KGNvbnRleHQsICdmaWxlcycsIGZvcm1hdHRlZEZpbGUpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwc2VydEZpbGUgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZmlsZTogRmlsZVR5cGUpOiBQcm9taXNlPEZpbGVUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICd1cHNlcnRGaWxlJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXR0ZWRGaWxlID0gcGFyc2VGaWxlKGZpbGUpO1xuICBjb25zdCB7ZmlsZUlkfSA9IGZvcm1hdHRlZEZpbGU7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IGluc2VydDogYW55ID0ge1xuICAgIC4uLmZvcm1hdHRlZEZpbGUsXG4gICAgX2tleTogZmlsZUlkLFxuICAgIGFkZGVkOiBub3csXG4gICAgbW9kaWZpZWQ6IG5vd1xuICB9O1xuICBjb25zdCB1cGRhdGU6IGFueSA9IHtcbiAgICAuLi5mb3JtYXR0ZWRGaWxlLFxuICAgIF9rZXk6IGZpbGVJZCxcbiAgICBtb2RpZmllZDogbm93XG4gIH07XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUFNFUlQge19rZXk6ICR7ZmlsZUlkfX1cbiAgICBJTlNFUlQgJHtpbnNlcnR9XG4gICAgVVBEQVRFICR7dXBkYXRlfVxuICAgIElOIGZpbGVzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1cGRhdGVkRmlsZTogRmlsZVR5cGUpID0+IHVwZGF0ZWRGaWxlKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGxvYWRGaWxlID0gKGNvbnRleHQsIGZpbGU6IEZpbGVUeXBlLCBidWZmZXI6IEJ1ZmZlcikgPT4ge1xuICBjb25zdCB7c2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXR0ZWRGaWxlID0gcGFyc2VGaWxlKGZpbGUpO1xuICBjb25zdCB7XG4gICAgZGVzY3JpcHRpb24sXG4gICAgZmlsZUlkLFxuICAgIGZpbGVUeXBlLFxuICAgIG5hbWUsXG4gICAgdXJsXG4gIH0gPSBmb3JtYXR0ZWRGaWxlO1xuICBjb25zdCBmb3JtYXRGaWxlSWQgPSBmaWxlSWQgfHwgY3JlYXRlSGFzaChgZmlsZS0ke3Nlc3Npb25JZH1gKTtcbiAgbGV0IHVwZGF0ZWROYW1lID0gbmFtZTtcblxuICBpZighdXBkYXRlZE5hbWUgJiYgISF1cmwpIHtcbiAgICB1cGRhdGVkTmFtZSA9IHVybC5zdWJzdHJpbmcodXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbiAgfVxuXG4gIGlmKGZpbGVUeXBlID09PSAnaW1hZ2UvanBlZycgfHwgZmlsZVR5cGUgPT09ICdpbWFnZS9wbmcnKSB7XG4gICAgcmV0dXJuIHJlc2l6ZUFuZFNhdmVJbWFnZShjb250ZXh0LCBmb3JtYXRGaWxlSWQsIGJ1ZmZlciwgZmlsZVR5cGUpXG4gICAgICAudGhlbigocmVzaXplZEltYWdlOiBGaWxlVHlwZSkgPT4gaW5zZXJ0RmlsZShjb250ZXh0LCB7XG4gICAgICAgIC4uLnJlc2l6ZWRJbWFnZSxcbiAgICAgICAgX2tleTogZm9ybWF0RmlsZUlkLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgbmFtZTogdXBkYXRlZE5hbWUsXG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICB9KSk7XG4gIH1cblxuICByZXR1cm4gaW5zZXJ0RmlsZShjb250ZXh0LCB7XG4gICAgLi4uZm9ybWF0dGVkRmlsZSxcbiAgICB1c2VySWQ6IHNlc3Npb25JZFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRGaWxlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGZpbGU6IEZpbGVUeXBlKTogUHJvbWlzZTxGaWxlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkRmlsZSc7XG4gIGNvbnN0IHtiYXNlNjQsIHVybH0gPSBmaWxlO1xuXG4gIGlmKCEhdXJsKSB7XG4gICAgcmV0dXJuIGh0dHBHZXQodXJsKVxuICAgICAgLnRoZW4oKGJvZHkpID0+IHVwbG9hZEZpbGUoY29udGV4dCwgZmlsZSwgQnVmZmVyLmZyb20oYm9keSwgJ2JpbmFyeScpKSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkZJTEVfUkVRVUVTVFxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgfSBlbHNlIGlmKCEhYmFzZTY0KSB7XG4gICAgY29uc3QgYnVmZmVyOiBCdWZmZXIgPSBCdWZmZXIuZnJvbShiYXNlNjQpO1xuICAgIHJldHVybiB1cGxvYWRGaWxlKGNvbnRleHQsIGZpbGUsIGJ1ZmZlcik7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKEVycm9yVHlwZXMuRklMRV9SRVFVSVJFRCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlR2lwaHlJdGVtID0gKGdpZkltYWdlOiBhbnkpOiBJbWFnZVR5cGUgPT4ge1xuICBjb25zdCB7XG4gICAgaWQsXG4gICAgaW1hZ2VzOiB7XG4gICAgICBvcmlnaW5hbDoge3VybCA9ICcnfSA9IHt9LFxuICAgICAgZml4ZWRfaGVpZ2h0X3NtYWxsOiB7dXJsOiB0aHVtYiA9ICcnfSA9IHt9XG4gICAgfSA9IHt9XG4gIH0gPSBnaWZJbWFnZTtcblxuICBpZighaWQgfHwgIXVybCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpZCxcbiAgICB0aHVtYixcbiAgICB0eXBlOiAnZ2lwaHknLFxuICAgIHVybFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdpcGh5VHJlbmRzID0gKGxpbWl0OiBudW1iZXIgPSAzMCk6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgZ2lmVXJsID0gYCR7R0lQSFlfVVJMfS90cmVuZGluZz9hcGlfa2V5PSR7Q29uZmlnLmdldCgnZ2lwaHkua2V5Jyl9JmxpbWl0PSR7bGltaXR9YDtcblxuICByZXR1cm4gaHR0cEdldChnaWZVcmwpXG4gICAgLnRoZW4oKHJlczogUmVzcG9uc2UpID0+IHJlcy5qc29uKCkpXG4gICAgLnRoZW4oKGpzb246IGFueSkgPT4ganNvbj8uZGF0YT8ubWFwKHBhcnNlR2lwaHlJdGVtKS5maWx0ZXIoKGl0ZW0pID0+ICEhaXRlbSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdpcGh5U2VhcmNoID0gKHF1ZXJ5OiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAzMCk6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgZm9ybWF0UXVlcnkgPSBlbmNvZGVVUkkocXVlcnkpO1xuICBjb25zdCBnaWZVcmwgPSBgJHtHSVBIWV9VUkx9L3NlYXJjaD9xPSR7Zm9ybWF0UXVlcnl9JmFwaV9rZXk9JHtDb25maWcuZ2V0KCdnaXBoeS5rZXknKX0mbGltaXQ9JHtsaW1pdH1gO1xuXG4gIHJldHVybiBodHRwR2V0KGdpZlVybClcbiAgICAudGhlbigocmVzOiBSZXNwb25zZSkgPT4gcmVzLmpzb24oKSlcbiAgICAudGhlbigoanNvbjogYW55KSA9PiBqc29uPy5kYXRhPy5tYXAocGFyc2VHaXBoeUl0ZW0pLmZpbHRlcigoaXRlbSkgPT4gISFpdGVtKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0WW91VHViZVRyZW5kcyA9IChsaW1pdDogbnVtYmVyID0gMzApOiBQcm9taXNlPGFueVtdPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbiA9ICdnZXRZb3VUdWJlVHJlbmRzJztcbiAgY29uc3QgeW91dHViZSA9IGdldFlvdVR1YmUoKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHlvdXR1YmUudmlkZW9zLmxpc3Qoe1xuICAgICAgY2hhcnQ6ICdtb3N0UG9wdWxhcicsXG4gICAgICBtYXhSZXN1bHRzOiBsaW1pdCxcbiAgICAgIHBhcnQ6IFsnc25pcHBldCddLFxuICAgICAgcmVnaW9uQ29kZTogJ1VTJ1xuICAgIH0sIChlcnJvcjogRXJyb3IsIGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoRXJyb3JUeXBlcy5ZT1VUVUJFX0VSUk9SKSk7XG4gICAgICB9IGVsc2UgaWYoZGF0YSkge1xuICAgICAgICBjb25zdCBsaXN0ID0gZGF0YS5pdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgdGh1bWI6IGl0ZW0uc25pcHBldC50aHVtYm5haWxzLmhpZ2gudXJsLFxuICAgICAgICAgIHR5cGU6ICd5b3V0dWJlJyxcbiAgICAgICAgICB1cmw6IGBodHRwOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyR7aXRlbS5pZH1gXG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXNvbHZlKGxpc3QpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRZb3VUdWJlU2VhcmNoID0gKHF1ZXJ5OiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAzMCk6IFByb21pc2U8YW55W10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uID0gJ2dldFlvdVR1YmVTZWFyY2gnO1xuICBjb25zdCB5b3V0dWJlID0gZ2V0WW91VHViZSgpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgeW91dHViZS5zZWFyY2gubGlzdCh7XG4gICAgICBtYXhSZXN1bHRzOiBsaW1pdCxcbiAgICAgIHBhcnQ6IFsnc25pcHBldCddLFxuICAgICAgcTogcXVlcnksXG4gICAgICByZWdpb25Db2RlOiAnVVMnXG4gICAgfSwgKGVycm9yOiBFcnJvciwgZGF0YTogYW55KSA9PiB7XG4gICAgICBpZihlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihFcnJvclR5cGVzLllPVVRVQkVfRVJST1IpKTtcbiAgICAgIH0gZWxzZSBpZihkYXRhKSB7XG4gICAgICAgIGNvbnN0IHtpdGVtc30gPSBkYXRhO1xuICAgICAgICBjb25zdCBsaXN0ID0gaXRlbXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgIGlkOiBpdGVtLmlkLFxuICAgICAgICAgIHRodW1iOiBpdGVtLnNuaXBwZXQudGh1bWJuYWlscy5oaWdoLnVybCxcbiAgICAgICAgICB0eXBlOiAneW91dHViZScsXG4gICAgICAgICAgdXJsOiBgaHR0cDovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke2l0ZW0uaWR9YFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgcmVzb2x2ZShsaXN0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UGF0aFVzZXJGaWxlcyA9ICh1c2VySWQ6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiBgdXNlcnMvJHt1c2VySWR9L2ZpbGVzLyR7ZmlsZW5hbWV9YDtcblxuZXhwb3J0IGNvbnN0IGxpbmtGaWxlcyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBwb3N0RG9jSWQ6IHN0cmluZywgZmlsZXM6IEZpbGVUeXBlW10pOiBQcm9taXNlPGFueT4gPT5cbiAgUHJvbWlzZS5hbGwoXG4gICAgZmlsZXMubWFwKChmaWxlOiBGaWxlVHlwZSkgPT4gdXBzZXJ0RmlsZShjb250ZXh0LCBmaWxlKVxuICAgICAgLnRoZW4oKGZpbGU6IEZpbGVUeXBlKSA9PiBjcmVhdGVQb3N0RWRnZShjb250ZXh0LCBwb3N0RG9jSWQsIGZpbGUuaWQsICdpc1Bvc3RlZCcsIHt0eXBlOiBmaWxlLmZpbGVUeXBlfSkpKVxuICApO1xuXG5leHBvcnQgY29uc3QgdXBkYXRlRmlsZXMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgcG9zdERvY0lkOiBzdHJpbmcsIGZpbGVzOiBGaWxlVHlwZVtdKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3VwZGF0ZUZpbGVzJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbjogRWRnZUNvbGxlY3Rpb24gPSB1c2VEYihkYXRhYmFzZU5hbWUpLmNvbGxlY3Rpb24oJ2lzUG9zdGVkJyk7XG5cbiAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLmluRWRnZXMocG9zdERvY0lkLCB7fSlcbiAgICAudGhlbigoZWRnZXM6IGFueSkgPT4ge1xuICAgICAgaWYoZWRnZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICBlZGdlcy5tYXAoKGVkZ2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtfa2V5OiBlZGdlS2V5fSA9IGVkZ2U7XG4gICAgICAgICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFJFTU9WRSB7X2tleToke2VkZ2VLZXl9fSBJTiBpc1Bvc3RlZGA7XG5cbiAgICAgICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYoZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBsaW5rRmlsZXMoY29udGV4dCwgcG9zdERvY0lkLCBmaWxlcykudGhlbigoKSA9PiBmaWxlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZihmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGxpbmtGaWxlcyhjb250ZXh0LCBwb3N0RG9jSWQsIGZpbGVzKVxuICAgICAgICAgIC50aGVuKCgpID0+IGZpbGVzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGVuY29kZUJhc2U2NCA9IChidWZmZXI6IEJ1ZmZlcik6IHN0cmluZyA9PiBCdWZmZXIuZnJvbShidWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuZXhwb3J0IGNvbnN0IGRlY29kZUJhc2U2NCA9IChkYXRhU3RyaW5nOiBzdHJpbmcpOiBhbnkgPT4ge1xuICAvLyBjb25zdCBhY3Rpb24gPSAnZGVjb2RlQmFzZTY0JztcbiAgY29uc3QgZ2V0RGF0YSA9IChzdHI6IHN0cmluZykgPT4gc3RyLm1hdGNoKC9eZGF0YTooW0EtWmEtei0rL10rKTtiYXNlNjQsKC4rKSQvKSB8fCBbXTtcbiAgbGV0IG1hdGNoZXMgPSBnZXREYXRhKGRhdGFTdHJpbmcpO1xuXG4gIGlmKG1hdGNoZXMubGVuZ3RoICE9PSAzKSB7XG4gICAgbWF0Y2hlcyA9IGdldERhdGEoZGVjb2RlVVJJQ29tcG9uZW50KGRhdGFTdHJpbmcpKTtcblxuICAgIGlmKG1hdGNoZXMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBFcnJvcihFcnJvclR5cGVzLklOVkFMSURfSU5QVVQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZGF0YTogQnVmZmVyLmZyb20obWF0Y2hlc1syXSwgJ2Jhc2U2NCcpLFxuICAgIHR5cGU6IG1hdGNoZXNbMV1cbiAgfTtcbn07XG4iXSwibmFtZXMiOlsiZ2V0IiwiaHR0cEdldCIsImNyZWF0ZUhhc2giLCJhcWwiLCJnb29nbGUiLCJwYXJzZUZpbGUiLCJDb25maWciLCJFcnJvclR5cGVzIiwibG9nRXJyb3IiLCJ1c2VEYiIsImFkZEl0ZW0iLCJyZXNpemVBbmRTYXZlSW1hZ2UiLCJjcmVhdGVQb3N0RWRnZSIsImV2ZW50Q2F0ZWdvcnkiLCJHSVBIWV9VUkwiLCJnZXRZb3VUdWJlIiwieW91dHViZSIsImF1dGgiLCJ2ZXJzaW9uIiwiaW5zZXJ0RmlsZSIsImNvbnRleHQiLCJmaWxlIiwiZm9ybWF0dGVkRmlsZSIsInVwc2VydEZpbGUiLCJhY3Rpb24iLCJkYXRhYmFzZU5hbWUiLCJmaWxlSWQiLCJub3ciLCJEYXRlIiwiaW5zZXJ0IiwiX2tleSIsImFkZGVkIiwibW9kaWZpZWQiLCJ1cGRhdGUiLCJhcWxRcnkiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJuZXh0IiwidXBkYXRlZEZpbGUiLCJjYXRjaCIsImVycm9yIiwiY2F0ZWdvcnkiLCJsYWJlbCIsIkRBVEFCQVNFX0VSUk9SIiwidXBsb2FkRmlsZSIsImJ1ZmZlciIsInNlc3Npb24iLCJ1c2VySWQiLCJzZXNzaW9uSWQiLCJkZXNjcmlwdGlvbiIsImZpbGVUeXBlIiwibmFtZSIsInVybCIsImZvcm1hdEZpbGVJZCIsInVwZGF0ZWROYW1lIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJyZXNpemVkSW1hZ2UiLCJhZGRGaWxlIiwiYmFzZTY0IiwiYm9keSIsIkJ1ZmZlciIsImZyb20iLCJGSUxFX1JFUVVFU1QiLCJQcm9taXNlIiwicmVqZWN0IiwiRXJyb3IiLCJGSUxFX1JFUVVJUkVEIiwicGFyc2VHaXBoeUl0ZW0iLCJnaWZJbWFnZSIsImlkIiwiaW1hZ2VzIiwib3JpZ2luYWwiLCJmaXhlZF9oZWlnaHRfc21hbGwiLCJ0aHVtYiIsInR5cGUiLCJnZXRHaXBoeVRyZW5kcyIsImxpbWl0IiwiZ2lmVXJsIiwicmVzIiwianNvbiIsImRhdGEiLCJtYXAiLCJmaWx0ZXIiLCJpdGVtIiwiZ2V0R2lwaHlTZWFyY2giLCJmb3JtYXRRdWVyeSIsImVuY29kZVVSSSIsImdldFlvdVR1YmVUcmVuZHMiLCJyZXNvbHZlIiwidmlkZW9zIiwibGlzdCIsImNoYXJ0IiwibWF4UmVzdWx0cyIsInBhcnQiLCJyZWdpb25Db2RlIiwiY29uc29sZSIsIllPVVRVQkVfRVJST1IiLCJpdGVtcyIsInNuaXBwZXQiLCJ0aHVtYm5haWxzIiwiaGlnaCIsImdldFlvdVR1YmVTZWFyY2giLCJzZWFyY2giLCJxIiwiZ2V0UGF0aFVzZXJGaWxlcyIsImZpbGVuYW1lIiwibGlua0ZpbGVzIiwicG9zdERvY0lkIiwiZmlsZXMiLCJhbGwiLCJ1cGRhdGVGaWxlcyIsImVkZ2VDb2xsZWN0aW9uIiwiY29sbGVjdGlvbiIsImluRWRnZXMiLCJlZGdlcyIsImxlbmd0aCIsImVkZ2UiLCJlZGdlS2V5IiwiZW5jb2RlQmFzZTY0IiwidG9TdHJpbmciLCJkZWNvZGVCYXNlNjQiLCJkYXRhU3RyaW5nIiwiZ2V0RGF0YSIsInN0ciIsIm1hdGNoIiwibWF0Y2hlcyIsImRlY29kZVVSSUNvbXBvbmVudCIsIklOVkFMSURfSU5QVVQiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLE9BQU9DLE9BQU8sUUFBTyxvQkFBb0I7QUFDakQsU0FBUUMsVUFBVSxRQUFPLCtCQUErQjtBQUN4RCxTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUU3QixTQUFRQyxNQUFNLFFBQU8sYUFBYTtBQUVsQyxTQUFRQyxTQUFTLFFBQU8sNkJBQTZCO0FBQ3JELFNBQVFDLE1BQU0sUUFBTyxlQUFlO0FBRXBDLFNBQVFDLFVBQVUsUUFBTywwQkFBMEI7QUFHbkQsU0FBUUMsUUFBUSxRQUFPLDZCQUE2QjtBQUNwRCxTQUFRQyxLQUFLLFFBQU8sNEJBQTRCO0FBQ2hELFNBQVFDLE9BQU8sUUFBTyxZQUFZO0FBQ2xDLFNBQVFDLGtCQUFrQixRQUFPLGNBQWM7QUFDL0MsU0FBUUMsY0FBYyxRQUFPLGFBQWE7QUFJMUMsTUFBTUMsZ0JBQWdCO0FBRXRCLE9BQU8sTUFBTUMsWUFBWSwrQkFBK0I7QUFFeEQsT0FBTyxNQUFNQyxhQUFhLElBQU1YLE9BQU9ZLE9BQU8sQ0FBQztRQUFDQyxNQUFNWCxPQUFPTixHQUFHLENBQUM7UUFBZWtCLFNBQVM7SUFBSSxHQUFHO0FBRWhHLE9BQU8sTUFBTUMsYUFBYSxDQUFDQyxTQUFxQkM7SUFDOUMsTUFBTUMsZ0JBQWdCakIsVUFBVWdCO0lBQ2hDLE9BQU9YLFFBQWtCVSxTQUFTLFNBQVNFO0FBQzdDLEVBQUU7QUFFRixPQUFPLE1BQU1DLGFBQWEs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
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvZmlsZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7Z2V0IGFzIGh0dHBHZXR9IGZyb20gJ0BubGFicy9yaXAtaHVudGVyJztcbmltcG9ydCB7Y3JlYXRlSGFzaH0gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvc3RyaW5ncyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcblxuaW1wb3J0IHtwYXJzZUZpbGV9IGZyb20gJy4uL2FkYXB0ZXJzL2ZpbGVBZGFwdGVyLmpzJztcbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3IudHlwZXMuanMnO1xuaW1wb3J0IHtGaWxlVHlwZX0gZnJvbSAnLi4vdHlwZXMvZmlsZXMudHlwZXMuanMnO1xuaW1wb3J0IHtJbWFnZVR5cGV9IGZyb20gJy4uL3R5cGVzL2ltYWdlcy50eXBlcy5qcyc7XG5pbXBvcnQge2xvZ0Vycm9yfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3NVdGlscy5qcyc7XG5pbXBvcnQge3VzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7YWRkSXRlbX0gZnJvbSAnLi9jcnVkLmpzJztcbmltcG9ydCB7cmVzaXplQW5kU2F2ZUltYWdlfSBmcm9tICcuL2ltYWdlcy5qcyc7XG5pbXBvcnQge2NyZWF0ZVBvc3RFZGdlfSBmcm9tICcuL3Bvc3RzLmpzJztcblxuaW1wb3J0IHR5cGUge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9ucyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAnZmlsZXMnO1xuXG5leHBvcnQgY29uc3QgR0lQSFlfVVJMID0gJ2h0dHA6Ly9hcGkuZ2lwaHkuY29tL3YxL2dpZnMnO1xuZXhwb3J0IGNvbnN0IFlPVVRVQkVfVVJMID0gJ2h0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL3lvdXR1YmUvdjMnO1xuXG5pbnRlcmZhY2UgWW91VHViZUxpc3RSZXNwb25zZSB7XG4gIHJlYWRvbmx5IGl0ZW1zPzogQXJyYXk8e1xuICAgIHJlYWRvbmx5IGlkPzogc3RyaW5nIHwge3JlYWRvbmx5IHZpZGVvSWQ/OiBzdHJpbmd9O1xuICAgIHJlYWRvbmx5IHNuaXBwZXQ/OiB7cmVhZG9ubHkgdGh1bWJuYWlscz86IHtyZWFkb25seSBoaWdoPzoge3JlYWRvbmx5IHVybD86IHN0cmluZ319fTtcbiAgfT47XG59XG5cbnR5cGUgWW91VHViZUxpc3RDYWxsYmFjayA9IChlcnJvcj86IEVycm9yLCBkYXRhPzogWW91VHViZUxpc3RSZXNwb25zZSkgPT4gdm9pZDtcblxuY29uc3QgY3JlYXRlWW91VHViZUxpc3QgPSAocmVzb3VyY2U6ICdzZWFyY2gnIHwgJ3ZpZGVvcycpID0+IChcbiAgb3B0aW9uczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgcmVhZG9ubHkgc3RyaW5nW10+PixcbiAgY2FsbGJhY2s6IFlvdVR1YmVMaXN0Q2FsbGJhY2tcbik6IHZvaWQgPT4ge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKGAke1lPVVRVQkVfVVJMfS8ke3Jlc291cmNlfWApO1xuICB1cmwuc2VhcmNoUGFyYW1zLnNldCgna2V5JywgQ29uZmlnLmdldCgnZ29vZ2xlLmtleScpKTtcblxuICBmb3IoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpKSB7XG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmpvaW4oJywnKSA6IFN0cmluZyh2YWx1ZSkpO1xuICB9XG5cbiAgdm9pZCBodHRwR2V0KHVybC50b1N0cmluZygpKVxuICAgIC50aGVuKChyZXNwb25zZTogUmVzcG9uc2UpID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAudGhlbigoZGF0YTogWW91VHViZUxpc3RSZXNwb25zZSkgPT4gY2FsbGJhY2sodW5kZWZpbmVkLCBkYXRhKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gY2FsbGJhY2soZXJyb3IpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRZb3VUdWJlID0gKCkgPT4gKHtcbiAgc2VhcmNoOiB7bGlzdDogY3JlYXRlWW91VHViZUxpc3QoJ3NlYXJjaCcpfSxcbiAgdmlkZW9zOiB7bGlzdDogY3JlYXRlWW91VHViZUxpc3QoJ3ZpZGVvcycpfVxufSk7XG5cbmV4cG9ydCBjb25zdCBpbnNlcnRGaWxlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGZpbGU6IEZpbGVUeXBlKSA9PiB7XG4gIGNvbnN0IGZvcm1hdHRlZEZpbGUgPSBwYXJzZUZpbGUoZmlsZSk7XG4gIHJldHVybiBhZGRJdGVtPEZpbGVUeXBlPihjb250ZXh0LCAnZmlsZXMnLCBmb3JtYXR0ZWRGaWxlKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cHNlcnRGaWxlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGZpbGU6IEZpbGVUeXBlKTogUHJvbWlzZTxGaWxlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBzZXJ0RmlsZSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0dGVkRmlsZSA9IHBhcnNlRmlsZShmaWxlKTtcbiAgY29uc3Qge2ZpbGVJZH0gPSBmb3JtYXR0ZWRGaWxlO1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBpbnNlcnQ6IGFueSA9IHtcbiAgICAuLi5mb3JtYXR0ZWRGaWxlLFxuICAgIF9rZXk6IGZpbGVJZCxcbiAgICBhZGRlZDogbm93LFxuICAgIG1vZGlmaWVkOiBub3dcbiAgfTtcbiAgY29uc3QgdXBkYXRlOiBhbnkgPSB7XG4gICAgLi4uZm9ybWF0dGVkRmlsZSxcbiAgICBfa2V5OiBmaWxlSWQsXG4gICAgbW9kaWZpZWQ6IG5vd1xuICB9O1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke2ZpbGVJZH19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiBmaWxlcyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodXBkYXRlZEZpbGU6IEZpbGVUeXBlKSA9PiB1cGRhdGVkRmlsZSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBsb2FkRmlsZSA9IChjb250ZXh0LCBmaWxlOiBGaWxlVHlwZSwgYnVmZmVyOiBCdWZmZXIpID0+IHtcbiAgY29uc3Qge3Nlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0dGVkRmlsZSA9IHBhcnNlRmlsZShmaWxlKTtcbiAgY29uc3Qge1xuICAgIGRlc2NyaXB0aW9uLFxuICAgIGZpbGVJZCxcbiAgICBmaWxlVHlwZSxcbiAgICBuYW1lLFxuICAgIHVybFxuICB9ID0gZm9ybWF0dGVkRmlsZTtcbiAgY29uc3QgZm9ybWF0RmlsZUlkID0gZmlsZUlkIHx8IGNyZWF0ZUhhc2goYGZpbGUtJHtzZXNzaW9uSWR9YCk7XG4gIGxldCB1cGRhdGVkTmFtZSA9IG5hbWU7XG5cbiAgaWYoIXVwZGF0ZWROYW1lICYmICEhdXJsKSB7XG4gICAgdXBkYXRlZE5hbWUgPSB1cmwuc3Vic3RyaW5nKHVybC5sYXN0SW5kZXhPZignLycpICsgMSk7XG4gIH1cblxuICBpZihmaWxlVHlwZSA9PT0gJ2ltYWdlL2pwZWcnIHx8IGZpbGVUeXBlID09PSAnaW1hZ2UvcG5nJykge1xuICAgIHJldHVybiByZXNpemVBbmRTYXZlSW1hZ2UoY29udGV4dCwgZm9ybWF0RmlsZUlkLCBidWZmZXIsIGZpbGVUeXBlKVxuICAgICAgLnRoZW4oKHJlc2l6ZWRJbWFnZTogRmlsZVR5cGUpID0+IGluc2VydEZpbGUoY29udGV4dCwge1xuICAgICAgICAuLi5yZXNpemVkSW1hZ2UsXG4gICAgICAgIF9rZXk6IGZvcm1hdEZpbGVJZCxcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIG5hbWU6IHVwZGF0ZWROYW1lLFxuICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIGluc2VydEZpbGUoY29udGV4dCwge1xuICAgIC4uLmZvcm1hdHRlZEZpbGUsXG4gICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkRmlsZSA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBmaWxlOiBGaWxlVHlwZSk6IFByb21pc2U8RmlsZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZEZpbGUnO1xuICBjb25zdCB7YmFzZTY0LCB1cmx9ID0gZmlsZTtcblxuICBpZighIXVybCkge1xuICAgIHJldHVybiBodHRwR2V0KHVybClcbiAgICAgIC50aGVuKChib2R5KSA9PiB1cGxvYWRGaWxlKGNvbnRleHQsIGZpbGUsIEJ1ZmZlci5mcm9tKGJvZHksICdiaW5hcnknKSkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5GSUxFX1JFUVVFU1RcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gIH0gZWxzZSBpZighIWJhc2U2NCkge1xuICAgIGNvbnN0IGJ1ZmZlcjogQnVmZmVyID0gQnVmZmVyLmZyb20oYmFzZTY0KTtcbiAgICByZXR1cm4gdXBsb2FkRmlsZShjb250ZXh0LCBmaWxlLCBidWZmZXIpO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihFcnJvclR5cGVzLkZJTEVfUkVRVUlSRUQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBwYXJzZUdpcGh5SXRlbSA9IChnaWZJbWFnZTogYW55KTogSW1hZ2VUeXBlID0+IHtcbiAgY29uc3Qge1xuICAgIGlkLFxuICAgIGltYWdlczoge1xuICAgICAgb3JpZ2luYWw6IHt1cmwgPSAnJ30gPSB7fSxcbiAgICAgIGZpeGVkX2hlaWdodF9zbWFsbDoge3VybDogdGh1bWIgPSAnJ30gPSB7fVxuICAgIH0gPSB7fVxuICB9ID0gZ2lmSW1hZ2U7XG5cbiAgaWYoIWlkIHx8ICF1cmwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaWQsXG4gICAgdGh1bWIsXG4gICAgdHlwZTogJ2dpcGh5JyxcbiAgICB1cmxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHaXBoeVRyZW5kcyA9IChsaW1pdDogbnVtYmVyID0gMzApOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGdpZlVybCA9IGAke0dJUEhZX1VSTH0vdHJlbmRpbmc/YXBpX2tleT0ke0NvbmZpZy5nZXQoJ2dpcGh5LmtleScpfSZsaW1pdD0ke2xpbWl0fWA7XG5cbiAgcmV0dXJuIGh0dHBHZXQoZ2lmVXJsKVxuICAgIC50aGVuKChyZXM6IFJlc3BvbnNlKSA9PiByZXMuanNvbigpKVxuICAgIC50aGVuKChqc29uOiBhbnkpID0+IGpzb24/LmRhdGE/Lm1hcChwYXJzZUdpcGh5SXRlbSkuZmlsdGVyKChpdGVtKSA9PiAhIWl0ZW0pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHaXBoeVNlYXJjaCA9IChxdWVyeTogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMzApOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGZvcm1hdFF1ZXJ5ID0gZW5jb2RlVVJJKHF1ZXJ5KTtcbiAgY29uc3QgZ2lmVXJsID0gYCR7R0lQSFlfVVJMfS9zZWFyY2g/cT0ke2Zvcm1hdFF1ZXJ5fSZhcGlfa2V5PSR7Q29uZmlnLmdldCgnZ2lwaHkua2V5Jyl9JmxpbWl0PSR7bGltaXR9YDtcblxuICByZXR1cm4gaHR0cEdldChnaWZVcmwpXG4gICAgLnRoZW4oKHJlczogUmVzcG9uc2UpID0+IHJlcy5qc29uKCkpXG4gICAgLnRoZW4oKGpzb246IGFueSkgPT4ganNvbj8uZGF0YT8ubWFwKHBhcnNlR2lwaHlJdGVtKS5maWx0ZXIoKGl0ZW0pID0+ICEhaXRlbSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFlvdVR1YmVUcmVuZHMgPSAobGltaXQ6IG51bWJlciA9IDMwKTogUHJvbWlzZTxhbnlbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb24gPSAnZ2V0WW91VHViZVRyZW5kcyc7XG4gIGNvbnN0IHlvdXR1YmUgPSBnZXRZb3VUdWJlKCk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB5b3V0dWJlLnZpZGVvcy5saXN0KHtcbiAgICAgIGNoYXJ0OiAnbW9zdFBvcHVsYXInLFxuICAgICAgbWF4UmVzdWx0czogbGltaXQsXG4gICAgICBwYXJ0OiBbJ3NuaXBwZXQnXSxcbiAgICAgIHJlZ2lvbkNvZGU6ICdVUydcbiAgICB9LCAoZXJyb3I6IEVycm9yLCBkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKEVycm9yVHlwZXMuWU9VVFVCRV9FUlJPUikpO1xuICAgICAgfSBlbHNlIGlmKGRhdGEpIHtcbiAgICAgICAgY29uc3QgbGlzdCA9IGRhdGEuaXRlbXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgIGlkOiBpdGVtLmlkLFxuICAgICAgICAgIHRodW1iOiBpdGVtLnNuaXBwZXQudGh1bWJuYWlscy5oaWdoLnVybCxcbiAgICAgICAgICB0eXBlOiAneW91dHViZScsXG4gICAgICAgICAgdXJsOiBgaHR0cDovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke2l0ZW0uaWR9YFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgcmVzb2x2ZShsaXN0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0WW91VHViZVNlYXJjaCA9IChxdWVyeTogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMzApOiBQcm9taXNlPGFueVtdPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbiA9ICdnZXRZb3VUdWJlU2VhcmNoJztcbiAgY29uc3QgeW91dHViZSA9IGdldFlvdVR1YmUoKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHlvdXR1YmUuc2VhcmNoLmxpc3Qoe1xuICAgICAgbWF4UmVzdWx0czogbGltaXQsXG4gICAgICBwYXJ0OiBbJ3NuaXBwZXQnXSxcbiAgICAgIHE6IHF1ZXJ5LFxuICAgICAgcmVnaW9uQ29kZTogJ1VTJ1xuICAgIH0sIChlcnJvcjogRXJyb3IsIGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoRXJyb3JUeXBlcy5ZT1VUVUJFX0VSUk9SKSk7XG4gICAgICB9IGVsc2UgaWYoZGF0YSkge1xuICAgICAgICBjb25zdCB7aXRlbXN9ID0gZGF0YTtcbiAgICAgICAgY29uc3QgbGlzdCA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gdHlwZW9mIGl0ZW0uaWQgPT09ICdzdHJpbmcnID8gaXRlbS5pZCA6IGl0ZW0uaWQ/LnZpZGVvSWQ7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgdGh1bWI6IGl0ZW0uc25pcHBldC50aHVtYm5haWxzLmhpZ2gudXJsLFxuICAgICAgICAgICAgdHlwZTogJ3lvdXR1YmUnLFxuICAgICAgICAgICAgdXJsOiBgaHR0cDovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke2lkfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICByZXNvbHZlKGxpc3QpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQYXRoVXNlckZpbGVzID0gKHVzZXJJZDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nID0+IGB1c2Vycy8ke3VzZXJJZH0vZmlsZXMvJHtmaWxlbmFtZX1gO1xuXG5leHBvcnQgY29uc3QgbGlua0ZpbGVzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3REb2NJZDogc3RyaW5nLCBmaWxlczogRmlsZVR5cGVbXSk6IFByb21pc2U8YW55PiA9PlxuICBQcm9taXNlLmFsbChcbiAgICBmaWxlcy5tYXAoKGZpbGU6IEZpbGVUeXBlKSA9PiB1cHNlcnRGaWxlKGNvbnRleHQsIGZpbGUpXG4gICAgICAudGhlbigoZmlsZTogRmlsZVR5cGUpID0+IGNyZWF0ZVBvc3RFZGdlKGNvbnRleHQsIHBvc3REb2NJZCwgZmlsZS5pZCwgJ2lzUG9zdGVkJywge3R5cGU6IGZpbGUuZmlsZVR5cGV9KSkpXG4gICk7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVGaWxlcyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBwb3N0RG9jSWQ6IHN0cmluZywgZmlsZXM6IEZpbGVUeXBlW10pOiBQcm9taXNlPGFueT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlRmlsZXMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGVkZ2VDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbignaXNQb3N0ZWQnKTtcblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uaW5FZGdlcyhwb3N0RG9jSWQsIHt9KVxuICAgIC50aGVuKChlZGdlczogYW55KSA9PiB7XG4gICAgICBpZihlZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgIGVkZ2VzLm1hcCgoZWRnZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge19rZXk6IGVkZ2VLZXl9ID0gZWRnZTtcbiAgICAgICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgUkVNT1ZFIHtfa2V5OiR7ZWRnZUtleX19IElOIGlzUG9zdGVkYDtcblxuICAgICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSlcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpZihmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGxpbmtGaWxlcyhjb250ZXh0LCBwb3N0RG9jSWQsIGZpbGVzKS50aGVuKCgpID0+IGZpbGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmKGZpbGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbGlua0ZpbGVzKGNvbnRleHQsIHBvc3REb2NJZCwgZmlsZXMpXG4gICAgICAgICAgLnRoZW4oKCkgPT4gZmlsZXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsZXM7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZW5jb2RlQmFzZTY0ID0gKGJ1ZmZlcjogQnVmZmVyKTogc3RyaW5nID0+IEJ1ZmZlci5mcm9tKGJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG5leHBvcnQgY29uc3QgZGVjb2RlQmFzZTY0ID0gKGRhdGFTdHJpbmc6IHN0cmluZyk6IGFueSA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbiA9ICdkZWNvZGVCYXNlNjQnO1xuICBjb25zdCBnZXREYXRhID0gKHN0cjogc3RyaW5nKSA9PiBzdHIubWF0Y2goL15kYXRhOihbQS1aYS16LSsvXSspO2Jhc2U2NCwoLispJC8pIHx8IFtdO1xuICBsZXQgbWF0Y2hlcyA9IGdldERhdGEoZGF0YVN0cmluZyk7XG5cbiAgaWYobWF0Y2hlcy5sZW5ndGggIT09IDMpIHtcbiAgICBtYXRjaGVzID0gZ2V0RGF0YShkZWNvZGVVUklDb21wb25lbnQoZGF0YVN0cmluZykpO1xuXG4gICAgaWYobWF0Y2hlcy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IEVycm9yKEVycm9yVHlwZXMuSU5WQUxJRF9JTlBVVCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBCdWZmZXIuZnJvbShtYXRjaGVzWzJdLCAnYmFzZTY0JyksXG4gICAgdHlwZTogbWF0Y2hlc1sxXVxuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJnZXQiLCJodHRwR2V0IiwiY3JlYXRlSGFzaCIsImFxbCIsInBhcnNlRmlsZSIsIkNvbmZpZyIsIkVycm9yVHlwZXMiLCJsb2dFcnJvciIsInVzZURiIiwiYWRkSXRlbSIsInJlc2l6ZUFuZFNhdmVJbWFnZSIsImNyZWF0ZVBvc3RFZGdlIiwiZXZlbnRDYXRlZ29yeSIsIkdJUEhZX1VSTCIsIllPVVRVQkVfVVJMIiwiY3JlYXRlWW91VHViZUxpc3QiLCJyZXNvdXJjZSIsIm9wdGlvbnMiLCJjYWxsYmFjayIsInVybCIsIlVSTCIsInNlYXJjaFBhcmFtcyIsInNldCIsImtleSIsInZhbHVlIiwiT2JqZWN0IiwiZW50cmllcyIsIkFycmF5IiwiaXNBcnJheSIsImpvaW4iLCJTdHJpbmciLCJ0b1N0cmluZyIsInRoZW4iLCJyZXNwb25zZSIsImpzb24iLCJkYXRhIiwidW5kZWZpbmVkIiwiY2F0Y2giLCJlcnJvciIsImdldFlvdVR1YmUiLCJzZWFyY2giLCJsaXN0IiwidmlkZW9zIiwiaW5zZXJ0RmlsZSIsImNvbnRleHQiLCJmaWxlIiwiZm9ybWF0dGVkRmlsZSIsInVwc2VydEZpbGUiLCJhY3Rpb24iLCJkYXRhYmFzZU5hbWUiLCJmaWxlSWQiLCJub3ciLCJEYXRlIiwiaW5zZXJ0IiwiX2tleSIsImFkZGVkIiwibW9kaWZpZWQiLCJ1cGRhdGUiLCJhcWxRcnkiLCJxdWVyeSIsImN1cnNvciIsIm5leHQiLCJ1cGRhdGVkRmlsZSIsImNhdGVnb3J5IiwibGFiZWwiLCJEQVRBQkFTRV9FUlJPUiIsInVwbG9hZEZpbGUiLCJidWZmZXIiLCJzZXNzaW9uIiwidXNlcklkIiwic2Vzc2lvbklkIiwiZGVzY3JpcHRpb24iLCJmaWxlVHlwZSIsIm5hbWUiLCJmb3JtYXRGaWxlSWQiLCJ1cGRhdGVkTmFtZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwicmVzaXplZEltYWdlIiwiYWRkRmlsZSIsImJhc2U2NCIsImJvZHkiLCJCdWZmZXIiLCJmcm9tIiwiRklMRV9SRVFVRVNUIiwiUHJvbWlzZSIsInJlamVjdCIsIkVycm9yIiwiRklMRV9SRVFVSVJFRCIsInBhcnNlR2lwaHlJdGVtIiwiZ2lmSW1hZ2UiLCJpZCIsImltYWdlcyIsIm9yaWdpbmFsIiwiZml4ZWRfaGVpZ2h0X3NtYWxsIiwidGh1bWIiLCJ0eXBlIiwiZ2V0R2lwaHlUcmVuZHMiLCJsaW1pdCIsImdpZlVybCIsInJlcyIsIm1hcCIsImZpbHRlciIsIml0ZW0iLCJnZXRHaXBoeVNlYXJjaCIsImZvcm1hdFF1ZXJ5IiwiZW5jb2RlVVJJIiwiZ2V0WW91VHViZVRyZW5kcyIsInlvdXR1YmUiLCJyZXNvbHZlIiwiY2hhcnQiLCJtYXhSZXN1bHRzIiwicGFydCIsInJlZ2lvbkNvZGUiLCJjb25zb2xlIiwiWU9VVFVCRV9FUlJPUiIsIml0ZW1zIiwic25pcHBldCIsInRodW1ibmFpbHMiLCJoaWdoIiwiZ2V0WW91VHViZVNlYXJjaCIsInEiLCJ2aWRlb0lkIiwiZ2V0UGF0aFVzZXJGaWxlcyIsImZpbGVuYW1lIiwibGlua0ZpbGVzIiwicG9zdERvY0lkIiwiZmlsZXMiLCJhbGwiLCJ1cGRhdGVGaWxlcyIsImVkZ2VDb2xsZWN0aW9uIiwiY29sbGVjdGlvbiIsImluRWRnZXMiLCJlZGdlcyIsImxlbmd0aCIsImVkZ2UiLCJlZGdlS2V5IiwiZW5jb2RlQmFzZTY0IiwiZGVjb2RlQmFzZTY0IiwiZGF0YVN0cmluZyIsImdldERhdGEiLCJzdHIiLCJtYXRjaCIsIm1hdGNoZXMiLCJkZWNvZGVVUklDb21wb25lbnQiLCJJTlZBTElEX0lOUFVUIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxPQUFPQyxPQUFPLFFBQU8sb0JBQW9CO0FBQ2pELFNBQVFDLFVBQVUsUUFBTywrQkFBK0I7QUFDeEQsU0FBUUMsR0FBRyxRQUFPLFdBQVc7QUFHN0IsU0FBUUMsU0FBUyxRQUFPLDZCQUE2QjtBQUNyRCxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQUVwQyxTQUFRQyxVQUFVLFFBQU8sMEJBQTBCO0FBR25ELFNBQVFDLFFBQVEsUUFBTyw2QkFBNkI7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